cse583: programming languages david notkin 15 february 2000 david notkin 15

125
CSE583: Programming CSE583: Programming Languages Languages David Notkin 15 February 2000 [email protected] http://www.cs.washington.edu/education/courses/583

Upload: merilyn-matthews

Post on 18-Jan-2018

218 views

Category:

Documents


0 download

DESCRIPTION

University of Washington CSE583 D. Notkin © NoteNote l Many of the following slides were taken (and in some cases adapted), with permission, from Greg Badros

TRANSCRIPT

Page 1: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

CSE583: Programming CSE583: Programming LanguagesLanguages

David Notkin15 February [email protected]

http://www.cs.washington.edu/education/courses/583

Page 2: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 2

Two weeks: logic and constraint Two weeks: logic and constraint logic programming paradigmslogic programming paradigms Use logic and theorem proving as the

underlying computational model From a set of axioms and rules, a program

executes by trying to prove a given hypothesis

In constraint logic programming, more information is provided about the domain, which can increase the efficiency of the programs significantly

Page 3: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 3

NoteNote

Many of the following slides were taken (and in some cases adapted), with permission, from Greg Badros

Page 4: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 4

(Symbolic) Logic(Symbolic) Logic

Logic goes back to the Greeks, providing a basis for rational reasoning

Aristotle’s logic was based in natural language, which led to ambiguity

Philosophers over the years have cast logic symbolically

Page 5: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 5

Logic basicsLogic basics

There are a set of terms intended to represent facts or properties of the real world– r it rained in Seattle yesterday– w Schell is a wuss– p CSE583 in Winter 2000 is taught on Tuesday

evenings– x P = NP

For most logics, these terms are either true or false

Page 6: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 6

ConnectivesConnectives

These logical terms can be combined in well-defined ways

These define rules for combining logical formulae

Truth tables define the connectives

p q (and) p q (inclusive or) p (negation) p q (implication) …

p T Fp F T

p T F T Fq T F F Tp q T T F T

Page 7: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 7

QuantifiersQuantifiers

Some logics have various quantifiers as well x • x > 0 x • x > 0– Temporal logics include

• AG (always globally), EF (there exists a path), AX (always in the next step), …

Page 8: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 8

FormulaeFormulae

Formulae written in terms of the connectives can be checked using truth tables

p p p (p q) p q …

p T Fp p T F

p T F T Fq T F F T(p q) F T T Tp q F T T T

Page 9: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 9

This is not a connective It doesn’t define a new logical

relationship (like p q) but rather it relates two logical statements

In particular, it states that both statements are logically equivalent– That is, they have the same truth table

Page 10: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 10

Predicate logic and EnglishPredicate logic and English

If A then B A BA only if B A BA if and only if B A B B AA iff B A B B A

“She lives in Seattle only if she lives in Washington State.”

Page 11: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 11

TheoremsTheorems

Anything you can prove from your terms and rules is a theorem in the logic– Remember (and I’ll say

it again) the interpretation of the terms is not part of the logic per se

– The logic and theorem proving is strictly symbolic manipulation

r it rained in Seattle yesterday

w Schell is a wuss p CSE583 in Winter

2000 is taught on Tuesday evenings

x P = NP

p r ? w p ? p w ?

Page 12: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 12

Tautologies and contradictionsTautologies and contradictions

Tautologies are logical statements that are always true– p p T– T p T

Contradictions are logical statements that are always false– p p F– F p F

Page 13: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 13

But...But...

…what if it’s not a tautology? How do we prove it? The most common way is to use a

deduction rule called modus ponens– Prove p q– Then prove p– This in turns proves q

More soon

Page 14: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 14

PrologProlog

To make all this a bit more concrete and to connect it to programming, we’ll look at Prolog– By far the best known and most

influential logic programming language

Page 15: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 15

Prolog deals with relationsProlog deals with relations

?- isSquareOf(9,3). yes?- isSquareOf(9,2). no?- isSquareOf(25,X). X=5;X=-5

?- isSquareOf(X,-3). X=9

The program (called a query) can run in many directions– It’s trying to prove the formula given underlying facts

The query can produce many answers

