By Neng-Fa Zhou Logic Programming 4 Logic-based –Adopt the syntax from logic for both data and...

54
by Neng-Fa Zhou Logic Programming Logic-based Adopt the syntax from logic for both data and programs A logic variable is a symbol for an object in a domain Use resolution to infer new propositions from given ones Declarative: state what should be done rather than how Language features of Prolog A program consists of relations defined by facts and rules Pattern matching Recursion Nondeterminism realized through backtracking
  • date post

    21-Dec-2015
  • Category

    Documents

  • view

    219
  • download

    0

Transcript of By Neng-Fa Zhou Logic Programming 4 Logic-based –Adopt the syntax from logic for both data and...

by Neng-Fa Zhou

Logic Programming

Logic-based – Adopt the syntax from logic for both data and programs

– A logic variable is a symbol for an object in a domain

– Use resolution to infer new propositions from given ones

– Declarative: state what should be done rather than how

Language features of Prolog– A program consists of relations defined by facts and rules

– Pattern matching

– Recursion

– Nondeterminism realized through backtracking

by Neng-Fa Zhou

A Brief History

Robinson’s resolution theorem prover (65) Colmerauer’s NLP project and Q system (early

70’s) Kowalski’s Horn clauses and SLD resolution (early

70’s) D.H.D. Warren’s work in the implementation (late

70’s) Japanese Fifth Generation Project and follow-up

projects in Europe and USA (early 80’s) Constraint logic programming (late 80’s)

by Neng-Fa Zhou

Syntax of Prolog

Term• Atom

– string of letters, digits, and '_' starting with a low-case letter

– string of characters enclosed in quotes

• Number– integer & real

• Variable– string of letters, digits and '_' starting with a capital letter

or '_'

by Neng-Fa Zhou

Syntax of Prolog (Cont)

• Structure– f(t1,t2,...,tn)

» f is an atom, called the functor of the structure

» t1,t2,...,tn are terms

• List– '.'(H,T) => [H|T]

– '.'(1,'.'(2,'.'(3,[]))) => [1,2,3]

by Neng-Fa Zhou

Syntax of Prolog (Cont)

Clause• Fact

– p(t1,t2,...,tn)

• Rule– H :- B1,B2,...,Bm.

Predicate• a sequence of clauses

Program• a set of predicates

Query

Head

Body

by Neng-Fa Zhou

Syntax: Examples

Facts

Rules

Queries

father(terach,abraham).male(terach).

parent(Parent,Child):-father(Parent,Child).

parent(Parent,Child):-mother(Parent,Child).

uncle(Uncle,Person) :- brother(Uncle,Parent), parent(Parent,Person).

?-parent(Parent,abraham).

by Neng-Fa Zhou

Unification

t1 = t2 succeeds if– t1 and t2 are identical– there exists a substitution for the variables in

t1 and t2 such that t1 = t2

f(X,b)=f(a,Y).X=aY=b

= {X/a, Y/b}

by Neng-Fa Zhou

Unification: Examples

