LPN03
LPN03
Lecture 3: Recursion
• Theory
– Introduce recursive definitions in Prolog
– Four examples
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
• Exercises
– Exercises of LPN chapter 3
– Practical work
Recursive Definitions
• • 1
• •
Example 1: Eating
isDigesting(X,Y):- justAte(X,Y).
isDigesting(X,Y):- justAte(X,Z), isDigesting(Z,Y).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
justAte(mosquito,blood(john)).
justAte(frog,mosquito).
justAte(stork,frog).
?-
justAte
X Y
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
isDigesting
• • 2
• •
justAte
X Y
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
isDigesting
justAte isDigesting
X Z Y
isDigesting
Example 1: Eating
isDigesting(X,Y):- justAte(X,Y).
isDigesting(X,Y):- justAte(X,Z), isDigesting(Z,Y).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
justAte(mosquito,blood(john)).
justAte(frog,mosquito).
justAte(stork,frog).
?- isDigesting(stork,mosquito).
• • 3
•
•
© Patrick Blackburn, Johan Bos & Kristina Striegnitz © Patrick Blackburn, Johan Bos & Kristina Striegnitz
?-
?- p.
p:- p.
p:- p.
•
•
4
• •
p:- p.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?- p.
ERROR: out of memory
Example 2: Decendant
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z), child(Z,Y).
• • 5
• •
Example 2: Decendant
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(donna,emily).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z), child(Z,Y).
Example 2: Decendant
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(donna,emily).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z), child(Z,Y).
?- descend(anna,donna).
no
?-
• • 6
• •
Example 2: Decendant
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
child(donna,emily).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z), child(Z,Y).
descend(X,Y):- child(X,Z), child(Z,U), child(U,Y).
?-
Example 2: Decendant
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(donna,emily).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z), descend(Z,Y).
?-
• • 7
• •
Example 2: Decendant
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(donna,emily).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z), descend(Z,Y).
?- descend(anna,donna).
Search tree
?- descend(anna,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
• • 8
• •
Example 3: Successor
Example 3: Successor
numeral(0).
numeral(succ(X)):- numeral(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
• • 9
• •
Example 3: Successor
numeral(0).
numeral(succ(X)):- numeral(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?- numeral(succ(succ(succ(0)))).
yes
?-
Example 3: Successor
numeral(0).
numeral(succ(X)):- numeral(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?- numeral(X).
• • 10
• •
Example 3: Successor
numeral(0).
numeral(succ(X)):- numeral(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?- numeral(X).
X=0;
X=succ(0);
X=succ(succ(0));
X=succ(succ(succ(0)));
X=succ(succ(succ(succ(0))))
Example 4: Addition
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?- add(succ(succ(0)),succ(succ(succ(0))), Result).
Result=succ(succ(succ(succ(succ(0)))))
yes
• • 11
• •
Example 4: Addition
?- add(succ(succ(0)),succ(succ(succ(0))), Result).
Result=succ(succ(succ(succ(succ(0)))))
yes
Example 4: Addition
add(X,Y,Z).
?- add(succ(succ(0)),succ(succ(succ(0))), Result).
Result=succ(succ(succ(succ(succ(0)))))
yes
• • 12
•
•
© Patrick Blackburn, Johan Bos & Kristina Striegnitz © Patrick Blackburn, Johan Bos & Kristina Striegnitz
Exercises
Search tree
•
•
13
• •
language!
• Prolog has a specific way of answering
queries:
– Search knowledge base from top to
bottom
– Processes clauses from left to right
– Backtracking to recover from bad choices
• • 14
• •
descend1.pl
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(donna,emily).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z), descend(Z,Y).
?- descend(A,B).
A=anna
B=bridget
descend2.pl
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(donna,emily).
?- descend(A,B).
A=anna
B=emily
• • 15
• •
descend3.pl
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(donna,emily).
?- descend(A,B).
ERROR: OUT OF LOCAL STACK
descend4.pl
child(anna,bridget).
child(bridget,caroline).
child(caroline,donna).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(donna,emily).
descend(X,Y):- child(X,Y).
descend(X,Y):- descend(Z,Y), child(X,Z).
?- descend(A,B).
• • 16
• •
Next lecture
• • 17