Logic Programming Lecture 3: Recursion, lists, and data structures.
-
Upload
riya-wimberley -
Category
Documents
-
view
230 -
download
1
Transcript of Logic Programming Lecture 3: Recursion, lists, and data structures.
![Page 1: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/1.jpg)
Logic Programming
Lecture 3: Recursion, lists, and data structures
![Page 2: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/2.jpg)
James Cheney Logic Programming September 25, 2014
Outline for today
•Recursion
•proof search behavior
•practical concerns
•List processing
•Programming with terms as data structures
![Page 3: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/3.jpg)
James Cheney Logic Programming September 25, 2014
Recursion
•So far we've (mostly) used nonrecursive rules
•These are limited:
•not Turing-complete
• can't define transitive closure
• e.g. ancestor
![Page 4: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/4.jpg)
James Cheney Logic Programming September 25, 2014
Recursion (1)•Nothing to it?
ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :- parent(X,Z),
ancestor(Z,Y).
• Just use recursively defined predicate as a goal.
•Easy, right?
![Page 5: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/5.jpg)
James Cheney Logic Programming September 25, 2014
Depth first search, revisited
•Prolog tries rules depth-first in program order
• no matter what
• Even if there is an "obvious" solution using later clauses!
p :- p.
p.
•will always loop on first rule.
![Page 6: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/6.jpg)
James Cheney Logic Programming September 25, 2014
Recursion (2)•Rule order can matter.
ancestor2(X,Y) :- parent(X,Z),
ancestor2(Z,Y).
ancestor2(X,Y) :- parent(X,Y).
This may be less efficient (tries to find longest path first)
This may also loop unnecessarily (if parent were cyclic).
Heuristic: write base case rules first.
![Page 7: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/7.jpg)
James Cheney Logic Programming September 25, 2014
Rule order mattersancestor(a,b)ancestor(a,b)
parent(a,Z),ancestor(Z,b)parent(a,Z),ancestor(Z,b)
Z = b
ancestor(b,b)ancestor(b,b)
parent(a,b).parent(b,c).
parent(a,b)parent(a,b)
dondonee
![Page 8: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/8.jpg)
James Cheney Logic Programming September 25, 2014
Rule order mattersancestor(a,b)ancestor(a,b)
parent(a,Z),ancestor(Z,b)parent(a,Z),ancestor(Z,b)
Z = b
ancestor(b,b)ancestor(b,b)
parent(a,b).parent(b,a).
parent(b,W),ancestor(W,b)parent(b,W),ancestor(W,b)
W = a
ancestor(a,b)ancestor(a,b)
...
![Page 9: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/9.jpg)
James Cheney Logic Programming September 25, 2014
Recursion (3)
•Goal order can matter.
ancestor3(X,Y) :- parent(X,Y).
ancestor3(X,Y) :- ancestor3(Z,Y),
parent(X,Z).
This will list all solutions, then loop.
![Page 10: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/10.jpg)
James Cheney Logic Programming September 25, 2014
Goal order mattersancestor(a,b)ancestor(a,b)
(a,b)(a,b)
ancestor(Z,b),parent(a,Z)ancestor(Z,b),parent(a,Z)
Z = a
ancestor(W,b), ancestor(W,b), parent(Z,W), parent(Z,W), parent(a,Z)parent(a,Z)
parent(a,b).parent(b,c).
parent(a,b)parent(a,b)
dondonee
parent(Z,b), parent(Z,b), parent(a,Z)parent(a,Z)
parent(a,a)parent(a,a) ... ...
![Page 11: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/11.jpg)
James Cheney Logic Programming September 25, 2014
Recursion (4)
•Goal order can matter.
ancestor4(X,Y) :- ancestor4(Z,Y),
parent(X,Z).
ancestor4(X,Y) :- parent(X,Y).
This will always loop!
Heuristic: try non-recursive goals first.
![Page 12: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/12.jpg)
James Cheney Logic Programming September 25, 2014
Goal order mattersancestor(X,Y)ancestor(X,Y)
ancestor(X,Z), parent(Z,Y)ancestor(X,Z), parent(Z,Y)
ancestor(X,W), parent(W,Z)ancestor(X,W), parent(W,Z), parent(Z,Y), parent(Z,Y)
ancestor(X,V), parent(V,W)ancestor(X,V), parent(V,W), parent(W,Z), parent(Z,Y), parent(W,Z), parent(Z,Y)
...ancestor(X,U), parent(U,V)ancestor(X,U), parent(U,V), parent(V,W), parent(W,Z), parent(Z,Y), parent(V,W), parent(W,Z), parent(Z,Y)
![Page 13: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/13.jpg)
James Cheney Logic Programming September 25, 2014
Recursion and terms
•Terms can be arbitrarily nested
•Example: unary natural numbers
nat(z).
nat(s(N)) :- nat(N).
•To do interesting things we need recursion
![Page 14: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/14.jpg)
James Cheney Logic Programming September 25, 2014
Addition and subtraction
•Example: addition
add(z,N,N).
add(s(N),M,s(P)) :- add(N,M,P).
• Can run in reverse to find all M,N with M+N=P
• Can use to define leq
leq(M,N) :- add(M,_,N).
![Page 15: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/15.jpg)
James Cheney Logic Programming September 25, 2014
Multiplication
•Can multiply two numbers:
multiply(z,N,z).
multiply(s(N),M,P) :-
multiply(N,M,Q), add(M,Q,P).
square(M) :- multiply(N,N,M).
![Page 16: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/16.jpg)
James Cheney Logic Programming September 25, 2014
List processing
•Recall built-in list syntax
list([]).
list([X|L]) :- list(L).
•Example: list append
append([],L,L).
append([X|L],M,[X|N]) :- append(L,M,N).
![Page 17: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/17.jpg)
James Cheney Logic Programming September 25, 2014
Append in action
•Forward direction
?- append([1,2],[3,4],X).
•Backward direction
?- append(X,Y,[1,2,3,4]).
![Page 18: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/18.jpg)
James Cheney Logic Programming September 25, 2014
Mode annotations•Notation append(+,+,-)
• "if you call append with first two arguments ground then it will make the third argument ground"
• Similarly, append(-,-,+)
• "if you call append with last argument ground then it will make the first two arguments ground"
•Not "code", but often used in documentation
• "?" annotation means either + or -
![Page 19: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/19.jpg)
James Cheney Logic Programming September 25, 2014
List processing (2)•When is something a member of a
list?
mem(X,[X|_]).
mem(X,[_|L]) :- mem(X,L).
•Typical modes
mem(+,+)
mem(-,+)
![Page 20: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/20.jpg)
James Cheney Logic Programming September 25, 2014
List processing(3)
•Removing an element of a list
remove(X,[X|L],L).
remove(X,[Y|L],[Y|M]) :- remove(X,L,M).
•Typical mode
remove(+,+,-)
![Page 21: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/21.jpg)
James Cheney Logic Programming September 25, 2014
List processing (4)
•Zip, or "pairing" corresponding elements of two lists
zip([],[],[]).
zip([X|L],[Y|M],[(X,Y)|N]) :- zip(L,M,N).
•Typical modes:
zip(+,+,-).
zip(-,-,+). % "unzip"
![Page 22: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/22.jpg)
James Cheney Logic Programming September 25, 2014
List flattening• Write flatten predicate flatten/2
• Given a list of (lists of ..) lists
• Produces a list containing all elements in order
![Page 23: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/23.jpg)
James Cheney Logic Programming September 25, 2014
List flattening• Write flatten predicate flatten/2
• Given a list of (lists of ..) lists
• Produces a list containing all elements in order
flatten([],[]).
flatten([X|L],M) :- flatten(X,Y1),
flatten(L,Y2),
append(Y1,Y2,M).
flatten(X,[X]) :- ???.
We can't fill this We can't fill this in yet!in yet!
(more next week)(more next week)
![Page 24: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/24.jpg)
James Cheney Logic Programming September 25, 2014
Records/structs• We can use terms to define data structures
pb([entry(james,'123-4567'),...])
• and operations on them
pb_lookup(pb(B),P,N) :-
member(entry(P,N),B).
pb_insert(pb(B),P,N,pb([entry(P,N)|B])).
pb_remove(pb(B),P,pb(B2)) :-
remove(entry(P,_),B,B2).
![Page 25: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/25.jpg)
James Cheney Logic Programming September 25, 2014
Trees
•We can define (binary) trees with data:
tree(leaf).
tree(node(X,T,U)) :- tree(T), tree(U).
![Page 26: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/26.jpg)
James Cheney Logic Programming September 25, 2014
Tree membership
•Define membership in tree
mem_tree(X,node(X,T,U)).
mem_tree(X,node(Y,T,U)) :-
mem_tree(X,T) ;
mem_tree(X,U).
![Page 27: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/27.jpg)
James Cheney Logic Programming September 25, 2014
Preorder traversal•Define preorder
preorder(leaf,[]).
preorder(node(X,T,U),[X|N]) :-
preorder(T,L),
preorder(U,M),
append(L,M,N).
•What happens if we run this in reverse?
![Page 28: Logic Programming Lecture 3: Recursion, lists, and data structures.](https://reader030.fdocuments.in/reader030/viewer/2022032517/56649c815503460f94939ce4/html5/thumbnails/28.jpg)
James Cheney Logic Programming September 25, 2014
Next time
•Nonlogical features
•Expression evaluation
• I/O
• "Cut" (pruning proof search)
•Further reading:
• Learn Prolog Now, ch. 3-4