Page 16: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 16

History of PrologHistory of Prolog

Developed in 1970s by Alan Colmeraur, Robert Kowalski, Phillip Roussel (University of Marseilles, France)

David H. D. Warren provided foundations of modern implementation in the Warren Abstract Machine for DEC PDP-10 (University of Edinburgh)

Prolog is basis for numerous other languages such as CLP(R), Prolog III, etc.

Page 17: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 17

Not for general purpose Not for general purpose programmingprogramming More restricted computation model

of proving assertions from collections of facts and rules

Think of queries working on a database of facts with rules that permit inferring new facts

Query is just a theorem to be proven

Page 18: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 18

Why restrict applicability of a Why restrict applicability of a language?language? Prolog provides better built-in support for

the algorithms and tasks especially useful in search problems– Theorem proving is “just” a search problem

Search problems are incredibly important– Exponential complexity– But efficient techniques and heuristics help

solve practical programs in a timely fashion

Page 19: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 19

Example applicationsExample applications

Medical patient diagnosis Theorem proving Solving Rubik’s cube Type checking

– Type inference in ML and Haskell is done in this way

Database querying …

Page 20: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 20

A Prolog ProgramA Prolog Program

Facts and rules– a database of information, and rules to

infer more facts Queries

– the searches to perform

Page 21: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 21

Example facts and simple queriesExample facts and simple queries

female(karen).male(joseph).male(mark).male(greg).male(eric).person(karen).a_silly_fact.

?- a_silly_fact. yes.?- male(eric). yes.?- female(F). F = karen.?- male(bob). no.?- person(mark). no.

F • female(F)

Page 22: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 22

Syntax for factsSyntax for facts

predicate.predicate(arg1,arg2,...).

Begin with lowercase letter End with a period (.) Numbers and underscores (_) are okay

inside identifiers (also called atoms)

Page 23: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 23

VariablesVariables

Begin with an uppercase letter Either “instantiated” or “uninstantiated” X is instantiated means X stands for a

particular value (similar to binding) Variables instantiations can be undone

– Used to produce multiple answers during search Multiple uses of the same variable in same

scope must refer to same value

Page 24: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 24

Variables are scopedVariables are scopedwithin a querywithin a query

?- person(X), female(X).

X=karen

Read the comma as “and”

These two uses of Xmust represent same value

Page 25: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 25

More factsMore facts/* parent(P,C) means P is a parent of C */parent(karen,greg).parent(joseph,greg).parent(karen,mark).parent(joseph,mark). Interpretation of facts is imposed by the

programmer– Biological parent? Genetic parent? Adoptive parent?

Etc. Make assumptions clear!

Page 26: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 26

A simple ruleA simple rule

mother(M,C) :- parent(M,C), female(M).

So,

M,C•((parent(M,C) female(M)) mother(M,C))

Read “if”

Same Mvariable

Page 27: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 27

ExampleExample

parent(karen,greg).parent(joseph,greg).parent(karen,mark).parent(joseph,mark).female(karen).mother(M,C) :- parent(M,C), female(M).

?-mother(karen,greg).YES?-mother(karen,X).X = greg ;X = mark?-mother(karen,joseph).NO?-mother(joseph,karen).NO

Page 28: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 28

ProvingProving

To answer these kinds of queries, Prolog must search through the facts and the rules in all possible combinations

If Prolog can’t find a proof, then it says that the theorem is false– Closed world assumption– How valid is this assumption?– ?-parent(hillary,chelsea)

Page 29: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 29

Two interpretations of ruleTwo interpretations of rule

Declarative (logic)For a given M and C, M is the mother of C if M is the parent of C and M is female

Procedural (computational)Prove M is mother of C by proving subgoals that M is a parent of C and that M is female

Page 30: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 30

Eight Queens:Eight Queens:A typical search problemA typical search problem Place eight (or n) queens on an n n

chessboard such that none of them are attacking any of the others

Recursive solutions are naturally expressed using backtracking

Solutions in C++, Pascal, Java, etc., are generally around 140–220 lines of uncommented code.

Page 31: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 31

