Prolog for Dummies Ulf Nilsson Dept of Computer and Information Science Linköping University Logic programs A logic program describes individuals and relations between individuals (or properties of individuals). The program is used to answer queries about the world described in the program. Relations Adam is a parent of Bill Paris is the capital of France 5 is greater than 2 plus 2 X times 1 is equal to X X is a subset of Y 5 is the maximum of 2 and 5 There is an edge from a to b Properties Adam is a parent Adam is male X plus 1 is non-zero Paris is a capital Grass is green The music was loud Queries Who is the father of Bill? Is there an edge from a to b? Which town is a capital? Who is male? Language primitives Constants adam, paris, 5, 3.14, [], ´Adam’, ... Variables X, Y, List, _12, _, ... Function symbols plus/2, +/2, f/1, ... Predicate symbols capital/2, greater/2, non_zero/1, >/2, ... Terms Terms represent individuals Constants Variables Compound terms E.g. paris, X, plus(2,3), plus(2,plus(3,4)) Infix notation: 2+3 Atomic formulas Atomic formulas describe relations: If p is a predicate letter of arity n and t1,...,tn are terms then p(t1,...,tn) is an atomic formula. E.g. capital(paris,france) greater(X,2) Infix notation: X > 2 Logic Programs A logic program is a set of clauses: facts rules The program is used to answer queries. Facts A fact is an expression of the form: A. where A is an atomic formula. Examples: edge(a, X). parent(adam, bill). Interpretation Facts Consider a fact A. Declarative (logical) reading: For all variables, A is true. Procedural (operational) reading: A is solved. Rules A rule is an expression of the form: A0 :- A1, ... , An. where each Ai is an atomic formula. Examples: path(X,Y) :- edge(X,Y). father(X,Y) :- parent(X,Y), male(X). Interpretation Rules Consider a rule A0 :- A1, ... , An. Declarative (logical) reading: For all variables, A0 if A1 and...and An. Procedural (operational) reading: To solve A0, first solve A1, then A2 etc. Example gp(X,Y) :- p(X,Z), p(Z,Y). p(X,Y) :- f(X,Y). p(X,Y) :- m(X,Y). f(adam,bill). f(bill,carl). m(anne,bill). Queries A query is an expression of the form: ?- A1, ..., An. where n=0,1,2,... and A1, ..., An are atomic formulas. Examples: ?- father(X, bill). ?- parent(X, bill), male(X). Interpretation Queries Consider a query ?- A1, ... , An. Declarative (logical) reading: Are there variables such that A1 and...and An? Procedural (operational) reading: First solve A1, then A2 etc Ground SLD-Resolution ?- A1,A2,...,An. A1 :- B1,...,Bm. ?- B1,...,Bm,A2,...,An. where A1 :- B1,...,Bm is an instantiated program clause. A Derivation parent(X,Y) :father(X,Y). parent(X,Y) :mother(X,Y). father(adam,bill). mother(anne,bill). ?- parent(adam,bill) ?- father(adam,bill) ?- true Another Derivation parent(X,Y) :father(X,Y). parent(X,Y) :mother(X,Y). father(adam,bill). mother(anne,bill). ?- parent(anne,bill) ?- mother(anne,bill) ?- true Full SLD-Resolution ?- A1,A2,...,An. B0 :- B1,...,Bm. ?- (B A1= B0, mB,A 1,...,B m,A 2,...,An. 1,...,B 2,...,A n)q. where: • B0 :- B1,...,Bm is a renamed program clause. • q is a solution to the equation A1 = B0. Yet Another Derivation ?- parent(X,bill). ?- father(X,bill). X=X1, bill=Y1, father(X1,Y1). ?- true. X=adam, bill=bill. parent(X1,Y1) father(adam,bill). Answer::-X=adam father(X1,Y1). And Another One... ?- gp(X,Y). X=adam ?- p(X,Z1), X=X1, Y=Y1, p(Z1,Y). p(X1,Z1), p(Z1,Y1). Y=carl ?- f(X,Z1), X=X2, Z1=Y2, p(Z1,Y). f(X2,Y2), p(Z1,Y). ?- X=adam,Z1=bill, p(Z1,Y). p(bill,Y). ?- f(bill,Y). bill=X3, Y=Y3, f(X3,Y3). ?- bill=bill, true. Y=carl. gp(X1,Y1) p(X2,Y2) p(X3,Y3) f(adam,bill). :f(bill,carl). p(X1,Z1),p(Z1,Y1). :- f(X3,Y3). f(X2,Y2). And a Failed One... ?- gp(X,Y). X=bill ?- p(X,Z1), X=X1, Y=Y1, p(Z1,Y). p(X1,Z1), p(Z1,Y1). ?- f(X,Z1), X=X2, Z1=Y2, p(Z1,Y). f(X2,Y2), p(Z1,Y). ?- X=bill,Z1=carl, p(Z1,Y). p(carl,Y). ?- f(carl,Y). carl=X3, Y=Y3, f(X3,Y3). ?- fail. gp(X1,Y1) p(X2,Y2) p(X3,Y3) FAILURE!!! :f(bill,carl). p(X1,Z1),p(Z1,Y1). :- f(X3,Y3). f(X2,Y2). SLD-Tree ?- gp(X,Y). ?- p(X,Z),p(Z,Y). X=adam ?- f(X,Z),p(Z,Y). ?- p(bill,Y). X=anne ?- m(X,Z),p(Z,Y). ?- p(carl,Y). ?- p(bill,Y). ?- f(carl,Y). ?- m(carl,Y). ?- f(bill,Y). ?- f(bill,Y). ?- m(bill,Y). ?- true. Y=carl ?- fail. ?- fail. ?-?-fail. true. Y=carl ?- m(bill,Y). ?- fail. Example /* inv(In, Out) */ inv(0, 1). inv(1, 0). /* and(In1, In2, Out) */ and(0, 0, 0). and(0, 1, 0). and(1, 0, 0). and(1, 1, 1). /* or(In1, In2, Out) */ or(0, 0, 0). or(0, 1, 1). or(1, 0, 1). or(1, 1, 1). /* nand(In1, In2, Out) */ nand(X, Y, Z) :and(X, Y, Tmp), inv(Tmp, Z). Database lecturer(Lecturer,Course) :course(Course,_,Lecturer,_). teaches(Lect,Day) :course(_, time(Day,_,_), Lect, _). duration(Course,Length) :course(Course,time(_,S,F),_,_), plus(S,Length,F). occupied(Room,Day,Time) :course(_,time(Day,S,F),_,Room), S =< Time, Time =< F. % Database course(logic, time(monday, 8, 10), dave, a12). ... Recursion b d f c e g a edge(a,b). edge(a,c). edge(b,d). edge(c,d). edge(d,e). edge(f,g). path(Node,Node). path(Node1,Node3) :edge(Node1,Node2), path(Node2,Node3). List Notation . a a . . b b c c .(a, .(b, .(c, []))) [] More On List Notation The empty list: [] A non-empty list: .(X,Y) or [X|Y] Syntactic Sugar: [b] instead of [b|[]] and .(b, []) [a,b] instead of [a|[b]] and [a|[b|[]]] [a,b|X] instead of [a|[b|X]] List manipulation list([ ]). list([X|Xs]) :- list(Xs). member(X,[X|Xs]). member(X,[Y|Ys]) :- member(X,Ys). append([ ],Ys,Ys). append([X|Xs],Ys,[X|Zs]) :- append(Xs,Ys,Zs). List Manipulation % reverse(A, B) % B is A in reverse order reverse([ ],[ ]). reverse([X|Xs],Zs) :- reverse(Xs,Ys), append(Ys,[X],Zs). % Alternative version reverse(Xs,Ys) :- reverse(Xs,[ ],Ys). reverse([ ],Ys,Ys). reverse([X|Xs],Acc,Ys) :- reverse(Xs,[X|Acc],Ys). Insertion Sort % sort(A,B) % B is a sorted version of A sort([X|Xs],Ys) :- sort(Xs,Zs), insert(X,Zs,Ys). sort([ ],[ ]). % insert(A,B,C) % if B is a sorted list, then C is sorted % and contains all elements in B plus A insert(X,[ ],[X]). insert(X,[Y|Ys],[Y|Zs]) :- X > Y, insert(X,Ys,Zs). insert(X,[Y|Ys],[X,Y|Ys]) :- X =< Y. Binary Trees % binary_tree(A) % A is a binary tree binary_tree(void). binary_tree(tree(Element,Left,Right)) :binary_tree(Left), binary_tree(Right). % tree_member(A,B) % A is a node in the tree B tree_member(X,tree(X,_,_)). tree_member(X,tree(_,Left,_)) :- tree_member(X,Left). tree_member(X,tree(_,_,Right)) :- tree_member(X,Right). Built In Predicates setof(X, p(X), S) ~ S is the set of all X such that p(X) bagof(X, p(X), B) ~ B is the sequence of all X such that p(X) findall(X, p(X), B) B is the sequence of all X such that p(X) Negation Prolog contains a weak form of negation called “negation as failure”. Written: \+ p(a) A query ?- \+ p(a) succeeds if the query ?- p(a) fails finitely. Robust only when the goal contains no variables. (Use only as a test!) Example Negation a b on_top(X) :- \+ blocked(X). blocked(X) :- on(Y, X). on(a, b). %---------------------------?- on_top(a). yes