Prolog -Cpt114 - Week3

50
PROLOG Week 3

description

 

Transcript of Prolog -Cpt114 - Week3

Page 1: Prolog -Cpt114 - Week3

PROLOGWeek 3

Page 2: Prolog -Cpt114 - Week3

OBJECTIVES FOR THIS SESSION

The Lists in Prolog

Tracing

Page 3: Prolog -Cpt114 - Week3

SIMPLE LISTS IN PROLOG

Page 4: Prolog -Cpt114 - Week3

HOW TO MAKE A LIST IN PROLOG

pam tom

bob liz

pat

jim

ann

Page 5: Prolog -Cpt114 - Week3

HOW TO MAKE A LIST IN PROLOG

pam tom

bob liz

pat

jim

ann

parent(pam, bob).parent(tom, bob).parent(tom, liz).parent(bob, pat).parent(pat, jim).female(pam).female(liz).female(pat).male(tom).male(bob).male(jim).

Page 6: Prolog -Cpt114 - Week3

HOW TO MAKE A LIST IN PROLOGpam tom

bob liz

pat

jim

ann

Page 7: Prolog -Cpt114 - Week3

HOW FINDALL WORKS

findall(X,predecessor(pam,X),Preds).

Output listThe query variable

Page 8: Prolog -Cpt114 - Week3

8

EXAMPLE1

The following conversation with Prolog:

?- Hobbies1 = [tennis, music],

Hobbies2 = [skiing, food],

L = [ann, Hobbies1, tom, Hobbies2].

Hobbies1 = [tennis, music]

Hobbies2 = [skiing, food]

L = [ann, [tennis, music], tom, [skiing, food] ]

Page 9: Prolog -Cpt114 - Week3

EXAMPLE2

Treat the whole tail as a single object:L = [a, b, c]

Tail = [b, c]

L = .(a, Tail)

L = [a | Tail]

[a, b, c] = [a | [b, c] ] = [a, b | [c] ] = [a, b, c | [ ] ]

Page 10: Prolog -Cpt114 - Week3

EXAMPLE2

Treat the whole tail as a single object:L = [a, b, c]

Tail = [b, c]

L = .(a, Tail)

L = [a | Tail]

[a, b, c] = [a | [b, c] ] = [a, b | [c] ] = [a, b, c | [ ] ]

Page 11: Prolog -Cpt114 - Week3

MEMBERSHIP

X is a member of L either:1) X is the head of L, or2) X is a member of the tail of L.member(X, L)

Can be written in two clauses:member(X, [X | Tail] ). %simple fact

member(X, [Head | Tail] ) :-

member(X, Tail). %rule Example:

member(b, [a,b,c] ). %true

member(b, [a,[b,c]] ). %false, the tail is [b,c]

member([b,c],[a,[b,c]] ). %true

Page 12: Prolog -Cpt114 - Week3

MEMBERSHIP

Simple other tests:

findall(X,parent(X,_),Parents).

Parents = [pam, tom, tom, bob, pat].

Is pam a member of Parents????member(pam, [pam, tom,bob, pat]).

Page 13: Prolog -Cpt114 - Week3

MEMBERSHIP

Parents = [pam, tom, tom, bob, pat].

Is pam a member of HEAD of Parents????

member(pam,[pam,Parents]).

Page 14: Prolog -Cpt114 - Week3

HEAD AND TAIL

A non-empty list can be thought of as consisting of two parts The head The tail

The head is the first item in the list The tail is everything else

The tail is the list that remains when we take the first element away

The tail of a list is always a list

Page 15: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 1

[mia, vincent, jules, yolanda]

Head: Tail:

Page 16: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 1

[mia, vincent, jules, yolanda]

Head: miaTail:

Page 17: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 1

[mia, vincent, jules, yolanda]

Head: miaTail: [vincent, jules, yolanda]

Page 18: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 2

[[ ], dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]]

Head: Tail:

Page 19: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 2

[[ ], dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]]

Head: [ ]Tail:

Page 20: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 2

[[ ], dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]]

Head: [ ]Tail: [dead(z), [2, [b,c]], [ ], Z, [2, [b,c]]]

Page 21: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 3

[dead(z)]

Head: Tail:

Page 22: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 3

[dead(z)]

Head: dead(z) Tail:

Page 23: Prolog -Cpt114 - Week3

HEAD AND TAIL EXAMPLE 3

[dead(z)]

