A First Look At Prolog
Chapter Nineteen Modern Programming Languages, 2nd ed. 1
A First Look At Prolog Chapter Nineteen Modern Programming - - PowerPoint PPT Presentation
A First Look At Prolog Chapter Nineteen Modern Programming Languages, 2nd ed. 1 Outline Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good
Chapter Nineteen Modern Programming Languages, 2nd ed. 1
Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good for
Chapter Nineteen Modern Programming Languages, 2nd ed. 2
– Prolog programs – The data manipulated by Prolog programs
– Constants: integers, real numbers, atoms – Variables – Compound terms
Chapter Nineteen Modern Programming Languages, 2nd ed. 3
– A lowercase letter followed by any number of
– A sequence of non-alphanumeric characters:
– Plus a few special atoms: []
Chapter Nineteen Modern Programming Languages, 2nd ed. 4
– i, size, length
Chapter Nineteen Modern Programming Languages, 2nd ed. 5
Chapter Nineteen Modern Programming Languages, 2nd ed. 6
Chapter Nineteen Modern Programming Languages, 2nd ed. 7
Chapter Nineteen Modern Programming Languages, 2nd ed. 8
<term> ::= <constant> | <variable> | <compound-term> <constant> ::= <integer> | <real number> | <atom> <compound-term> ::= <atom> ( <termlist> ) <termlist> ::= <term> | <term> , <termlist>
Chapter Nineteen Modern Programming Languages, 2nd ed. 9
Chapter Nineteen Modern Programming Languages, 2nd ed. 10
Chapter Nineteen Modern Programming Languages, 2nd ed. 11
parent(kim,holly). parent(margaret,kim). parent(margaret,kent). parent(esther,margaret). parent(herbert,margaret). parent(herbert,jean).
Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good for
Chapter Nineteen Modern Programming Languages, 2nd ed. 12
Chapter Nineteen Modern Programming Languages, 2nd ed. 13
Welcome to SWI-Prolog … For help, use ?- help(Topic). or ?- apropos(Word). ?-
Chapter Nineteen Modern Programming Languages, 2nd ed. 14
?- consult(relations). % relations compiled 0.00 sec, 852 bytes true. ?-
Chapter Nineteen Modern Programming Languages, 2nd ed. 15
?- parent(margaret,kent). true. ?- parent(fred,pebbles). false. ?-
Chapter Nineteen Modern Programming Languages, 2nd ed. 16
?- parent(margaret,kent) | . true. ?-
Chapter Nineteen Modern Programming Languages, 2nd ed. 17
– parent(Parent,jean) – parent(esther,Child) – parent(Parent,Child) – parent(Person,Person)
Chapter Nineteen Modern Programming Languages, 2nd ed. 18
Chapter Nineteen Modern Programming Languages, 2nd ed. 19
Chapter Nineteen Modern Programming Languages, 2nd ed. 20
Chapter Nineteen Modern Programming Languages, 2nd ed. 21
Chapter Nineteen Modern Programming Languages, 2nd ed. 22
?- parent(Parent,kim), parent(Grandparent,Parent). Parent = margaret, Grandparent = esther ; Parent = margaret, Grandparent = herbert ; false. ?- parent(esther,Child), | parent(Child,Grandchild), | parent(Grandchild,GreatGrandchild). Child = margaret, Grandchild = kim, GreatGrandchild = holly .
Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good for
Chapter Nineteen Modern Programming Languages, 2nd ed. 23
Chapter Nineteen Modern Programming Languages, 2nd ed. 24
Chapter Nineteen Modern Programming Languages, 2nd ed. 25
greatgrandparent(GGP,GGC) :- parent(GGP,GP), parent(GP,P), parent(P,GGC).
Chapter Nineteen Modern Programming Languages, 2nd ed. 26
parent(kim,holly). parent(margaret,kim). parent(margaret,kent). parent(esther,margaret). parent(herbert,margaret). parent(herbert,jean). greatgrandparent(GGP,GGC) :- parent(GGP,GP), parent(GP,P), parent(P,GGC).
– The first goal is the initial query – The next is what remains to be proved after
– And so on, until nothing remains to be proved
Chapter Nineteen Modern Programming Languages, 2nd ed. 27
?- greatgrandparent(esther,GreatGrandchild). GreatGrandchild = holly .
Chapter Nineteen Modern Programming Languages, 2nd ed. 28
greatgrandparent(esther,GreatGrandchild)
parent(GGP,GP), parent(GP,P), parent(P,GGC).
parent(esther,GP), parent(GP,P), parent(P,GreatGrandchild) parent(margaret,P), parent(P,GreatGrandchild) parent(kim,GreatGrandchild) Clause 7, binding GGP to esther and GGC to GreatGrandChild Clause 4, binding GP to margaret Clause 2, binding P to kim Clause 1, binding GreatGrandchild to holly
We will see more about Prolog’s model
Chapter 20
Chapter Nineteen Modern Programming Languages, 2nd ed. 29
grandparent(GP,GC) :- parent(GP,P), parent(P,GC). greatgrandparent(GGP,GGC) :- grandparent(GGP,P), parent(P,GGC).
– Base case: X is a parent of Y – Recursive case: there is some Z such that Z is a
Chapter Nineteen Modern Programming Languages, 2nd ed. 30
ancestor(X,Y) :- parent(X,Y). ancestor(X,Y) :- parent(Z,Y), ancestor(X,Z).
Chapter Nineteen Modern Programming Languages, 2nd ed. 31
?- ancestor(jean,jean). false. ?- ancestor(kim,holly). true . ?- ancestor(A,holly). A = kim ; A = margaret ; A = esther ; A = herbert ; false.
Chapter Nineteen Modern Programming Languages, 2nd ed. 32
<clause> ::= <fact> | <rule> <fact> ::= <term> . <rule> ::= <term> :- <termlist> . <termlist> ::= <term> | <term> , <termlist>
Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good for
Chapter Nineteen Modern Programming Languages, 2nd ed. 33
– To prove greatgrandparent(GGP,GGC), find some
GP and P for which you can prove parent(GGP,GP), then parent(GP,P) and then
Chapter Nineteen Modern Programming Languages, 2nd ed. 34
greatgrandparent(GGP,GGC) :- parent(GGP,GP), parent(GP,P), parent(P,GGC).
– For all bindings of GGP, GP, P, and GGC, if
parent(GGP,GP) and parent(GP,P) and parent(P,GGC), then greatgrandparent(GGP,GGC)
Chapter Nineteen Modern Programming Languages, 2nd ed. 35
GGC GGP GGC P P GP GP GGP GGC P GP GGP , parent greatgrand , parent , parent , parent . , , , ⇒ ∧ ∧ ∀
– Prolog clauses – formulas in first-order logic – ML fun definitions – functions
Chapter Nineteen Modern Programming Languages, 2nd ed. 36
Chapter Nineteen Modern Programming Languages, 2nd ed. 37
– A Prolog program has logical content
– A Prolog program has procedural concerns:
Chapter Nineteen Modern Programming Languages, 2nd ed. 38
Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good for
Chapter Nineteen Modern Programming Languages, 2nd ed. 39
Chapter Nineteen Modern Programming Languages, 2nd ed. 40
Chapter Nineteen Modern Programming Languages, 2nd ed. 41
?- =(parent(adam,seth),parent(adam,X)). X = seth. ?- parent(adam,seth)=parent(adam,X). X = seth.
Chapter Nineteen Modern Programming Languages, 2nd ed. 42
?- X = +(1,*(2,3)). X = 1+2*3. ?- X = 1+2*3. X = 1+2*3.
Chapter Nineteen Modern Programming Languages, 2nd ed. 43
?- +(X,Y) = 1+2*3. X = 1, Y = 2*3. ?- 7 = 1+2*3. false.
Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good for
Chapter Nineteen Modern Programming Languages, 2nd ed. 44
Chapter Nineteen Modern Programming Languages, 2nd ed. 45
ML expression Prolog term [] [] 1::[] .(1,[]) 1::2::3::[] .(1,.(2,.(3,[]))) No equivalent. .(1,.(parent(X,Y),[]))
Chapter Nineteen Modern Programming Languages, 2nd ed. 46
List notation Term denoted [] [] [1] .(1,[]) [1,2,3] .(1,.(2,.(3,[]))) [1,parent(X,Y)] .(1,.(parent(X,Y),[]))
Chapter Nineteen Modern Programming Languages, 2nd ed. 47
?- X = .(1,.(2,.(3,[]))). X = [1, 2, 3]. ?- .(X,Y) = [1,2,3]. X = 1, Y = [2, 3].
Chapter Nineteen Modern Programming Languages, 2nd ed. 48
List notation Term denoted [1|X] .(1,X) [1,2|X] .(1,.(2,X)) [1,2|[3,4]] same as [1,2,3,4] ?- [1,2|X] = [1,2,3,4,5]. X = [3, 4, 5].
Chapter Nineteen Modern Programming Languages, 2nd ed. 49
?- append([1,2],[3,4],Z). Z = [1, 2, 3, 4].
Chapter Nineteen Modern Programming Languages, 2nd ed. 50
?- append(X,[3,4],[1,2,3,4]). X = [1, 2] .
Chapter Nineteen Modern Programming Languages, 2nd ed. 51
?- append(X,Y,[1,2,3]). X = [], Y = [1, 2, 3] ; X = [1], Y = [2, 3] ; X = [1, 2], Y = [3] ; X = [1, 2, 3], Y = [] ; false.
Chapter Nineteen Modern Programming Languages, 2nd ed. 52
Chapter Nineteen Modern Programming Languages, 2nd ed. 53
Predicate Description member(X,Y) Provable if the list Y contains the element X. select(X,Y,Z) Provable if the list Y contains the element X, and Z is the same as Y but with one instance of X removed. nth0(X,Y,Z) Provable if X is an integer, Y is a list, and Z is the Xth element of Y, counting from 0. length(X,Y) Provable if X is a list of length Y.
Chapter Nineteen Modern Programming Languages, 2nd ed. 54
?- select(2,[1,2,3],Z). Z = [1, 3] ; false. ?- select(2,Y,[1,3]). Y = [2, 1, 3] ; Y = [1, 2, 3] ; Y = [1, 3, 2] ; false.
Chapter Nineteen Modern Programming Languages, 2nd ed. 55
?- reverse([1,2,3,4],Y). Y = [4, 3, 2, 1].
Chapter Nineteen Modern Programming Languages, 2nd ed. 56
Chapter Nineteen Modern Programming Languages, 2nd ed. 57
?- reverse(X,[1,2,3,4]). X = [4, 3, 2, 1] ; ^CAction (h for help) ? abort % Execution Aborted ?-
Chapter Nineteen Modern Programming Languages, 2nd ed. 58
Chapter Nineteen Modern Programming Languages, 2nd ed. 59
?- sort([2,3,1,4],X). X = [1, 2, 3, 4]. ?- sort(X,[1,2,3,4]). ERROR: Arguments are not sufficiently instantiated
Chapter Nineteen Modern Programming Languages, 2nd ed. 60
Chapter Nineteen Modern Programming Languages, 2nd ed. 61
Chapter Nineteen Modern Programming Languages, 2nd ed. 62
Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good for
Chapter Nineteen Modern Programming Languages, 2nd ed. 63
Chapter Nineteen Modern Programming Languages, 2nd ed. 64
?- member(1,[1,2,3]). true . ?- not(member(4,[1,2,3])). false.
– Declarative: not(X) = ¬X – Procedural: not(X) succeeds if X fails, fails if
Chapter Nineteen Modern Programming Languages, 2nd ed. 65
Chapter Nineteen Modern Programming Languages, 2nd ed. 66
sibling(X,Y) :- parent(P,X), parent(P,Y), not(X=Y). ?- sibling(X,Y). X = kim, Y = kent ; X = kent, Y = kim ; X = margaret, Y = jean ; X = jean, Y = margaret ; false. sibling(X,Y) :- not(X=Y), parent(P,X), parent(P,Y). ?- sibling(kim,kent). true . ?- sibling(kim,kim). false. ?- sibling(X,Y). false.
Terms Using a Prolog language system Rules The two faces of Prolog Operators Lists Negation and failure What Prolog is good for
Chapter Nineteen Modern Programming Languages, 2nd ed. 67
Chapter Nineteen Modern Programming Languages, 2nd ed. 68
Chapter Nineteen Modern Programming Languages, 2nd ed. 69
Chapter Nineteen Modern Programming Languages, 2nd ed. 70
– Config is a configuration (like [w,w,w,w]) – Move is a move (like wolf) – NextConfig is the resulting configuration (in
Chapter Nineteen Modern Programming Languages, 2nd ed. 71
Chapter Nineteen Modern Programming Languages, 2nd ed. 72
change(e,w). change(w,e). move([X,X,Goat,Cabbage],wolf,[Y,Y,Goat,Cabbage]) :- change(X,Y). move([X,Wolf,X,Cabbage],goat,[Y,Wolf,Y,Cabbage]) :- change(X,Y). move([X,Wolf,Goat,X],cabbage,[Y,Wolf,Goat,Y]) :- change(X,Y). move([X,Wolf,Goat,C],nothing,[Y,Wolf,Goat,C]) :- change(X,Y).
– At least one of the goat or the wolf is on the
– At least one of the goat or the cabbage is on the
Chapter Nineteen Modern Programming Languages, 2nd ed. 73
safe([Man,Wolf,Goat,Cabbage]) :-
Chapter Nineteen Modern Programming Languages, 2nd ed. 74
Note: without the length(X,7) restriction,
It gets lost looking at possible solutions like
More about this in Chapter 20
Chapter Nineteen Modern Programming Languages, 2nd ed. 75
?- length(X,7), solution([w,w,w,w],X). X = [goat, nothing, wolf, goat, cabbage, nothing, goat] .
Chapter Nineteen Modern Programming Languages, 2nd ed. 76