Week 4

49
PROLOG WEEK 4

Transcript of Week 4

Page 1: Week 4

PROLOG

WEEK 4

Page 2: Week 4

Concatenation- Review

Recursive definition Base clause: conc the empty list to any list

produces that same list The recursive step says that when

concatenating a non-empty list [H|T] with a list L, the result is a list with head H and the result of concatenating T and L

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 3: Week 4

How conc/3 works

Two ways to find out: Use trace/0 on some examples Draw a search tree!

Let us consider a simple example

?- conc([a,b,c],[1,2,3], R).

Page 4: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 5: Week 4

How conc works

Two ways to find out: Use trace/0 on some examples Draw a search tree!

Let us consider a simple example

?- conc([a,b,c],[1,2,3], R).

Page 6: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 7: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 8: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 9: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

† R = [a|L0] ?- conc([b,c],[1,2,3],L0)

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 10: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

† R = [a|L0] ?- conc([b,c],[1,2,3],L0) / \

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 11: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

† R = [a|L0] ?- conc([b,c],[1,2,3],L0) / \

† L0=[b|L1] ?- conc([c],[1,2,3],L1)

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 12: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

† R = [a|L0] ?- conc([b,c],[1,2,3],L0) / \

† L0=[b|L1] ?- conc([c],[1,2,3],L1)

/ \

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 13: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

† R = [a|L0] ?- conc([b,c],[1,2,3],L0) / \

† L0=[b|L1] ?- conc([c],[1,2,3],L1)

/ \

† L1=[c|L2] ?- conc([],[1,2,3],L2)

conc([], L, L).conc([H|L1], L2, [H|L3]):- append(L1, L2, L3).

Page 14: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

† R = [a|L0] ?- conc([b,c],[1,2,3],L0) / \

† L0=[b|L1] ?- conc([c],[1,2,3],L1)

/ \

† L1=[c|L2] ?- conc([],[1,2,3],L2)

/ \

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 15: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

† R = [a|L0] ?- conc([b,c],[1,2,3],L0) / \

† L0=[b|L1] ?- conc([c],[1,2,3],L1)

/ \

† L1=[c|L2] ?- conc([],[1,2,3],L2)

/ \

L2=[1,2,3]

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 16: Week 4

Search tree example

?- conc([a,b,c],[1,2,3], R).

/ \

† R = [a|L0] ?- conc([b,c],[1,2,3],L0) / \

† L0=[b|L1] ?- conc([c],[1,2,3],L1)

/ \

† L1=[c|L2] ?- conc([],[1,2,3],L2)

/ \

L2=[1,2,3] †

L2=[1,2,3]L1=[c|L2]=[c,1,2,3]L0=[b|L1]=[b,c,1,2,3]R=[a|L0]=[a,b,c,1,2,3]

conc([], L, L).conc([H|L1], L2, [H|L3]):- conc(L1, L2, L3).

Page 17: Week 4

Small exercise

Consider the following fact. p([H|T], H, T).Lets see what happens when we ask some simple queries.?- p([a,b,c], X, Y).X=aY=[b,c]true?- p([a], X, Y).X=aY=[]true?- p([], X, Y).false

Page 18: Week 4

Print a list with space

print_a_list([]).

print_a_list([H|T]):- write(H),

write(‘ ‘),

print_a_list(T).?- print_a_list([a,b,c,d]).

a b c d.

Page 19: Week 4
Page 20: Week 4

Add a member to a List

Code can be written as below:

add(X,L,[X|L]).

Example:add(a,[1,2,3],L).

Page 21: Week 4

Delete a member from a ListConsider del(X,L,L1), deletes X from L and

puts the new list in L1.

Code can be written as below:del(X,[X|Tail],Tail). % if X is head of the List

Ldel(X,[Y|Tail], [Y|Tail1]):- del(X,Tail,Tail1).

Example:del(1,[1,2,3],L).

Page 22: Week 4

Sublist

S is sublist of L if:(1) L can be decomposed into two lists L1,

L2 and(2) L2 can be decomposed into two lists, S

and some L3L1 L2X member(X,L)

L1 L3S

L2

L

L

[X|L2]

sublist(S,L)

Page 23: Week 4

Sublist

L1 L3S

L2

L

sublist(X,L)

sublist(S,L):-conc(L1,L2,L),conc(S,L3,L2).

Page 24: Week 4

Insertion

insert (X, List, BiggerList) :-

del (X, BiggerList, List).

Page 25: Week 4

Permutations The permutation relation with 2 arguments of 2

lists such that one is a permutation of the other.?- permutation( [a,b,c], P ).

P = [a,b,c];