A Solution to Eight QueensA Solution to Eight Queens 1 2 3 4 5 6 7 8

1

2

3

4

5

6

7

8

Page 32: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 32

Eight Queens in PrologEight Queens in Prolog/* From Bratko’s Prolog Progr. for AI, p. 111 */solution([]).solution([X/Y | Others] ) :- solution(Others), member(Y, [1,2,3,4,5,6,7,8] ), noattack( X/Y, Others).

noattack(_, []).noattack(X/Y, [X1/Y1 | Others]) :- Y =\= Y1, Y1-Y =\= X1-X, Y1-Y =\= X-X1, noattack( X/Y, Others).

template([1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8]).

Page 33: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 33

Query for solutionQuery for solution

?- template(S), solution(S).S = [1/4, 2/2, 3/7, 4/3, 5/6, 6/8, 7/5, 8/1]

;S = [1/5, 2/2, 3/4, 4/7, 5/3, 6/8, 7/6, 8/1]

;…

92 solutions in all!

Page 34: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 34

Our friend the listOur friend the list

?- append([1,2,3],[4,5],L). L=[1,2,3,4,5]?- append([1,2],M,[1,2,3]). M=[3]?- append(A,B,[1,2]). A=[], B=[1,2]A=[1], B=[2]A=[1,2], B=[]

append works in multiple directions!

Page 35: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 35

Declaration of append ruleDeclaration of append rule

append([],Ys,Ys).append([X|Xs],Ys,[X|Zs]) :-append(Xs,Ys,Zs).

Think declaratively! Think recursively!

Page 36: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 36

““Return value”Return value”is an argument of the ruleis an argument of the rule/* append(X,Y,Z)

succeeds iff Z is the list that isthe list Y appended to the list X */

Enables it to use any/all of the arguments to compute what’s left

Use uninstantiated variables (i.e., those starting with capital letters) to ask for a return value

Page 37: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 37

TerminologyTerminology

simple term — number, variable, or atome.g., -92 X greg

compound term — atom + parenthesized subtermse.g., parent(joe,greg)

Facts, rules, and queries are made from terms… the functor is the predicate– Not related to ML functors

functor sub-term arguments

Page 38: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 38

ListsLists

[] is the empty list . predicate is like Scheme’s cons:?- A = .(1, .(2, .(3, []))). A=[1, 2, 3]

[…] shorthand syntax:?- A = [1,2,3] A=[1, 2, 3]

[E1...|Tail] notation?- A = [1,2|3]. A=[1, 2|3]?- A = [1,2|[3]]. A=[1, 2, 3]

Page 39: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 39

Lists need not beLists need not behomogeneoushomogeneous?- A = "Hi". A=[72,105]?- A = [1,"Hi",greg]. A=[1,[72,105],greg]?- A = [1,g], B=[A,A]. A=[1,g]B=[[1,g],[1,g]]

?- A = [1,g], B=[A|A]. A=[1,g]B=[[1,g],1,g]

Page 40: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 40

Unification of termsUnification of terms

Similar to ML/Haskell pattern matching

?- p(X,foo) = p(bar,Y). X=bar, Y=foo?- foo = X. X=foo?- X = foo. X=foo?- foo = bar. No

Request to unify

Page 41: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 41

Unification of terms S and TUnification of terms S and T

Terms S and T unify if and only if:– S and T are both constants, and they are the

same object; or– S is uninstantiated. Substitute T for S ; or– T is uninstantiated. Substitute S for T ; or– S and T are structures, have same principal

functor, and the corresponding components unify.

Recursive definition!

Page 42: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 42

More unification examplesMore unification examples

?- A=parent(joe,greg),A=parent(X,Y).X=joe, Y=greg

?- A=parent(joe,greg),A=parent(X). No?- A=people([joe,greg]),A=people(X).X=[joe,greg]

?- A=[1,2,3,4],A=[X,Y|Z]. X=1,Y=2,Z=[3,4]

Page 43: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 43

Unification is implicitUnification is implicitin rule applicationin rule application/* simple rule: X is the same as X. */identity(X,X).

?- identity( p(X,foo), p(bar,Y) ).X=bar, Y=foo