?-X=1.X=1?- f(a,b)=f(a,b).yes?- a=b.no?- f(X,Y)=f(a,b)X=aY=b?-f(X,b)=f(a,Y).X=aY=b?-X = f(X).X=f(f(......

assignment

test

test

matching

unification

without occur checking

by Neng-Fa Zhou

Unification

unify(t1,t2)– if t1 is a variable, then bind t1 to t2– if t2 is a variable, then bind t2 to t1– if t1 and t2 are both atomic values

• if t1 and t2 are identical return true• otherwise, return false

– t1=f(a1,...,an) and t2=g(b1,...,bm)• if f != g || m != n return false• return unify(a1,b1) && ... && unify(an,bm)

by Neng-Fa Zhou

Operational Semantics of Prolog (Resolution)

G0: initial query

Gi: (A1,A2,...,An)

H:-B1,...,Bm

A1=H1

Gi+1: (B1,...,Bm,A2,...,An)

Succeed if Gk is empty for some k.Backtrack if Gk is a dead end (no clause can be used).

by Neng-Fa Zhou

Deductive Database

parent(Parent,Child):-father(Parent,Child).

parent(Parent,Child):-mother(Parent,Child).

uncle(Uncle,Person) :-

brother(Uncle,Parent), parent(Parent,Person).

sibling(Sib1,Sib2) :-

parent(Parent,Sib1),

parent(Parent,Sib2),

Sib1 \= Sib2.

cousin(Cousin1,Cousin2) :-

parent(Parent1,Cousin1),

parent(Parent2,Cousin2),

sibling(Parent1,Parent2).

by Neng-Fa Zhou

Exercise

Will the following unification operations succeed or fail? If they succeed, what are the substitutions?

• point(A,B) = point(1,2)

• point(A,B) = point(X,Y,Z)

• plus(2,2) = 4

• +(2,D) = +(E,2)

• tri(point(-1,0),P2,P3) = tri(P1,point(1,0),point(0,Y))

by Neng-Fa Zhou

Exercise

Define the following relations – son(X,Y) -- X is a son of Y– daughter(X,Y) -- X is a daughter of Y– grandfather(X,Y) -- X is the grandfather of Y– grandparent(X,Y) -- X is a grandparent of Y– ancestor(X,Y) – X is an ancestor of Y

by Neng-Fa Zhou

Built-ins in Prolog

Unification– T1 = T2– T1 \= T2

Arithmetic• X is Exp

• Exp =:= Exp, Exp =\= Exp

• Exp >= Exp, Exp > Exp

• Exp =< Exp, Exp < Exp

X can be a variable or a ground expression

Exp must be a groundexpression

by Neng-Fa Zhou

Examples(=, \=, is, =:=, =\=, >, >=, <, =<)

by Neng-Fa Zhou

Built-ins in Prolog (cont.)

arg(N,T,A)– The Nth argument of T is A

functor(T,F,N)– the functor of T is F/N.

T1==T2– T1 and T2 are identical

T1 \== T2– T1 and T2 are not identical

by Neng-Fa Zhou

Examples(arg, functor, ==, \==)

by Neng-Fa Zhou

Recursive Programming

Recursively defined data structures– S-expressions

•0, s(0), s(s(0)), …

– Lists•[], [X|L]

– Binary trees•void, t(N,L,R)

by Neng-Fa Zhou

Recursive Programming on S-Expressions Definition of S-Expressions

– 0, s(0), s(s(0)),....

sum(X,Y,Z) -- X+Y makes Z

prod(X,Y,Z) -- X*Y makes Z

sum(0,Y,Y).sum(s(X),Y,s(Z)):-sum(X,Y,Z).

prod(0,Y,0).prod(s(X),Y,Z):-

prod(X,Y,Z1), sum(Z1,Y,Z).

by Neng-Fa Zhou

int2s(0,0).int2s(N,s(S)):-

N>0, N1 is N-1, int2s(N1,S).

Recursive Programming on S-Expressions (Cont.) Conversion of integers to s-expressions

by Neng-Fa Zhou

Exercise

Define the following arithmetic operations on natural numbers.– power(X,Y,Z) XY=Z– factorial(X,Y) X!=Y– lt(X,Y) X is less than Y– one_hundred(X) X = 100 (s(s(....(s(0)))...)– sum_1_to_100(X) X = 1+2+...+100

by Neng-Fa Zhou

Recursive Programming on Lists

A list is a special structure whose functor is '.'/2

– []– '.'(H,T) => [H|T]– '.'(1,'.'(2,'.'(3,[]))) => [1,2,3]

Unification of lists– [X|Xs]=[1,2,3]

X= 1 Xs=[2,3]– [1,2,3] = [1|[2|X]]

X=[3]– [1,2|3] = [1|X]

X=[2|3]

by Neng-Fa Zhou

Relations on Lists

isList(Xs)

member(X,Xs)

append(Xs,Ys,Zs)

length(Xs,N)

isList([]).isList([X|Xs]):-isList(Xs).

member(X,[X|Xs]).member(X,[_|Xs]):-member(X,Xs).

append([],Ys,Ys).append([X|Xs],Ys,[X|Zs]):-append(Xs,Ys,Zs).

length([],0).length([X|Xs],N):-length(Xs,N1),N is N1+1.

by Neng-Fa Zhou

Exercise

Implement the following predicates.– length(Xs,N)

• the length of Xs is N

– last(X,Xs)• X is the last element of

Xs.

– prefix(Pre,Xs)• Pre is a prefix of Xs.

– suffix(Pos,Xs)• suffix is a postfix of Xs

– reverse(Xs,Ys)• Ys is the reverse of Xs

– sum(Xs,N) • N is the sum of the

integers in the list Xs

– sum1(Xs,Ys)• assume Xs is

[x1,x2,...,xn], then Ys will be [y1,y2,...,yn] where yi is xi+1.

– sort(L,SortedL)• use the exchange sort

algorithm

by Neng-Fa Zhou

Recursive Programming on Binary Trees

Representation of binary trees

Example

void -- empty treet(N, L,R) -- N : node

L : Left childR : Right child

a

b c

t(a, t(b, void,void), t(c,void,void))

by Neng-Fa Zhou

Relations on Binary Trees

isBinaryTree(T)-- T is a binary tree

count(T,C) -- C is the number of nodes in T.

isBinaryTree(void).isBinaryTree(t(N,L,R)):-

isBinaryTree(L),isBinaryTree(R).

count(void,0).count(t(N,L,R),N):-

count(L,N1),count(R,N2),N is N1+N2+1.

by Neng-Fa Zhou

Relations on Binary Trees (Cont.) preorder(T,L)

•L is a pre-order traversal of the binary tree T.

preorder(void,[]).preorder(t(N,Left,Right),L):-

preorder(Left,L1),preorder(Right,L2),append([N|L1],L2,L).

by Neng-Fa Zhou

Exercise

Write the following predicates on binary trees.– leaves(T,L): L is the list of leaves in T.

The order is preserved.– equal(T1,T2): T1 and T2 are the same

tree.– postorder(T,L): L is the post-order

traversal of T.

by Neng-Fa Zhou

Tail Recursive Programs and Difference Lists Recursion is slower and consumes more

space than iteration. Prolog compilers perform Tail-Recursion-

Optimization, which converts tail recursion into iteration.

In general, tail-recursive programs are more efficient than non-tail-recursive programs.

by Neng-Fa Zhou

Tail-Recursive PredicatesExample: product

prod(0,Y,0).prod(s(X),Y,Z):-

prod(X,Y,Z1),sum(Z1,Y,Z).

prod(X,Y,Z):-prod(X,Y,0,Z).

prod(0,Y,Z,Z).prod(s(X),Y,Z0,Z):-

sum(Y,Z0,Z1),prod(X,Y,Z1,Z).

Accumulator

by Neng-Fa Zhou

Example: length

length([],0).length([X|Xs],N):-

length(Xs,N1),N is N1+1.

length(Xs,N):-length(Xs,0,N).

length([],N,N).length([X|Xs],N0,N):-

N1 is N0+1,length(Xs,N1,N).

by Neng-Fa Zhou

Example: reverse

reverse([],[]).reverse([X|Xs],Zs):-

reverse(Xs,Ys),append(Ys,[X],Zs).

reverse(Xs,Ys):-reverse(Xs,[],Ys).

reverse([],Ys,Ys).reverse([X|Xs],Ys0,Ys):-

reverse(Xs,[X|Ys0],Ys).

by Neng-Fa Zhou

Example: count

count(void,0).count(t(N,L,R),N):-

count(L,N1),count(R,N2),N is N1+N2+1.

count(T,N):-count(T,0,N).

count(void,N,N).count(t(N,L,R),N0,N):-

N1 is N0+1,count(L,N1,N2),count(R,N2,N).

by Neng-Fa Zhou

Difference Lists

leaves(void,[]).leaves(t(N,void,void),L):-!,

L=[N].leaves(t(N,Left,Right),L):-

leaves(Left,L1),leaves(Right,L2),append(L1,L2,L).

leaves(T,L):-leaves(T,L,[]).

leaves(void,L,L).leaves(t(N,void,void),L,LR):-!,L=[N|LR].leaves(t(N,Left,Right),L,LR):-

leaves(Left,L,L1),leaves(Right,L1,LR).

L-[] equals L

L-L equals []

L-LR equals (L-L1) + (L1-LR)

by Neng-Fa Zhou

Exercises

Define the following predicates and convert them into tail-recursive ones.– merge(L1,L2,L)

• L is the merge of two sorted lists L1 and L2. L must be sorted too.

– preorder(T,L)• L is the list of nodes in the binary tree T in pre-

order.

by Neng-Fa Zhou

Backtracking and Its Control

For a goal and a program, Prolog constructs and explores the search tree (SLD-tree) through backtracking, i.e., top-down and from left to right.

Prolog provides an operator '!' (called cut) for pruning useless branches.

by Neng-Fa Zhou

Gi: (A1,A2,...,An)

H:-B1,...,Bm

A1=H1

Gi+1: (B1,...,Bm,A2,...,An)

The Meaning of Backtracking

When Gi+1 fails, – undo the bindings of the variables in Gi – apply an alternative clause to A1

• A1 fails if no such a clause is available, which will cause G i to fail.

by Neng-Fa Zhou

BacktrackingExample

p(a).p(b).p(c).

p(X)

[] [] []

X=a X=b X=c

by Neng-Fa Zhou

BacktrackingExample

p(a). q(1).p(b). q(2)p(c). p(X),q(Y)

q(Y)X=a X=b X=c

[] []

Y=1 Y=2q(Y)

[] []

Y=1 Y=2

q(Y)

[] []

Y=1 Y=2

by Neng-Fa Zhou

member(X,[X|Xs]).member(X,[_|Xs]):-member(X,Xs).

BacktrackingExample-- member

Can be used in two different ways– test whether the element is a member of the list

• member(b,[a,b,c])

– pickup elements from the list one by one• member(X,[a,b,c])

by Neng-Fa Zhou

BacktrackingExample -- select select(Xs,X,Rest)

– X is an element in Xs and Rest is Xs but without X.

select([X|Xs],X,Xs).select([X|Xs],Y,[X|Xs1]):-select(Xs,Y,Xs1).

by Neng-Fa Zhou

BacktrackingExample -- permutation permutation(Xs,Ys)

– Ys is a permutation of Xs

permutation([],[]).permutation(Xs,[X|Ys]):-

select(Xs,X,Xs1), permutation(Xs1,Ys).

by Neng-Fa Zhou

Exercises

Define the following predicates– subset(Xs,Ys)

• Xs is a subset of Ys. Assume Xs and Ys do not contain duplicates.

– intersect(Xs,Ys,Zs)• Zs is the intersect of Xs and Ys.

by Neng-Fa Zhou

BacktrackingExample -- permutation sort sort(Xs,SortedXs)

– SortedXs is Xs sorted in ascending order

sort(Xs,SortedXs):-permutation(Xs,SortedXs), %generatorsorted(SortedXs). %test

sorted([]).sorted([X]). sorted([X1,X2|Xs]):-

X1=<X2,sorted([X2|Xs]).

by Neng-Fa Zhou

BacktrackingN-queens problem Find a layout for the N queens on an N by N chessboard such that no

queens attack each other. Two queens attack each other if they are in the same row, the same column, or the same diagonal.

Xi: the number of the row for the ith queen.for each two variables Xi and Xj

Xi =\= Xj %not same rowXi=\=Xj+(j-i) %not same diagonalXi=\=Xj-(j-i)

by Neng-Fa Zhou

N-queens problem (cont.)queens(N,Qs):-

range(1,N,Ns),permutation(Ns,Qs),notAttack(Qs).

range(N0,N,Ns):-N0=:=N,Ns=[N].

range(N0,N,Ns):-N0<N,Ns=[N0|Ns1],N1 is N0+1,range(N1,N,Ns1).

notAttack([]).notAttack([X|Xs]):-

notAttack(X,Xs,1),notAttack(Xs).

notAttack(X,[],K).notAttack(X,[Y|Ys],K):-

X=\=Y,X=\=Y+K,X=\=Y-K,K1 is K+1,notAttack(X,Ys,K1).

by Neng-Fa Zhou

N-queens problem (cont.)Test partial solutions ASA

queens(N,Qs):-range(1,N,Ns),queens(Ns,[],Qs).

queens([],Qs,Qs).queens(Xs,Qs0,Qs):-

select(Xs,X,Xs1),notAttack(X,Qs0,1),queens(Xs1,[X|Qs0],Qs).

by Neng-Fa Zhou

Exercises

1.Write a program to solve the following puzzle.• Given eight letters S,E, N, D, M, O, R and Y, one is required to assign a digit

between 0 and 9 to each letter such that all the letters have different values and the equation SEND + MORE = MONEY is satisfied.

2. Write a program to color the map of Western Europe. The map is given in the following. map(west_europe, [ region(portugal,P,[E]),

region(spain,E,[F,P]), region(france,F,[E,I,S,B,WG,L]), region(belgium,B,[F,H,L,WG]),region(holland,H,[B,WG]), region(west_germany,WG,[F,A,S,H,B,L]), region(luxembourg,L,[F,B,WG]), region(italy,I,[F,A,S]), region(switzerland,S,[F,I,A,WG]), region(austria,A,[I,S,WG])]).

by Neng-Fa Zhou

Controlling Backtracking

Use cut to express if-then-elseintersect([],Ys,[]).intersect([X|Xs],Ys,[X|Zs]):-

member(X,Ys),intersect(Xs,Ys,Zs).

intersect([X|Xs],Ys,Zs):-not member(X,Ys),intersect(Xs,Ys,Zs).

intersect([],Ys,[]).intersect([X|Xs],Ys,[X|Zs]):-

member(X,Ys),!,intersect(Xs,Ys,Zs).

intersect([X|Xs],Ys,Zs):-not member(X,Ys),intersect(Xs,Ys,Zs).

by Neng-Fa Zhou

Controlling Backtracking (Cont.)

Use cut to express negation-as-failurenot(Call):-

call(Call),!,fail.

not(Call).

by Neng-Fa Zhou

The Meaning of Cut

A cut prunes all clauses below it. A cut prunes all the choices of the subgoals

that occur to the left of it.

G G:-A....

A:-Bl,!,Br....A

Bl,!,Br The cut discards the branchesof A and Bl.

The search will proceed from here when Br fails

by Neng-Fa Zhou

The Cut is Non-logical

What is the answer of max(2,5,2) for the following definition?

Are member(X,[1,2,3]) and not(not(member(X,[1,2,3])) equivalent?

max(X,Y,Y):-Y>=X,!.max(X,Y,X).

by Neng-Fa Zhou

Exercises

p(a).p(b).p(c).q(1).q(2).

How many solutions do the following queries have?

?-p(X),q(Y),!.

?-p(X),!,q(Y).

?-!,p(X),q(Y).

by Neng-Fa Zhou

Exercises (cont.)

Insert cuts to improve the efficiency of the following predicates:

Explain why not(not(Call)) is not the same as Call.

range(N0,N,Ns):-N0>=N,Ns=[N].

range(N0,N,Ns):-N0<N,Ns=[N0|Ns1],N1 is N0+1,range(N1,N,Ns1).

max(X,Y,Z):-X>=Y,Z=X.max(X,Y,Z):-X<Y,Z=Y.