% Waterjug.pl 2.1    
% Jeroen Kruse  2 mei 1996; Reindert-Jan Ekker 10 april 2001

waterjug:-
	init( Jug3, Jug4 ),
	dfs( [Jug3, Jug4], 10 ).
	
% HIER KOMT DE REST VAN HET PROGRAMMA


init( Jug3, Jug4 ):-  %% we beginnen met twee lege kannen 
	Jug3 is 0,
        Jug4 is 0.

goal( Jug4 ):-         %% goaltest: we willen 2 liter in de grote kan
	Jug4  =:= 2.

list_new_states(Jug3,Jug4,List9):-  %% geeft Lijst van opvolgende states
        leeg(List),!,                 %% we beginnen met een lege lijst

        %% leeggooien
        ((Jug3 =\= 0,voegtoe(0,Jug4,List,List2));
	(List2=List)),!,
        ((Jug4=\=0,voegtoe(Jug3,0,List2,List3));
        (List3=List2)),!,

        %% volgooien
        ((Jug3=\=3,voegtoe(3,Jug4,List3,List4));
        (List4=List3)),!,
        ((Jug4=\=4,voegtoe(Jug3,4,List4,List5));
        (List5=List4)),!,

        %% overgieten
        ((Jug3=\=3,Jug3+Jug4=<3,Q is Jug3+Jug4, Q =\= 0, voegtoe(Q,0,List5,List6));
        (List6=List5)),!,
        ((Jug3=\=3,Jug3+Jug4>3,Q1 is Jug3+Jug4-3,voegtoe(3,Q1,List6,List7));
        (List7=List6)),!,
        ((Jug4=\=4,Jug3+Jug4=<4,Q3 is Jug3+Jug4, Q3 =\= 0, voegtoe(0,Q3,List7,List8));
        (List8=List7)),!,
        ((Jug4=\=4,Jug3+Jug4>4,Q2 is Jug3+Jug4-4,voegtoe(Q2,4,List8,List9));
        (List9=List8)).
        
voegtoe(A,B,[],[[A,B]]).
voegtoe(A,B,C,[[A,B]|C]).
leeg([]).


