CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming Outline: Motivation. Examples: The Grandmother relation. Formulation in Prolog. Formulation using Lisp syntax (Mock Prolog). List manipulation using logic. Logic, clauses, and Horn clauses. Unification. The Backtracking Search Resolver. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming Motivation 1. Reduce the programming burden. 2. System should simply accept the necessary information and the objective (goal), and then figure out its own solution. 3. Have a program that looks more like its own specification. 4. Take advantage of logical inference to automatically get many of the consequences of the given information. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming Sample Problem For someone (call him or her X) to be the grandmother of someone else (call him or her Y), X must be the mother of someone (call him or her Z) who is a parent of Y. Someone is a parent of another person, if that someone is either the mother or the father of the other person. Mary is the mother of Stan. Gwen is the mother of Alice. Valery is the mother of Gwen. Stan is the father of Alice. The question: Who is a grandmother of Alice? CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
Sample Prolog Program: grandmother.pl grandmother(X, Y) :- mother(X, Z), parent(Z, Y). parent(X, Y) :- mother(X, Y). parent(X, Y) :- father(X, Y). mother(mary, stan). mother(gwen, alice). mother(valery, gwen). father(stan, alice). CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming Sample Prolog Session Welcome to SWI-Prolog (Version 3.3.2) Copyright (c) 1990-2000 University of Amsterdam. All rights reserved. For help, use ?- help(Topic). or ?- apropos(Word). ?- [grandmother]. % grandmother compiled 0.00 sec, 1,312 bytes Yes ?- grandmother(X, alice). X = mary ; X = valery ; No ?- CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
Example with Lisp Syntax ; courses.lsp Some prerequisite relationships ((prereq cse142 cse143)) ((prereq cse143 cse373)) ((prereq cse373 cse415)) ; To prove X must come before Y, it’s ; enough to show that X is a prereq. for y. ((before X Y) (prereq X Y)) ; Alternatively, one can show X must come ; before Y by showing that for some Z, ; X is a prereq of Z and Z comes before y. ((before X Y) (prereq X Z) (before Z Y)) ; Before(x,y) v ~Prereq(x,z) v ~Before(z,y) ; ( <head> <-- <atomic formula 1> <af2> ...<afn>) CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming A Session (load ”prolog.lsp” ) (setq *database* ’( ((prereq cse142 cse143)) . . . ) ) (query ’((prereq cse142, X))) X=CSE143 CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming A session (cont) (query a ’(prereq X Y)) X = CSE142; Y = CSE143; X = CSE143; Y = CSE373; X = CSE373; Y = CSE415; CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming A session (cont) (query ’(before X cse373)) X = cse143; X = cse142 ; CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
Lists in Prolog: Transformations can be Expressed Declaratively colors([r, g, b]). ?- colors(L). L = [r, g, b] ?- colors([X|Y]). X = r, Y = [g, b] % X is the head. Y is the tail. ?- mylist([a, [b, c]]). CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
Defining Predicates on Lists car([X|L], X). cdr([X|L], L). cons(X, L, [X|L]). ?- car([a, b, c], X). X = a ?- cdr([a, b, c], X). X = [b, c] ?- cons(a, [b, c], X). X = [a, b, c] CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming concat a.k.a. append concat([], L, L). concat([X|L1], L2, [X|L3]) :- concat(L1, L2, L3). ?- concat([a, b, c], [d, e], X). X = [a, b, c, d, e] ?- concat(X, [d, e], [a, b, c, d, e]). X = [a, b, c] CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming concat used backwards ?- concat(X, Y, [x, y, z]). X = [] Y = [x, y, z] ; X = [x] Y = [y, z] ; X = [x, y] Y = [z] ; X = [x, y, z] Y = [] ; No CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
Logic Prog. vs Functional Prog. Functional programming: evaluation is one-way. Logic programming: evaluation can be two-way. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
Steps in Writing a Logic Program 1. Formulate assertions in English and translate them into Logic, then into Prolog or Mock Prolog. or 2. Program directly in Prolog or Mock Prolog. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming Predicate Logic “Every Macintosh computer uses electricity.” (all x) (Macintosh(x) implies UsesElectricity(x)) variables: x, y, z, etc. constants: a, b, c, etc. function symbols: f, g, etc. Predicate symbols: P, Q, Macintosh, UsesElectricity quantifiers: forall, exists Logical connectives: not, implies, and, or. ~, ->, &, v. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming Clause Form (all x) (Macintosh(x) -> UsesElectricity(x) UsesElectricity(x) v Not Macintosh(x). Any boolean formula can be put into conjunctive normal form (CNF). If not Y then X and not Z. Y or (X & not Z) (Y or X & (Y or not Z) (X v Y) & (Y v ~Z) clauses: (X v Y), (Y v ~Z) X, Y, and ~Z are called literals. Each clause is a disjunction of literals. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming Horn Clauses Horn clause: at most one unnegated literal (X v Y) is not a Horn clause. (Y v ~Z) is a Horn clause. “If X is the mother of Y and Y is a parent of Z, then X is a grandmother of Z.” (m(X,Y) & p(Y, Z)) -> g(X,Z). grandmother(X, Z) provided mother(X, Y) and parent (Y, Z) g(X,Z) :- m(X,Y), p(Y,Z). ; Edinburgh Prolog syntax grandmother(X, Z) :- % head mother(X, Y), % subgoal 1 parent(Y, Z). % subgoal 2 CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
How Does Matching Work in Prolog? Literals are matched using a method called unification. The scope of a variable in Prolog is a single clause. Unification involves substituting “terms” for variables. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
Unification of Literals A substitution is a set of term/variable pairs. { f(a)/x, b/y, z/w } A unifier for a pair of literals is a substitution that when applied to both literals, makes them identical. P(x, a), P(f(a), y) have the unifier { f(a)/x, a/y } P(x), P(y) have the unifier { a/x, a/y }, but they also have the unifier { x/y }. The latter is more general because after unifying with { x/y} we get P(x) whereas with the other it is P(a), yet we can obtain the latter from the former with an additional substitution { a/x }. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
Horn-Clause Resolution Example of resolution with the grandmother rules: g(X, Z) :- m(X, Y), p(Y, Z). m(X, Y) :- p(X, Y), f(X). g(X, Z) :- p(X, Y), f(X), p(Y, Z). more generally, from: P :- Q1, Q2. Q1 :- R1, R2. we obtain the resolvent: P :- R1, R2, Q2 CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming
A Backtracking Horn-Clause Resolver Maintain the rules in a database of rules. Accept a query (goal) as a positive unit clause, e.g., P(a, b). Put this goal on the subgoal list. Repeatedly try to satisfy the next clause on the subgoal list as follows: Find a rule in the database whose head unifies with the subgoal. Apply the same unifier to the literals in the body of that rule and replace the subgoal by these new literals. If the subgoal list is empty, stop. The combined set of unifiers includes the solution. CSE 415 -- (c) S. Tanimoto, 2004 Logic Programming