70 likes | 394 Views
The “Russian Farmer” Problem Continued. (F,W,G,C) (l, l, l, l). (r, l, r, l). (l, l, r, l). (r, r, r, l) (r, l, r, r). (l, r, l, l) (l, l, l, r). (r, r, l, r) (r, r, l, r). (l, r, l, r) (l, r, l, r). (r, r, r, r).
E N D
The “Russian Farmer” Problem Continued
(F,W,G,C) (l, l, l, l) (r, l, r, l) (l, l, r, l) (r, r, r, l)(r, l, r, r) (l, r, l, l) (l, l, l, r) (r, r, l, r)(r, r, l, r) (l, r, l, r)(l, r, l, r) (r, r, r, r)
?- go( state(left,left,left,left), state(right,right,right,right) ). A solution is: The farmer takes the Goat from left of the river to right The farmer crosses the river from right to left The farmer takes the Wolf from left of the river to right The farmer takes the Goat from right of the river to left The farmer takes the cabbage from left of the river to right The farmer crosses the river from right to left The farmer takes the Goat from left of the river to right A solution is: The farmer takes the Goat from left of the river to right The farmer crosses the river from right to left The farmer takes the cabbage from left of the river to right The farmer takes the Goat from right of the river to left The farmer takes the Wolf from left of the river to right The farmer crosses the river from right to left The farmer takes the Goat from left of the river to right No
go(Start,Target):- path(Start, Target,[Start],Path), write(‘A solution is:’),nl, write_path(Path). path(Start, Target,Visited,Path):- move(Start, NextNode),% Generate a move not( unsafe(NextNode) ),% Check that it issafe not( member(NextNode,Visited) ),% Check for recurrence path(NextNode, Target,[NextNode |Visited],Path),!. path(Target, Target,Path,Path).% Reached the goal
move(state(X,X,G,C),state(Y,Y,G,C)):-opposite(X,Y). % FARMER & WOLF move(state(X,W,X,C),state(Y,W,Y,C)):-opposite(X,Y).% FARMER &GOAT move(state(X,W,G,X),state(Y,W,G,Y)):-opposite(X,Y).%FARMER & Cbg. move(state(X,W,G,C),state(Y,W,G,C)):-opposite(X,Y).% FARMER alone unsafe( state(F,X,X,_) ):- opposite(F,X),!. % The wolf eats the goat Other unsafe clauses opposite(left,right). opposite(right,left).
write_path( [] ). write_path( [H1,H2|T] ) :-write_move(H1,H2), write_path([H2|T]). write_move( state(X,W,G,C), state(Y,W,G,C) ) :-!, write(‘The farmer crosses the river from ‘), write(X),write(‘ to ‘),write(Y),nl. write_move( state(X,X,G,C), state(Y,Y,G,C) ) :-!, write(‘The farmer takes the Wolf from the ‘), write(X),write(‘side of the river to ‘),write(Y),nl.
?-go(X,Y). ?-go(state(left,left,left,left),Y).