Professional Documents
Culture Documents
CM09 LPNchapter10 11 Ter
CM09 LPNchapter10 11 Ter
• Theory
– Explain how to control Prolog’s
backtracking behaviour with the help
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
b(1). b(2).
c(1). c(2).
d(2).
e(2).
f(3).
?- p(X).
Example: cut-free code
p(X):- a(X).
p(X):- b(X), c(X), d(X), e(X). ?- p(X).
p(X):- f(X).
a(1).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
b(1). b(2).
c(1). c(2).
d(2).
e(2).
f(3).
?- p(X).
Example: cut-free code
p(X):- a(X).
p(X):- b(X), c(X), d(X), e(X). ?- p(X).
p(X):- f(X).
a(1).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
b(1). b(2).
c(1). c(2).
d(2).
e(2).
f(3).
?- p(X).
Example: cut-free code
p(X):- a(X).
p(X):- b(X), c(X), d(X), e(X). ?- p(X).
p(X):- f(X).
a(1). ?- a(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
b(1). b(2).
c(1). c(2).
d(2).
e(2).
f(3).
?- p(X).
Example: cut-free code
p(X):- a(X).
p(X):- b(X), c(X), d(X), e(X). ?- p(X).
p(X):- f(X).
a(1). ?- a(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
b(1). b(2).
c(1). c(2).
d(2).
e(2).
f(3).
?- p(X).
Example: cut
p(X):- a(X).
p(X):- b(X),c(X),!,d(X),e(X). ?- p(X).
p(X):- f(X).
a(1).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
b(1). b(2).
c(1). c(2).
d(2).
e(2).
f(3).
?- p(X).
Example: cut
p(X):- a(X).
p(X):- b(X),c(X),!,d(X),e(X). ?- p(X).
p(X):- f(X).
a(1).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
b(1). b(2).
c(1). c(2).
d(2).
e(2).
f(3).
?- p(X).
Example: cut
p(X):- a(X).
p(X):- b(X),c(X),!,d(X),e(X). ?- p(X).
p(X):- f(X).
a(1). ?- a(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
†
What the cut does
defined as follows:
– assert/1
– asserta/1
– assertz/1
– retract/1
– retractall/1
Database Manipulation
– assert/1
– asserta/1 Adding information
– assertz/1
– retract/1
Removing information
– retractall/1
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
yes
?- listing.
Start with an empty database
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
yes
Using assert/1
?- assert(happy(mia)).
Using assert/1
happy(mia). ?- assert(happy(mia)).
yes
?-
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
Using assert/1
happy(mia). ?- assert(happy(mia)).
yes
?- listing.
happy(mia).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?-
Using assert/1
happy(mia). ?- assert(happy(mia)).
yes
?- listing.
happy(mia).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?- assert(happy(vincent)),
assert(happy(marsellus)),
assert(happy(butch)),
assert(happy(vincent)).
Using assert/1
happy(mia). ?- assert(happy(mia)).
happy(vincent). yes
?- listing.
happy(marsellus).
happy(mia).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
happy(butch). ?- assert(happy(vincent)),
happy(vincent). assert(happy(marsellus)),
assert(happy(butch)),
assert(happy(vincent)).
yes
?-
Changing meaning of predicates
• More generally:
database manipulation commands give
us the ability to change the meaning of
predicates during runtime
Dynamic and Static Predicates
happy(butch).
happy(vincent).
Asserting rules
happy(butch).
happy(vincent).
naive(A):- happy(A).
Removing information
happy(mia). ?- retract(happy(marsellus)).
happy(vincent).
happy(marsellus).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
happy(butch).
happy(vincent).
naive(A):- happy(A).
Using retract/1
happy(mia). ?- retract(happy(marsellus)).
happy(vincent). yes
?-
happy(butch).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
happy(vincent).
naive(A):- happy(A).
Using retract/1
happy(mia). ?- retract(happy(marsellus)).
happy(vincent). yes
?- retract(happy(vincent)).
happy(butch).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
happy(vincent).
naive(A):- happy(A).
Using retract/1
happy(mia). ?- retract(happy(marsellus)).
happy(butch). yes
?- retract(happy(vincent)).
happy(vincent).
yes
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
naive(A):- happy(A).
Using retract/1
happy(mia). ?- retract(happy(X)).
happy(butch).
happy(vincent).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
naive(A):- happy(A).
Using retract/1
no
?-
Consider this database
child(martha,charlotte). ?- descend(martha,X).
child(charlotte,caroline). X=charlotte;
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura). X=caroline;
child(laura,rose). X=laura;
X=rose;
descend(X,Y):- child(X,Y). no
descend(X,Y):- child(X,Z),
descend(Z,Y).
Collecting solutions
one by one
• Sometimes we would like to have all
the solutions to a query in one go
• Needless to say, it would be handy to
have them in a neat, usable format
Collecting solutions
• The query
?- findall(O,G,L).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(martha,charlotte). ?- findall(X,descend(martha,X),L).
child(charlotte,caroline). L=[charlotte,caroline,laura,rose]
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura). yes
child(laura,rose).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z),
descend(Z,Y).
Other findall/3 examples
child(martha,charlotte). ?- findall(f:X,descend(martha,X),L).
child(charlotte,caroline). L=[f:charlotte,f:caroline,f:laura,f:rose]
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura). yes
child(laura,rose).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z),
descend(Z,Y).
Other findall/3 examples
child(martha,charlotte). ?- findall(X,descend(rose,X),L).
child(charlotte,caroline). L=[ ]
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura). yes
child(laura,rose).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z),
descend(Z,Y).
Other findall/3 examples
child(martha,charlotte). ?- findall(d,descend(martha,X),L).
child(charlotte,caroline). L=[d,d,d,d]
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura). yes
child(laura,rose).
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z),
descend(Z,Y).
findall/3 is sometimes rather crude
child(martha,charlotte). ?- findall(Chi,descend(Mot,Chi),L).
child(charlotte,caroline). L=[charlotte,caroline,laura, rose,
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura). caroline,laura,rose,laura,rose,rose]
child(laura,rose). yes
descend(X,Y):- child(X,Y).
descend(X,Y):- child(X,Z),
descend(Z,Y).
bagof/3
• The query
?- bagof(O,G,L).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?- bagof(Chi,descend(Mot,Chi),L).
child(martha,charlotte). Mot=caroline
child(charlotte,caroline). L=[laura, rose];
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura).
Mot=charlotte
child(laura,rose).
L=[caroline,laura,rose];
descend(X,Y):- Mot=laura
child(X,Y). L=[rose];
descend(X,Y):- Mot=martha
child(X,Z), L=[charlotte,caroline,laura,rose];
descend(Z,Y). no
Using bagof/3 with ^
?- bagof(Chi,Mot^descend(Mot,Chi),L).
child(martha,charlotte). L=[charlotte, caroline, laura, rose,
child(charlotte,caroline). caroline,laura,rose,laura, rose, rose]
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura).
child(laura,rose).
descend(X,Y):-
child(X,Y).
descend(X,Y):-
child(X,Z),
descend(Z,Y).
setof/3
• The query
?- setof(O,G,L).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
?- bagof(Chi,Mot^descend(Mot,Chi),L).
child(martha,charlotte). L=[charlotte, caroline, laura, rose,
child(charlotte,caroline). caroline, laura, rose, laura, rose,
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura). rose]
child(laura,rose). yes
descend(X,Y):- ?-
child(X,Y).
descend(X,Y):-
child(X,Z),
descend(Z,Y).
Compare this to using setof/3
?- bagof(Chi,Mot^descend(Mot,Chi),L).
child(martha,charlotte). L=[charlotte, caroline, laura, rose,
child(charlotte,caroline). caroline, laura, rose, laura, rose,
© Patrick Blackburn, Johan Bos & Kristina Striegnitz
child(caroline,laura). rose]
child(laura,rose). yes
descend(X,Y):- ?- setof(Chi,Mot^descend(Mot,Chi),L).
child(X,Y).
L=[caroline, charlotte, laura, rose]
descend(X,Y):-
yes
child(X,Z),
descend(Z,Y).
?-