/* could have written the rule as: */identity(X,Y) :- X = Y.

Page 44: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 44

Unification in Unification in appendappend rule ruleappend([],Ys,Ys).append([X|Xs],Ys,[X|Zs]) :-append(Xs,Ys,Zs).

append([1,2,3],A,[1,2,3,4]). results in[X|Xs] = [1,2,3], A=Ys, [X|Zs] = [1,2,3,4]

and thus:X=1, Xs=[2,3], Zs=[2,3,4]

so must prove: append([2,3],A,[2,3,4])

Page 45: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 45

Trace of Trace of app([1,2,3],A,[1,2,3,4])app([1,2,3],A,[1,2,3,4])

T Call:(7) app([1,2,3], _G235, [1,2,3,4])T Call:(8) app([2,3], _G235, [2,3,4])T Call:(9) app([3], _G235, [3,4])T Call:(10) app([], _G235, [4])T Exit:(10) app([], [4], [4])T Exit:(9) app([3], [4], [3,4])T Exit:(8) app([2, ], [4], [2,3,4])T Exit:(7) app([1,2,3], [4], [1,2,3,4])

Page 46: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 46

Trace of Trace of app([1,2,3],[4],Z)app([1,2,3],[4],Z)

T Call: ( 7)app([1,2,3], [4], _G191)T Call: ( 8)app([2,3], [4], _G299)T Call: ( 9)app([3], [4], _G302)T Call: (10)app([], [4], _G305)T Exit: (10)app([], [4], [4])T Exit: ( 9)app([3], [4], [3,4])T Exit: ( 8)app([2,3], [4], [2,3,4])T Exit: ( 7)app([1,2,3], [4], [1,2,3,4])

Page 47: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 47

Horn clausesHorn clauses

Prolog cannot handle arbitrary logic over relations

It supports Horn clauses only– p1 p2 ... pn q– p

Implication is written “backwards”

mother(M,C) :- parent(M,C), female(M).

female(karen).

Cannot say– p1 p2 q1 q2

– And other stuff

Page 48: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 48

Why this limitation?Why this limitation?

It allows for a simple underlying theorem prover – Without it, theorem provers produce tons of

interim and often unnecessary results This search process for proving queries

is called resolution (Robinson)– Horn clauses allow a goal-oriented,

backtracking search

Page 49: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 49

ExampleExample

parent(karen,greg).parent(joseph,greg).parent(karen,mark).parent(joseph,mark).female(karen).mother(M,C) :- parent(M,C), female(M).

?-mother(karen,X).X = greg ;X = mark

Find the first functor that unifies to the query Use the conjuncts on the right of that rule as subgoals

– Prove them in order– If all are true, it is proven– Backtrack for additional answers or until failure

Page 50: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 50

ResolutionResolution

Ordering is especially important for recursive rule sets

The two sets of rules on the right are logically equivalent– Conjunction is

commutative But they are

computationally very different

ancestor(X,Y) :- parent(X,Y).

ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).

ancestor(X,Y) :- parent(X,Y).

ancestor(X,Y) :- ancestor(X,Z), parent(Z,Y).

Page 51: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 51

Arithmetic in PrologArithmetic in Prolog

?- X=2+3, X=5. No

2+3 does not unify with 5– 2+3 is an unevaluated expression that is not

the same as the literal 5• like x/y was in the 8 queens

?- X is 2+3, X=5. Yes

Force arithmetic evaluation

Page 52: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 52

Change for a dollar: J.R. FisherChange for a dollar: J.R. Fisher

change([H,Q,D,N,P]) :- member(H,[0,1,2]), /* Half-dollars */ member(Q,[0,1,2,3,4]), /* etc. */ member(D,[0,1,2,3,4,5,6,7,8,9,10]) , member(N,[0,1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19,20]), S is 50*H + 25*Q +10*D + 5*N, S =< 100, P is 100-S.

Page 53: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 53

Arithmetic onlyArithmetic onlyworks forward in Prologworks forward in Prologsum(X,Y,Z) :- Z is X + Y.

?- sum(4,5,Z). Z=9?- sum(4,Y,9). Error!