P = [a,c,b];

P = [b,a,c];

Example:?- permutation( [red,blue,green], P ).P = [red, blue, green];P = [red, green, blue];P = [blue, red, green]; P = [blue, green, red];P = [green, red, blue];P = [green, blue, red];no

X L

L1

Insert X obtain a permutation of [X | L]

L1 is a permutation of L

Page 26: Week 4

1.If the list is empty, new permutation must be emptypermutation([],[]).

2. It the list is not empty it has a form [X|L].

permutation([X|L],P):-permutation(L,L1),insert(X,L1,P).

Page 27: Week 4

Arithmetic

Page 28: Week 4

Predefined operators for basic arithmetic operations: Addition + Subtraction - Multiplication * Division / Power ** Integer division // Modula, the remainder of integer division mod

Example:?- X is 1 + 2.

X = 3 Comparing numerical values e.g.

?- 300 * 35 > 10000.

yes

Page 29: Week 4

CPT114

Operator is force evaluation

?- X is 5/2, Y is 6//2, Z is 5 mod 2.

X = 2.5

Y = 2

Z = 1 Comparison operator

> < >= =< =:= =\=

?- born (Name, Year), Year >= 1990, Year =< 2000.

Page 30: Week 4

Greatest common divisor

(1) If X and Y are equal, then D is sequal to X.

(2) If X < Y, then D is equal to gcd of X and the difference Y – X.

(3) If Y < X, then do the same as in case (2) with X and Y interchanged.

gcd(X, X, X).

gcd(X, Y, D) :- X < Y, Y1 is Y –X, gcd(X, Y1, D).

gcd(X, Y, D) :- Y < X, gcd(Y, X, D).

Exercise For Arithmetic

Page 31: Week 4

Length of list – counting the item in the list.

(1) If the list is empty, then length is 0.

(2) If list not empty, then List = [Head | Tail]; then its length is equal to 1 plus the length of the tail Tail.

len([], 0).len([_|Tail], N) :-

len(Tail, N1), N is 1 + N1.

?- len([a,b,[c,d],e],N).N = 4

Page 32: Week 4
Page 33: Week 4
Page 34: Week 4

Sum of Squares 34

b

ai

i2

sum(A,B,0) :- A > B.sum(A,A,Res) :- Res is A*A.sum(A,B,Res) :-

A < B, T is A + 1,sum(T, B, R),Res is A*A + R.

Page 35: Week 4

Matching vs Arithmetic Comparison

?- 1 + 2 =:= 2 + 1.YES

?- 1 + 2 = 2 + 1.NO

?- A + 1 = 2 + B.A = 2B = 1

35

Page 36: Week 4

Simple Examples

Page 37: Week 4

Matching

?- data(D,M,83) = date(D1,may,Y1) . Matching Rules: if S and T constants, then S & T match if they are the same object.if S is a variable and T is anything, then they match & S is instantiated to T. if T is a

var then T is instantiated to S.if S and T are structures, then they match if :

S and T have the same functorall their correspondinf components match.

Example:     ver(seg(pt(X,Y),pt(X,Y1))).     hor(seg(pt(X,Y),pt(X1,Y))).

    ?- ver(seg(pt(1,1),pt(1,2))).     yes

    ?- ver(seg(pt(1,1),pt(2,Y))).     no

    ?- hor(seg(pt(1,1),pt(2,Y))).     Y=1

    ?- ver(seg(pt(2,3),P)).     P=pt(2,Y)

Page 38: Week 4

Full PROLOG Program: big(bear).             % Clause 1

    big(elephant).       % Clause 2     small(cat).            % Clause 3     brown(bear).        % Clause 4     black(cat).            % Clause 5     gray(elephant).      % Clause 6

dark(Z) :- black(Z);brown(Z). Question:    ?- dark(X), big(X).     X = bear

Page 39: Week 4

Trace the process

   1. Initial goal: dark(X),big(X) 2. dark(X) := black(X) 3. new goal: black(X),big(X) 4.        found black(cat)         .  check big(cat)            no clause found            backtrack to step 3            no other black            backtrack to step 2

    dark(X) :- brown(X),big(X). 5. new goal: brown(X),big(X). 6. found brown(bear)     check big(bear)     both satisfied

Page 40: Week 4

Now Harder Example

Page 41: Week 4

Travel Planning Querying a database of flight

informationtimeTable(Place1, Place2, ListOfFlights).

Form of flight itemdepTime / arrTime / fltNo / days

One day travels

?- route(Place1, Place2, Day, Route).

41

operator

Page 42: Week 4

