% ========================================================================== % $Id: puzzle.pl,v 1.1 2014/01/23 04:34:04 jlang Exp $ % CSI2120 example Code for lecture 6 % ========================================================================== % (C)opyright: % % Robert Laganiere, Jochen Lang % EECS, University of Ottawa % 800 King Edward Ave. % Ottawa, On., K1N 6N5 % Canada. % http://www.eecs.uottawa.ca/~jlang % % Creator: jlang (Jochen Lang) % Email: jlang@eecs.uottawa.ca % ========================================================================== % $Log: puzzle.pl,v $ % Revision 1.1 2014/01/23 04:34:04 jlang % Created examples for lecture 6 % % ========================================================================== initial(state([left, left, left, left])). final(state([right, right, right, right])). cross(state([left,X,Y,Z]),state([right,X,Y,Z]), farmer_cross). cross(state([right,X,Y,Z]),state([left,X,Y,Z]), farmer_returns). cross(state([left,X,left,Z]),state([right,X,right,Z]), farmer_brings_chicken). cross(state([right,X,right,Z]),state([left,X,left,Z]), farmer_returns_chicken). cross(state([left, left, X, Y]),state([right, right, X, Y]), farmer_brings_fox). cross(state([right, right, X, Y]),state([left, left, X, Y]), farmer_returns_fox). cross(state([left, X, Y, left]),state([right, X, Y, right]), farmer_brings_bag). cross(state([right, X, Y, right]),state([left, X, Y, left]), farmer_returns_bag). forbidden(state([X, Y, Y, _])) :- X \== Y. forbidden(state([X, _, Y, Y])) :- X \== Y. puzzle(P) :- initial(StartState), final(EndState), crossRiver(StartState, EndState, [StartState], P). crossRiver(A,A,_,[]). crossRiver(A,B,V,P) :- cross(A,C,Action), not(forbidden(C)), not(member(C,V)), crossRiver(C,B,[C|V],Plan), P = [Action | Plan].