We’ll come back to this in CLP(R), which can do it both ways!

Page 54: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 54

membermember rule rule

/*member(X,Y) succeeds iffX is a member of the list Y. */

Example uses:?- member(1,[1,2,3]). Yes?- member(7,[1,2,3]). No?- member(3,foo). No?- member(foo,[]). No

Page 55: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 55

Definition of Definition of membermember

member(X,[X|_]).member(X,[_|T]) :- member(X,T).

X is a member of a list starting with X; and X is a member of a list starting with anything as long as it is a member of the rest of the list

Page 56: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 56

The declarative interpretation falls The declarative interpretation falls short…short…Two queries with identical logical

semantics:X = [1,2,3], member(7,X).member(7,X), X = [1,2,3].

?- X = [1,2,3], member(7,X). No?- member(7,X), X=[1,2,3]. …

Infinite computation

Page 57: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 57

More uses of More uses of membermember

?- member(X,[]). No?- member(X,[1,2,3]). 1;2 ;3 ;No

?- member(7,X). X = [7|_G219];X = [_G218, 7|_G222] ;X = [_G218, _G221, 7|_G225] ;…

Page 58: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 58

Reminder: How Prolog tries to Reminder: How Prolog tries to proveprove Rule order

– Select the first applicable rulefrom top to bottom

Goal order– Prove subgoals from left to right

Page 59: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 59

Evidence of top to bottomEvidence of top to bottomrule orderrule order?- male(X). X=joseph;X=mark ;X=greg ;X=eric ;No

Order of results mirrors the order that the facts appeared in the database

Page 60: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 60

Order of rules matters!Order of rules matters!

mem1(X,[X|_]).mem1(X,[_|T]) :- mem1(X,T).

versus

mem2(X,[_|T]) :- mem2(X,T).mem2(X,[X|_]). Which is more efficient?

Page 61: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 61

Trace of Trace of mem1(2,[1,2,3])mem1(2,[1,2,3])

T Call: ( 8) mem1(2, [1, 2, 3])

T Call: ( 9) mem1(2, [2, 3])

T Exit: ( 9) mem1(2, [2, 3])

T Exit: ( 8) mem1(2, [1, 2, 3])

Page 62: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 62

Trace of Trace of mem2(2,[1,2,3])mem2(2,[1,2,3])T Call: ( 8) mem2(2, [1, 2, 3])T Call: ( 9) mem2(2, [2, 3])T Call: ( 10) mem2(2, [3])T Call: ( 11) mem2(2, [])T Fail: ( 11) mem2(2, [])T Redo: ( 10) mem2(2, [3])T Fail: ( 10) mem2(2, [3])T Redo: ( 9) mem2(2, [2, 3])T Exit: ( 9) mem2(2, [2, 3])

T Exit: ( 8) mem2(2, [1, 2, 3])

Page 63: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 63

mem1 was fastermem1 was faster

mem1 had the base case listed first– base case had no sub-goals

Page 64: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem1(2,[1,2,3])

mem1(2,[2,3])

mem1(2,[3])

mem1(2,[])

B

B

B

B

A

A

A

A

/*A*/ mem1(X,[X|_])./*B*/ mem1(X,[_|T]) :- mem1(X,T).

64

mem1 - Search Structure

Page 65: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem1(2,[1,2,3])

mem1(2,[2,3])

mem1(2,[3])

mem1(2,[])

B

B

B

B

A

A

A

A

/*A*/ mem1(X,[X|_])./*B*/ mem1(X,[_|T]) :- mem1(X,T).

65

mem1 - Ideal Solution

Yes

Page 66: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

A

B

B

B

B

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

66

mem2 - Search Structure

Page 67: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

A

B

B

B

B

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

67

mem2 - Ideal Solution

Yes

Page 68: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 68

Prolog is not an oracle!Prolog is not an oracle!

Resolution gives strict rules– First applicable rule– Prove subgoals in order

Page 69: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

69

How Prolog Proceeds - 1

Matches A,Unify [_|T]with [1,2,3]So T = [2,3],

and must provemem2(X,T).

Page 70: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

A/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

70

