fortgeschrittene programmierung prolog teil 3

19
Simply Logical Chapter 3 © Peter Flach, 2000 Luc De Raedt and Andreas Karwath (original slides by Peter Flach) Fortgeschrittene Programmierung PROLOG Teil 3

Upload: jakeem-reid

Post on 31-Dec-2015

24 views

Category:

Documents


0 download

DESCRIPTION

Fortgeschrittene Programmierung PROLOG Teil 3. Luc De Raedt and Andreas Karwath (original slides by Peter Flach). SLD Resolution and SLD Trees. Resolution in Prolog based on definite clause logic definite clauses: one atom in the head - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Luc De Raedt and Andreas Karwath(original slides by Peter Flach)

Fortgeschrittene ProgrammierungPROLOG Teil 3

Page 2: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

SLD Resolution and SLD Trees

Page 3: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

SLD resolution

Resolution in Prolog based on definite clause logic

definite clauses: one atom in the head

Resolution strategy: which literal and which input clause is chosen for resolution?

Strategy in Prolog is called SLD resolution:

- S selection rule (in Prolog from left to right)- L linear resolution- D definite clauses

Leftmost literal in query is selected; clauses are selected in textual order

SLD trees: different from proof trees: only show resolvents, but all possible resolution steps

Prolog searches SLD tree depth-first !

Page 4: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

:-teaches(peter,ai_techniques)

:-teaches(peter,expert_systems)

:-teaches(peter,computer_science)

?-student_of(S,peter)

SLD-tree

:-follows(S,C),teaches(peter,C):-follows(S,C),teaches(peter,C)

:-teaches(peter,expert_systems)

:-teaches(peter,computer_science) :-teaches(peter,ai_techniques)

?-student_of(S,peter)

student_of(X,T):-follows(X,C),teaches(T,C).follows(paul,computer_science).follows(paul,expert_systems).follows(maria,ai_techniques).teaches(adrian,expert_systems).teaches(peter,ai_techniques).teaches(peter,computer_science).

p.44-5

[][]

Page 5: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Infinite SLD-trees

brother_of(X,Y):-brother_of(Y,X).brother_of(paul,peter).

brother_of(paul,peter).brother_of(peter,adrian).brother_of(X,Y):-brother_of(X,Z),

brother_of(Z,Y).

?-brother_of(paul,B)

[] :-brother_of(paul,Z),brother_of(Z,B)

:-brother_of(paul,Z1),brother_of(Z1,Z),brother_of(Z,B):-brother_of(peter,B)

[] :-brother_of(peter,Z),brother_of(Z,B)

•••

•••

•••

:-brother_of(B,peter)

[]

?-brother_of(peter,B)

:-brother_of(peter,B)

:-brother_of(B,peter)

[]

p.45-6

Page 6: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Depth-first search

?-plist(L)

plist([]).plist([H|T]):-

p(H),plist(T).

p(1). p(2).[]

L = []

p.47

:-p(H1),plist(T1)

:-plist(T1)

[]

L = [1]

:-p(H1),plist(T1)

:-plist(T1)

[]

L = [1,1]

•••

:-plist(T1)

:-plist(T1)

[]

L = [1,2]

•••

[]

L = [2]

:-p(H1),plist(T1)

:-plist(T1):-plist(T1)

[]

L = [2,1]

[]

L = [2,2]

•••

•••

?-plist(L).L=[];L=[1];L=[1,1];…

Page 7: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Summary

First problem: trapped in infinite subtrees

Prolog is incomplete by the way the SLD tree is searched (depth-first; a deliberate design decision for memory efficiency)

if breadth-first search were used, then it would be refutation complete!

Second problem: looping if no (further) solution for any infinite

SLD tree

due to semi-decidability of full clausal logic(infinity of Herbrand base)

Page 8: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Programming Example:Monkey and banana

Page 9: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Problem: Monkey and Banana

The Problem

There is a monkey at the door into a room. In the middle of the room a banana is hanging from the ceiling. The monkey is hungry and wants to get the banana, but he cannot stretch high enough from the floor. At the window of the room there is a box that the monkey can use. The monkey can perform the following actions: walk on the floor, climb the box, push the box around (if he is already at it), and grasp the banana if he is standing on the box and directly underneath the banana.

Can the monkey grasp the banana?

Page 10: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

banana

Problem: Monkey and Banana

door

window

box

mokey

middle

Page 11: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: States

state( MR, MB , P , B )

Monkey‘s Room Position

•at_door•middle•at_window

Monkey‘s Box Position

•on_floor•on_box

