Presentation is loading. Please wait.

Presentation is loading. Please wait.

Prolog: Lists Recall lists in Scheme: '(a b c) = (cons 'a (cons 'b (cons c '()))) ls = (cons (car ls) (cdr ls)) Want the same operations in Prolog: [a,

Similar presentations


Presentation on theme: "Prolog: Lists Recall lists in Scheme: '(a b c) = (cons 'a (cons 'b (cons c '()))) ls = (cons (car ls) (cdr ls)) Want the same operations in Prolog: [a,"— Presentation transcript:

1 Prolog: Lists Recall lists in Scheme: '(a b c) = (cons 'a (cons 'b (cons c '()))) ls = (cons (car ls) (cdr ls)) Want the same operations in Prolog: [a, b, c] =.(a,.(b,.(c, []))) car([X|Tail], X). cdr([X|Tail], Tail). cons(X, Tail, [X|Tail]). lists.P

2 Prolog: Lists Try it out: | ?- consult(lists). | ?- car([1,2,3], H). H = 1 | ?- cdr([1,2,3], T). T = [2,3] | ?- cons(1, [2,3], L). L = [1,2,3]

3 Prolog: Anonymous Variables What really happens: | ?- consult(lists). ++Warning[XSB]: [Compiler]./lists: Singleton variable Tail in a clause of car/2 ++Warning[XSB]: [Compiler]./lists: Singleton variable X in a clause of cdr/2 Problem: We're not using some variables: car([X|Tail], X). % Tail unused cdr([X|Tail], Tail).% X unused

4 Prolog: Anonymous Variables Solution: Anonymous variables car([X|_], X). % _ = whatever cdr([_|Tail], Tail).

5 Prolog: Lists Can also write it in ML: fun member(a, nil) = false | member(a, x::t) = if a = x then true else member(a, t); Recall member? function (predicate) in Scheme: (define member? (lambda (a ls) (cond ((null? ls) #f) ((equal? a (car ls)) #t) (else (member? a (cdr ls)))))) How about Prolog? member(X, [X|_]). member(X, [_|T]) :- member(X, T).

6 Prolog: Backtracking and Cut Recall family tree example: parent(linda, simon). parent(sam, simon). parent(linda, sharon). parent(sam, sharon). female(sharon). sister(S,X) :- parent(P,S), parent(P,X), female(S). | ?- sister(Who, simon). Who = sharon; Who = sharon Look under the hood using trace :

7 Prolog: Backtracking and Cut | ?- trace. yes [trace] | ?- sister(Who, simon). (0) Call: sister(_h81,simon) ?% sister(S, X=simon) (1) Call: parent(_h148,_h81) ? % parent(P, S) (1) Exit: parent(linda,simon) ? % parent(P=linda, S=simon) (2) Call: parent(linda,simon) ? % parent(P=linda, X=simon) (2) Exit: parent(linda,simon) ? (3) Call: female(simon) ? % female(S=simon) (3) Fail: female(simon) ? (2) Redo: parent(linda,simon) ?% parent(P=linda, X=simon) (2) Fail: parent(linda,simon) ? % fail on redo (1) Redo: parent(linda,simon) ? % parent(P=linda, S=simon) (1) Exit: parent(linda,sharon) ? % parent(P=linda, S=sharon) (4) Call: parent(linda,simon) ? % parent(P=linda, X=simon) (4) Exit: parent(linda,simon) ? (5) Call: female(sharon) ? % female(S=sharon) (5) Exit: female(sharon) ? (0) Exit: sister(sharon,simon) ?% P=linda, X=simon, S=sharon Who = sharon; sister(S, X) :- parent(P,S), parent(P,X), female(S).

8 Prolog: Backtracking and Cut (0) Redo: sister(sharon,simon) ? (5) Redo: female(sharon) ?% female(S=sharon) (5) Fail: female(sharon) ? % fail on redo (4) Redo: parent(linda,simon) ? % parent(P=linda, X=simon) (4) Fail: parent(linda,simon) ? % fail on redo (1) Redo: parent(linda,sharon) ? % parent(P=linda, S=sharon) (1) Exit: parent(sam,simon) ? % parent(P=sam, S=simon) (6) Call: parent(sam,simon) ? % parent(P=sam, X=simon) (6) Exit: parent(sam,simon) ? (7) Call: female(simon) ? % female(S=simon) (7) Fail: female(simon) ? (6) Redo: parent(sam,simon) ? % parent(P=sam, X=simon) (6) Fail: parent(sam,simon) ? % fail on redo (1) Redo: parent(sam,simon) ? % parent(P=sam, S=simon) (1) Exit: parent(sam,sharon) ? % parent(P=sam, S=sharon) (8) Call: parent(sam,simon) ? % parent(P=sam, X=simon) (8) Exit: parent(sam,simon) ? (9) Call: female(sharon) ? % female(S=sharon) (9) Exit: female(sharon) ? (0) Exit: sister(sharon,simon) ? % P=sam, X=simon, S=sharon sister(S, X) :- parent(P,S), parent(P,X), female(S).

9 Prolog: Backtracking and Cut We can view this process as a tree, where each branch represents a binding choice:

10 Prolog: Backtracking and Cut We can view this process as a tree, where each branch represents a binding choice: X simon

11 Prolog: Backtracking and Cut X P S simon linda

12 Prolog: Backtracking and Cut X P S simon linda simon FAIL

13 Prolog: Backtracking and Cut X P S simon linda Backtrack to most recent success:

14 Prolog: Backtracking and Cut X P S simon linda sharon Succeed

15 Prolog: Backtracking and Cut X P S simon linda sharon Succeed User asks for more answers

16 Prolog: Backtracking and Cut X P S simon linda Backtrack: no more choices for S

17 Prolog: Backtracking and Cut X P simon Backtrack

18 Prolog: Backtracking and Cut X P simon sam S

19 Prolog: Backtracking and Cut X P simon sam S sharon Succeed

20 Prolog: Backtracking and Cut Cut ( ! ) prevents backtracking: sister(S,X) :- parent(P,S), parent(P,X), female(S), !. % don't backtrack! | ?- sister(Who, simon). Who = sharon; no No longer a “pure” logic paradigm: we are exploiting sequential order.


Download ppt "Prolog: Lists Recall lists in Scheme: '(a b c) = (cons 'a (cons 'b (cons c '()))) ls = (cons (car ls) (cdr ls)) Want the same operations in Prolog: [a,"

Similar presentations


Ads by Google