How Prolog Proceeds - 2

Page 71: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

A/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

71

How Prolog Proceeds - 3

Matches A,Unify [_|T]with [2,3]So T = [3],

and must provemem2(X,T).

Page 72: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

72

How Prolog Proceeds - 4

Page 73: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

73

How Prolog Proceeds - 5

Matches A,Unify [_|T]

with [3]So T = [],

and must provemem2(X,T).

Page 74: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

74

How Prolog Proceeds - 6

Page 75: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

75

How Prolog Proceeds - 7

Does not match AA

Page 76: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

76

How Prolog Proceeds - 8

Does not match BA B

Page 77: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

77

How Prolog Proceeds - 9

No other rules can letus find a solution to this

A B

Page 78: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

78

How Prolog Proceeds - 10

So we must undobinding of T=[],

and backtrack up thetree to where T=[3]A B

Page 79: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

79

How Prolog Proceeds - 11

A B

How else canwe try to provethis relation?Check rule B!

Page 80: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

80

How Prolog Proceeds - 12

A B

B Does not match B

Page 81: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

81

How Prolog Proceeds - 13

A B

B

No other rules,so backtrack

Page 82: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

82

How Prolog Proceeds - 14

A B

B

Backtrack,undo T=[3],

restore T=[2,3]

Page 83: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

83

How Prolog Proceeds - 15

A B

B

B Matches B!

Page 84: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem2(2,[1,2,3])

mem2(2,[2,3])

mem2(2,[3])

mem2(2,[])

A

A

A

/*A*/ mem2(X,[_|T]) :- mem2(X,T)./*B*/ mem2(X,[X|_]).

84

How Prolog Proceeds - 16

A B

B

B

No subgoals,so we are done!

Yes

Page 85: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 85

Search algorithmSearch algorithm

Depth first visitation of the nodes in the search tree

What about rules with multiple goals?

Page 86: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 86

Multiple sub-goalsMultiple sub-goals

p :- a, b, c.p :- m, f.q :- m, n.r :- q, p.r :- a, n.n.a.

?- r.

Nodes will nowcontain multiple sub-goalseach the root of a new tree

q p

Must prove q,and then prove p

Page 87: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 87

r

q p a n

m n m f a b c

Another search tree…Another search tree…

Page 88: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 88

r

q p a n

m n m fa b c

Tracing through the treeTracing through the tree

1

2

5

3

4 6

YES

Page 89: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem1(2,[1,2,3])

mem1(2,[2,3])

mem1(2,[3])

mem1(2,[])

B

B

B

B

A

A

A

A

/*A*/ mem1(X,[X|_])./*B*/ mem1(X,[_|T]) :- mem1(X,T).

89

mem1 search tree

Page 90: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem1(2,[1,2,3])A /*A*/ mem1(X,[X|_]).

/*B*/ mem1(X,[_|T]) :- mem1(X,T).

90

mem1 search trace - 1

Does not match A

Page 91: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem1(2,[1,2,3])

mem1(2,[2,3])

BA /*A*/ mem1(X,[X|_])./*B*/ mem1(X,[_|T]) :- mem1(X,T).

91

mem1 search trace - 2

Matches B

Page 92: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem1(2,[1,2,3])

mem1(2,[2,3])

BA /*A*/ mem1(X,[X|_])./*B*/ mem1(X,[_|T]) :- mem1(X,T).

92

mem1 search trace - 3

A Matches A!Yes

Page 93: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])

mem(Q,[2,3])

mem(Q,[3])

mem(Q,[])

B

B

B

A

A

A

/*A*/ mem(X,[X|_])./*B*/ mem(X,[_|T]) :- mem(X,T).

93

Multiple solutions trace 1

Page 94: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])A /*A*/ mem(X,[X|_]).

/*B*/ mem(X,[_|T]) :- mem(X,T).

94

Multiple solutions trace 2Matches A,unify [Q|_]with [1,2,3]Q = 1

Page 95: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])A /*A*/ mem(X,[X|_]).

/*B*/ mem(X,[_|T]) :- mem(X,T).

95

Multiple solutions trace 3

Q = 1; to reject