Box Position

•at_door•middle•at_window

Banana

•has•has_not

Page 12: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: Actions I

Possible actions:

walk, push, climb, grasp

Defined using:

move(OldState, Action, NewState)

OldState NewState

Action

Page 13: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: Actions II

Grasp Banana:

move( state(middle, on_box, middle, has_not),grasp,state(middle, on_box, middle,

has) ).

move( state(P, on_floor, P, H),climb,state(P, on_box, P, H) ).

Climb Box:

Page 14: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: Actions III

Push Box:

move( state(P1, on_floor, P1, H),push(P1, P2),state(P2, on_floor, P2, H)).

move( state(P1, on_floor, P, H),walk(P1, P2),state(P2, on_floor, P, H)).

Walk:

Page 15: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: Actions Summary

move(state(middle, on_box, middle, has_not),grasp,state(middle, on_box, middle, has)).

move(state(P, on_floor, P, H),climb,state(P, on_box, P, H)).

move(state(P1, on_floor, P1, H),push(P1, P2),state(P2, on_floor, P2, H)).

move(state(P1, on_floor, P, H),walk(P1, P2),state(P2, on_floor, P, H)).

Page 16: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: Goals

How can the monkey get the banana?

canget(state(_, _, _, has)).canget(OldState) :-

move(OldState, Move, NewState),canget(NewState).

•Can the monkey get the banana from the initial state?

?- canget( state(at_door, on_floor,at_window, has_not)).

Page 17: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: Summary

move(state(middle, on_box, middle, has_not),grasp,state(middle, on_box, middle, has)).

move(state(P, on_floor, P, H),climb,state(P, on_box, P, H)).

move(state(P1, on_floor, P1, H),push(P1, P2),state(P2, on_floor, P2, H)).

move(state(P1, on_floor, P, H),walk(P1, P2),state(P2, on_floor, P, H)).

canget(state(_, _, _, has)).canget(OldState) :-

move(OldState, Move, NewState),canget(NewState).

Page 18: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: Trace

| ?- canget(state(at_door,on_floor,at_window,hasnot)).Call: canget(state(at_door,on_floor,at_window,hasnot)) ?Call: move(state(at_door,on_floor,at_window,hasnot),_989,_990) ?Exit: move(state(at_door,on_floor,at_window,hasnot),walk(at_door,_1476),state(_1476,on_floor,at_window,hasnot)) ?Call: canget(state(_1476,on_floor,at_window,hasnot)) ?Call: move(state(_1476,on_floor,at_window,hasnot),_2415,_2416) ?Exit: move(state(at_window,on_floor,at_window,hasnot),climb,state(at_window,on_box,at_window,hasnot)) ?Call: canget(state(at_window,on_box,at_window,hasnot)) ?Call: move(state(at_window,on_box,at_window,hasnot),_3841,_3842) ?Fail: move(state(at_window,on_box,at_window,hasnot),_3841,_3842) ?Fail: canget(state(at_window,on_box,at_window,hasnot)) ?Redo: move(state(at_window,on_floor,at_window,hasnot),climb,state(at_window,on_box,at_window,hasnot)) ?Exit: move(state(at_window,on_floor,at_window,hasnot),push(at_window,_2902),state(_2902,on_floor,_2902,hasnot)) ?Call: canget(state(_2902,on_floor,_2902,hasnot)) ?Call: move(state(_2902,on_floor,_2902,hasnot),_3844,_3845) ?Exit: move(state(_2902,on_floor,_2902,hasnot),climb,state(_2902,on_box,_2902,hasnot)) ?Call: canget(state(_2902,on_box,_2902,hasnot)) ?Call: move(state(_2902,on_box,_2902,hasnot),_5270,_5271) ?Exit: move(state(middle,on_box,middle,hasnot),grasp,state(middle,on_box,middle,has)) ?Call: canget(state(middle,on_box,middle,has)) ?Exit: canget(state(middle,on_box,middle,has)) ?Exit: canget(state(middle,on_box,middle,hasnot)) ?Exit: canget(state(middle,on_floor,middle,hasnot)) ?Exit: canget(state(at_window,on_floor,at_window,hasnot)) ?Exit: canget(state(at_door,on_floor,at_window,hasnot)) ?yes

Page 19: Fortgeschrittene Programmierung PROLOG Teil 3

Simply Logical – Chapter 3 © Peter Flach, 2000

Monkey and Banana: Notes

Order of clauses in monkey-banana example:

1. grasp

2. climb

3. push

4. walk

Changing this order can cause Prolog to loop indefinitely !