Examples of Fact and Querytimetable(edinburgh, london,

[ 9:40 / 10:50 / ba4733 / alldays,

13:40 / 14:50 / ba4773 / alldays,

19:40 / 20:50 / ba4833 / [mo,we,fr]]).

Note that ‘:’ should bind stronger than ‘/’.

?- route(london, paris, tu, Route) Form of items in the route

from / to / fltNo / depTime

42

Page 43: Week 4

Prolog Code% A Flight Route Planner

:- op(50, xfy, :).

% route(Place1, Place2, Day, Route).

% Route is a sequence of flights on Day, starting at Place1 and ending at Place2

route(P1, P2, Day, [P1 / P2 / Fnum / Deptime]) :-

flight(P1, P2, Day, Fnum, Deptime, _).

% direct flight

route(P1, P2, Day, [(P1 / P3 / Fnum1 / Dep1) | RestRoute]) :-

flight(P1, P3, Day, Fnum1, Dep1, Arr1),

route(P3, P2, Day, RestRoute),

deptime(RestRoute, Dep2),

transfer(Arr1, Dep2).

% Indirect flight - ensure enough transfer time

% optimize by propagating that constraint

43

Page 44: Week 4

% decoding timetable

flight(Place1, Place2, Day, Fnum, Deptime, Arrtime) :-

timetable(Place1, Place2, Flightlist),

member(Deptime / Arrtime / Fnum / Daylist, Flightlist),

flyday(Day, Daylist).

flyday(Day, Daylist) :- member(Day, Daylist).

flyday(Day, alldays) :- member(Day, [mo,tu,we,th,fr,sa,su]).

deptime([( _ / _ / _ / Dep) | _], Dep).

transfer(Hours1:Mins1, Hours2:Mins2) :-

60 * (Hours2 - Hours1) + Mins2 - Mins1 >= 40.

% must have 40 min gap

44

Page 45: Week 4

% A Flight Database

timetable(edinburgh, london,

[ 9:40 / 10:50 / ba4733 / alldays,

13:40 / 14:50 / ba4773 / alldays,

19:40 / 20:50 / ba4833 / [mo,tu,we,th,fr,su]]).

timetable(london, edinburgh,

[ 9:40 / 10:50 / ba4732 / alldays,

11:40 / 12:50 / ba4752 / alldays,

18:40 / 19:50 / ba4822 / [mo,tu,we,th,fr]]).

timetable(london, ljubljana,

[ 13:20 / 16:20 / jp212 / [mo,tu,we,fr,su],

16:30 / 19:30 / ba473 / [mo,we,th,sa]]).

45

Page 46: Week 4

timetable(london, zurich,

[ 9:10 / 11:45 / ba614 / alldays,

14:45 / 17:20 / sr805 / alldays]).

timetable(london, milan,

[ 8:30 / 11:20 / ba510 / alldays,

11:00 / 13:50 / az459 / alldays]).

timetable(ljubljana, zurich,

[ 11:30 / 12:40 / jp322 / [tu,th]]).

timetable(ljubljana, london,

[ 11:10 / 12:20 / jp211 / [mo,tu,we,fr,su],

20:30 / 21:30 / ba472 / [mo,we,th,sa]]).

46

Page 47: Week 4

timetable(milan, london,

[ 9:10 / 10:00 / az458 / alldays,

12:20 / 13:10 / ba511 / alldays]).

timetable(milan, zurich,

[ 9:25 / 10:15 / sr621 / alldays,

12:45 / 13:35 / sr623 / alldays]).

timetable(zurich, ljubljana,

[ 13:30 / 14:40 / jp323 / [tu,th]]).

timetable(zurich, london,

[ 9:00 / 9:40 / ba613 / [mo,tu,we,th,fr,sa],

16:10 / 16:55 / sr806 / [mo,tu,we,th,fr,su]]).

timetable(zurich, milan,

[ 7:55 / 8:45 / sr620 / alldays]).

47

Page 48: Week 4

Queries What days of the week is there is a

direct evening flight from Ljubljana to London?

?- flight(ljubljana, london, Day, _, DepHour:_,_), DepHour >= 18.

How can I get from Ljubljana to London on Thursday?

?- route(ljubljana, london, th, R). Queries can result in infinite loops or

stack overflow on Prolog.

48

Page 49: Week 4

SWI-Prolog vs XSBXSB: table route/4.

How can I get from Ljubljana to Edinburgh on Thursday??- route(ljubljana, edinburgh, th, R).

SWI-Prolog: Out of local stack XSB: [ ljubljana / zurich / jp322 / 11 :

30,

zurich / london / sr806 / 16 : 10,

london / edinburgh / ba4822 / 18 : 40];

49