solution and forcea backtrack to try

to prove alternatively

Page 96: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])A /*A*/ mem(X,[X|_]).

/*B*/ mem(X,[_|T]) :- mem(X,T).

96

Multiple solutions trace 4

mem(Q,[2,3])

B

Matches B

Page 97: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])A /*A*/ mem(X,[X|_]).

/*B*/ mem(X,[_|T]) :- mem(X,T).

97

Multiple solutions trace 5

mem(Q,[2,3])

B

A Matches A,unify [Q|_]with [2,3]Q = 2

Page 98: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])A /*A*/ mem(X,[X|_]).

/*B*/ mem(X,[_|T]) :- mem(X,T).

98

Multiple solutions trace 6

mem(Q,[2,3])

B

A

mem(Q,[3])

B Matches B

Page 99: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])A /*A*/ mem(X,[X|_]).

/*B*/ mem(X,[_|T]) :- mem(X,T).

99

Multiple solutions trace 7

mem(Q,[2,3])

B

A

mem(Q,[3])

B

AMatches A,unify [Q|_]

with [3]Q = 3

Page 100: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])A /*A*/ mem(X,[X|_]).

/*B*/ mem(X,[_|T]) :- mem(X,T).

100

Multiple solutions trace 8

mem(Q,[2,3])

B

A

mem(Q,[3])

B

A

mem(Q,[])

BMatches B

Page 101: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])A /*A*/ mem(X,[X|_]).

/*B*/ mem(X,[_|T]) :- mem(X,T).

101

Multiple solutions trace 9

mem(Q,[2,3])

B

A

mem(Q,[3])

B

A

mem(Q,[])

B Not possible toprove this

No

Page 102: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

mem(Q,[1,2,3])

mem(Q,[2,3])

mem(Q,[3])

mem(Q,[])

B

B

B

A

A

A

/*A*/ mem(X,[X|_])./*B*/ mem(X,[_|T]) :- mem(X,T).

102

All the solutions

Q = 3

Q = 2

Q = 1

Page 103: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 103

Backtracking is notBacktracking is notalways what we wantalways what we want Patterns may match where we

do not intend Backtracking is expensive—

we may know more about our problem and can help the algorithm be “smarter”

We may want to specify a situation that we know definitively results in failure

Page 104: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 104

delete_alldelete_all example example

/* delete_all(List,E,Result) means that Result is a a list just like List except all elements E are missing. */

delete_all([], E, []).

delete_all([E|Tail], E, Res) :-delete_all(Tail, E, Res).

delete_all([Head|Tail], E, [Head|Res]) :-delete_all(Tail, E, Res).

Page 105: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 105

A query for A query for delete_alldelete_all

?- delete_all([1,2,3],2,R). R=[1,3];

R=[1,2,3];No

Why this solution?

Page 106: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 106

delete_alldelete_all can succeed can succeedin any of three ways...in any of three ways...delete_all([], E, []).

delete_all([E|Tail], E, Res) :-delete_all(Tail, E, Res).

delete_all([Head|Tail], E, [Head|Res]) :-delete_all(Tail, E, Res).

Order in file only tells which rules are attempted first—later matching rules can be used after backtracking!

Page 107: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 107

delete_alldelete_all has multiple matching has multiple matching rulesrulesdelete_all([E|Tail], E, Res) :-

delete_all(Tail, E, Res).

delete_all([Head|Tail], E, [Head|Res]) :-delete_all(Tail, E, Res).

delete_all([2,3],2,R). Can be proven using either of the above!

R=[3], or R=[2,3]

Page 108: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 108

Third rule contained implicit Third rule contained implicit assumptionassumptiondelete_all([Head|Tail], E, [Head|Res]) :-

delete_all(Tail, E, Res).

Want above rule to apply only when Head is not E

That is exactly the complement of rule 2 So we can make the algorithm only try

rule 3 if rule 2 did not succeed

Page 109: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 109

Use a “cut” — Use a “cut” — !!

We can make rule 2 prevent backtracking with the “cut” operator, written !

delete_all([E|Tail], E, Res) :-delete_all(Tail, E, Res), !.

