% ==========================================================================
% $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].