Head: dead(z) Tail: [ ]

Page 24: Prolog -Cpt114 - Week3

THE BUILT-IN OPERATOR |

?- [Head|Tail] = [mia, vincent, jules, yolanda].

Head = miaTail = [vincent,jules,yolanda]yes

?-

Page 25: Prolog -Cpt114 - Week3

THE BUILT-IN OPERATOR |

?- [X|Y] = [mia, vincent, jules, yolanda].

X = miaY = [vincent,jules,yolanda]yes

?-

Page 26: Prolog -Cpt114 - Week3

THE BUILT-IN OPERATOR |

?- [X|Y] = [ ].

no

?-

Page 27: Prolog -Cpt114 - Week3

THE BUILT-IN OPERATOR |?- [X,Y|Tail] = [[ ], dead(z), [2, [b,c]], [], Z, [2, [b,c]]] .

X = [ ]Y = dead(z)Z = _4543 Tail = [[2, [b,c]], [ ], Z, [2, [b,c]]] yes

?-

Page 28: Prolog -Cpt114 - Week3

ANONYMOUS VARIABLE

Suppose we are interested in the second and fourth element of a list

?- [X1,X2,X3,X4|Tail] = [mia, vincent, marsellus, jody, yolanda].X1 = miaX2 = vincentX3 = marsellusX4 = jodyTail = [yolanda]yes

?-

Page 29: Prolog -Cpt114 - Week3

ANONYMOUS VARIABLES

There is a simpler way of obtaining only the information we want:

?- [ _,X2, _,X4|_ ] = [mia, vincent, marsellus, jody, yolanda].X2 = vincentX4 = jodyyes

?-

The underscore is the anonymous variable

Page 30: Prolog -Cpt114 - Week3

THE ANONYMOUS VARIABLE

Is used when you need to use a variable, but you are not interested in what Prolog instantiates it to

Each occurrence of the anonymous variable is independent, i.e. can be bound to something different

Page 31: Prolog -Cpt114 - Week3

MEMBER

One of the most basic things we would like to know is whether something is an element of a list or not

So let`s write a predicate that when given a term X and a list L, tells us whether or not X belongs to L

This predicate is usually called member/2

Page 32: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?-

Page 33: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?- member(yolanda,[yolanda,trudy,vincent,jules]).

Page 34: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?- member(yolanda,[yolanda,trudy,vincent,jules]).yes?-

Page 35: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?- member(vincent,[yolanda,trudy,vincent,jules]).

Page 36: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?- member(vincent,[yolanda,trudy,vincent,jules]).yes?-

Page 37: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?- member(zed,[yolanda,trudy,vincent,jules]).

Page 38: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?- member(zed,[yolanda,trudy,vincent,jules]).no?-

Page 39: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?- member(X,[yolanda,trudy,vincent,jules]).

Page 40: Prolog -Cpt114 - Week3

MEMBER/2

member(X,[X|T]).member(X,[H|T]):- member(X,T).

?- member(X,[yolanda,trudy,vincent,jules]).X = yolanda;X = trudy;X = vincent;X = jules;no

Page 41: Prolog -Cpt114 - Week3

CONCATENATION OF LISTS

For concatenation we first define our rule.

Step 1: if the first list is emptyconc([],L,L).Step2: if first list is not emptyconc(L1,L2,L3)=> conc([X|L1],L2,[X|

L3]):-

conc(L1,L2,L3).

Page 42: Prolog -Cpt114 - Week3

L1X L2

[X|L1]

L3

L3X

L3

Page 43: Prolog -Cpt114 - Week3

SAMPLE OF CONCATENATION

conc([a],[c,d],L).L = [a, c, d].

Page 44: Prolog -Cpt114 - Week3

LENGTH OF A LIST IN PROLOG

len([],0). %% not a Prolog native predicate!len([_|L],N):- len(L,X), N is X + 1.

?- len([a,b,c,d,e,[a,x],t],X).X=7yes?-

Page 45: Prolog -Cpt114 - Week3

SIMPLE TRACE

Page 46: Prolog -Cpt114 - Week3

SIMPLE TRACE

Page 47: Prolog -Cpt114 - Week3

SIMPLE TRACE

Page 48: Prolog -Cpt114 - Week3

COME OUT OF TRACE

Page 49: Prolog -Cpt114 - Week3

GUI TRACER

Page 50: Prolog -Cpt114 - Week3

GUI TRACER