Now the search algorithm will not try any other rules for delete_all after the above rule succeeds

! succeeds and stops further backtracking for more results

Page 110: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 110

The query againThe query again

?- delete_all([1,2,3],2,R). R=[1,3];No

Now we get only the single correct solution!

Page 111: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 111

Cut divides problemCut divides probleminto backtracking regionsinto backtracking regionsfoo := a, b, c, !, d, e, f.

Search may try various ways to prove a, b, and c, backtracking freely while solving those sub-goals

Once a, b, and c are proved, that sub-answer is frozen, and d, e, f must be proved without changing a, b, or c

Page 112: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 112

Controversy over Controversy over cutcut

Prolog is meant to be declarative cut operator alters the behavior of

the built-in searching algorithm No declarative interpretation for cut

—you must think about resolution to understand its effects

Page 113: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 113

cutcut and and notnot We can write the not predicate using

a cut operator:not(P) :- P, !, fail.not(P).

Uses built-in fail predicate that always fails Cut operator prevents the search algorithm

from backtracking to use the second rule to satisfy P when the first rule already failed

2nd rule applies only if P cannot be proven

Page 114: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 114

!, fail combination!, fail combination

Another common use of the cut is with fail

Use to force failure in special cases that are easy to rule out immediately

average_taxpayer(X) :-lives_in_bermuda(X), !, fail.

average_taxpayer(X) :-/* complicated rules here… */

Page 115: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 115

k

q g z n

m ! m f z ! b c

Tree view of a cutTree view of a cut

c z

Page 116: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 116

k

q g z n

m ! m f z ! b c

Tree view of a cutTree view of a cut

c z

Page 117: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 117

IconIcon

Icon is a programming language developed by Ralph Griswold– Based in part on SNOBOL

A very cool language that (roughly) takes the best of C and of Prolog– It’s very much an imperative language, but with a kick

from backtracking Much of these notes are from an Icon overview

– http://www.cs.arizona.edu/icon/docs/ipd266.htm

Page 118: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 118

Expression evaluationExpression evaluation

Expressions in Icon don’t (only) return a value

Rather, they succeed (and return a value) or fail– Ex: find(s1,s2) looks for string s1 in string

s2– If it finds it, it succeeds and returns the

index where s2 was found

Page 119: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 119

GeneratorsGenerators

What’s cool is that many expressions can produce multiple results– find(“i”, “mississippi”)– {2,5,8,11}

You can iterate over these results easily– every j := find(“i”, “mississippi”) do write(j)

– every write(find(“i”, “mississippi”))– This “generator” expression stores state and can resume to

produce new (additional) results

Page 120: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 120

ExamplesExamples

every k := i to j do f(k) every f(i to j) every write(find(”i", s1) | find(”i", s2))

every write(find(“i”,s1|s2)) (i | j | k) = (0 | 1)

Page 121: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 121

Writing generatorsWriting generators

procedure findodd(s1, s2) every i := find(s1, s2) do if i % 2 = 1 then suspend iendevery write(findodd(s1,s2))

Page 122: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 122

In some sense, that’s itIn some sense, that’s it

In other dimensions, Icon is very much like any imperative language

But adding this rich notion of expression evaluation is very expressive– It’s very much like Prolog --- in essence,

using unification and resolution --- but in a limited scope rather than for the entire computational model

Page 123: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 123

Other cool thingsOther cool things

String scanning– line ? while tab(upto(&letters)) do write(tab(many(&letters)))

Sets– words := set()while line := read() do line ? while tab(upto(&letters)) do insert(words, tab(many(&letters)))every write(!words)

Page 124: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 124

MoreMore

Tables– words := table(0)while line := read() do line ? while tab(upto(&letters)) do words[tab(many(&letters))] +:= 1

Page 125: CSE583: Programming Languages David Notkin 15 February 2000  David Notkin 15

University of Washington • CSE583 • D. Notkin © 2000 125

Next week: CLP(R)Next week: CLP(R)

Arithmetic only works forward in Prolog– But we know arithmetic works both

directions By adding knowledge of a domain to

Prolog-like languages, we can solve lots of richer problems, and solve them faster