% File : MANDC % Author : Paul % Updated: 30 April 1985 % Purpose: Missionaries and Cannibals by Lawrence Byrd gofrom([0,0,0],[3,3,1],Oldlefts). gofrom(Left,Right,Oldlefts):- legal(Left), legal(Right), not looping(Left,Oldlefts), applymove(Left,Right,Newleft,Newright), append([Left],Oldlefts,Newoldlefts), gofrom(Newleft,Newright,Newoldlefts). applymove(Left,Right,Newleft,Newright):- boathere(Left), moveload(Left,Right,Newleft,Newright). applymove(Left,Right,Newleft,Newright):- boathere(Right), moveload(Right,Left,Newright,Newleft). boathere([Missionaries,Cannibals,1]). moveload(Source,Target,Newsource,Newtarget):- move(Boatload), possibletomove(Source,Boatload), performthemove(Source,Target,Boatload,Newsource,Newtarget). possibletomove([M,C,B],[MoveM,MoveC,MoveB]):- M>=MoveM, C>=MoveC, B>=MoveB. performthemove([SourceM,SourceC,SourceB], [TargetM,TargetC,TargetB], [MoveM,MoveC,MoveB], [NewsourceM,NewsourceC,NewsourceB], [NewtargetM,NewtargetC,NewtargetB]):- NewsourceM is SourceM-MoveM, NewsourceC is SourceC-MoveC, NewsourceB is SourceB-MoveB, NewtargetM is TargetM+MoveM, NewtargetC is TargetC+MoveC, NewtargetB is TargetB+MoveB. member(X,[X|_]). member(X,[Y|Z]):-member(X,Z). append([],L,L). append([H|L1],L2,[H|L3]):-append(L1,L2,L3).