% to run the code in SWI-Prolog, do
% ?- ['missionaries_and_cannibals.pl'].
% ?- find.
% Represent a state as [CL,ML,B,CR,MR]
start([3,3,left,0,0]).
goal([0,0,right,3,3]).
legal(CL,ML,CR,MR) :-
% is this state a legal one?
ML>=0, CL>=0, MR>=0, CR>=0,
(ML>=CL ; ML=0),
(MR>=CR ; MR=0).
% Possible moves:
move([CL,ML,left,CR,MR],[CL,ML2,right,CR,MR2]):-
% Two missionaries cross left to right.
legal(CL,ML2,CR,MR2).
move([CL,ML,left,CR,MR],[CL2,ML,right,CR2,MR]):-
% Two cannibals cross left to right.
legal(CL2,ML,CR2,MR).
move([CL,ML,left,CR,MR],[CL2,ML2,right,CR2,MR2]):-
% One missionary and one cannibal cross left to right.
legal(CL2,ML2,CR2,MR2).
move([CL,ML,left,CR,MR],[CL,ML2,right,CR,MR2]):-
% One missionary crosses left to right.
legal(CL,ML2,CR,MR2).
move([CL,ML,left,CR,MR],[CL2,ML,right,CR2,MR]):-
% One cannibal crosses left to right.
legal(CL2,ML,CR2,MR).
move([CL,ML,right,CR,MR],[CL,ML2,left,CR,MR2]):-
% Two missionaries cross right to left.
legal(CL,ML2,CR,MR2).
move([CL,ML,right,CR,MR],[CL2,ML,left,CR2,MR]):-
% Two cannibals cross right to left.
legal(CL2,ML,CR2,MR).
move([CL,ML,right,CR,MR],[CL2,ML2,left,CR2,MR2]):-
% One missionary and one cannibal cross right to left.
legal(CL2,ML2,CR2,MR2).
move([CL,ML,right,CR,MR],[CL,ML2,left,CR,MR2]):-
% One missionary crosses right to left.
legal(CL,ML2,CR,MR2).
move([CL,ML,right,CR,MR],[CL2,ML,left,CR2,MR]):-
% One cannibal crosses right to left.
legal(CL2,ML,CR2,MR).
% Recursive call to solve the problem
path([CL1,ML1,B1,CR1,MR1],[CL2,ML2,B2,CR2,MR2],Explored,MovesList) :-
move([CL1,ML1,B1,CR1,MR1],[CL3,ML3,B3,CR3,MR3]),
not(member([CL3,ML3,B3,CR3,MR3],Explored)),
path([CL3,ML3,B3,CR3,MR3],[CL2,ML2,B2,CR2,MR2],[[CL3,ML3,B3,CR3,MR3]|Explored],[ [[CL3,ML3,B3,CR3,MR3],[CL1,ML1,B1,CR1,MR1]] | MovesList ]).
% Solution found
path([CL,ML,B,CR,MR],[CL,ML,B,CR,MR],_,MovesList):-
output(MovesList).
% Printing
output([[A,B]|MovesList]) :-
output(MovesList),
% Find the solution for the missionaries and cannibals problem
find :-
path([3,3,left,0,0],[0,0,right,3,3],[[3,3,left,0,0]],_).
JSB0byBydW4gdGhlIGNvZGUgaW4gU1dJLVByb2xvZywgZG8KJSAgICAgICAgPy0gWydtaXNzaW9uYXJpZXNfYW5kX2Nhbm5pYmFscy5wbCddLgolICAgICAgICA/LSBmaW5kLgoKJSBSZXByZXNlbnQgYSBzdGF0ZSBhcyBbQ0wsTUwsQixDUixNUl0Kc3RhcnQoWzMsMyxsZWZ0LDAsMF0pLgpnb2FsKFswLDAscmlnaHQsMywzXSkuCgpsZWdhbChDTCxNTCxDUixNUikgOi0KCSUgaXMgdGhpcyBzdGF0ZSBhIGxlZ2FsIG9uZT8KCU1MPj0wLCBDTD49MCwgTVI+PTAsIENSPj0wLAoJKE1MPj1DTCA7IE1MPTApLAoJKE1SPj1DUiA7IE1SPTApLgoKJSBQb3NzaWJsZSBtb3ZlczoKbW92ZShbQ0wsTUwsbGVmdCxDUixNUl0sW0NMLE1MMixyaWdodCxDUixNUjJdKTotCgklIFR3byBtaXNzaW9uYXJpZXMgY3Jvc3MgbGVmdCB0byByaWdodC4KCU1SMiBpcyBNUisyLAoJTUwyIGlzIE1MLTIsCglsZWdhbChDTCxNTDIsQ1IsTVIyKS4KCm1vdmUoW0NMLE1MLGxlZnQsQ1IsTVJdLFtDTDIsTUwscmlnaHQsQ1IyLE1SXSk6LQoJJSBUd28gY2FubmliYWxzIGNyb3NzIGxlZnQgdG8gcmlnaHQuCglDUjIgaXMgQ1IrMiwKCUNMMiBpcyBDTC0yLAoJbGVnYWwoQ0wyLE1MLENSMixNUikuCgptb3ZlKFtDTCxNTCxsZWZ0LENSLE1SXSxbQ0wyLE1MMixyaWdodCxDUjIsTVIyXSk6LQoJJSAgT25lIG1pc3Npb25hcnkgYW5kIG9uZSBjYW5uaWJhbCBjcm9zcyBsZWZ0IHRvIHJpZ2h0LgoJQ1IyIGlzIENSKzEsCglDTDIgaXMgQ0wtMSwKCU1SMiBpcyBNUisxLAoJTUwyIGlzIE1MLTEsCglsZWdhbChDTDIsTUwyLENSMixNUjIpLgoKbW92ZShbQ0wsTUwsbGVmdCxDUixNUl0sW0NMLE1MMixyaWdodCxDUixNUjJdKTotCgklIE9uZSBtaXNzaW9uYXJ5IGNyb3NzZXMgbGVmdCB0byByaWdodC4KCU1SMiBpcyBNUisxLAoJTUwyIGlzIE1MLTEsCglsZWdhbChDTCxNTDIsQ1IsTVIyKS4KCm1vdmUoW0NMLE1MLGxlZnQsQ1IsTVJdLFtDTDIsTUwscmlnaHQsQ1IyLE1SXSk6LQoJJSBPbmUgY2FubmliYWwgY3Jvc3NlcyBsZWZ0IHRvIHJpZ2h0LgoJQ1IyIGlzIENSKzEsCglDTDIgaXMgQ0wtMSwKCWxlZ2FsKENMMixNTCxDUjIsTVIpLgoKbW92ZShbQ0wsTUwscmlnaHQsQ1IsTVJdLFtDTCxNTDIsbGVmdCxDUixNUjJdKTotCgklIFR3byBtaXNzaW9uYXJpZXMgY3Jvc3MgcmlnaHQgdG8gbGVmdC4KCU1SMiBpcyBNUi0yLAoJTUwyIGlzIE1MKzIsCglsZWdhbChDTCxNTDIsQ1IsTVIyKS4KCm1vdmUoW0NMLE1MLHJpZ2h0LENSLE1SXSxbQ0wyLE1MLGxlZnQsQ1IyLE1SXSk6LQoJJSBUd28gY2FubmliYWxzIGNyb3NzIHJpZ2h0IHRvIGxlZnQuCglDUjIgaXMgQ1ItMiwKCUNMMiBpcyBDTCsyLAoJbGVnYWwoQ0wyLE1MLENSMixNUikuCgptb3ZlKFtDTCxNTCxyaWdodCxDUixNUl0sW0NMMixNTDIsbGVmdCxDUjIsTVIyXSk6LQoJJSAgT25lIG1pc3Npb25hcnkgYW5kIG9uZSBjYW5uaWJhbCBjcm9zcyByaWdodCB0byBsZWZ0LgoJQ1IyIGlzIENSLTEsCglDTDIgaXMgQ0wrMSwKCU1SMiBpcyBNUi0xLAoJTUwyIGlzIE1MKzEsCglsZWdhbChDTDIsTUwyLENSMixNUjIpLgoKbW92ZShbQ0wsTUwscmlnaHQsQ1IsTVJdLFtDTCxNTDIsbGVmdCxDUixNUjJdKTotCgklIE9uZSBtaXNzaW9uYXJ5IGNyb3NzZXMgcmlnaHQgdG8gbGVmdC4KCU1SMiBpcyBNUi0xLAoJTUwyIGlzIE1MKzEsCglsZWdhbChDTCxNTDIsQ1IsTVIyKS4KCm1vdmUoW0NMLE1MLHJpZ2h0LENSLE1SXSxbQ0wyLE1MLGxlZnQsQ1IyLE1SXSk6LQoJJSBPbmUgY2FubmliYWwgY3Jvc3NlcyByaWdodCB0byBsZWZ0LgoJQ1IyIGlzIENSLTEsCglDTDIgaXMgQ0wrMSwKCWxlZ2FsKENMMixNTCxDUjIsTVIpLgoKCiUgUmVjdXJzaXZlIGNhbGwgdG8gc29sdmUgdGhlIHByb2JsZW0KcGF0aChbQ0wxLE1MMSxCMSxDUjEsTVIxXSxbQ0wyLE1MMixCMixDUjIsTVIyXSxFeHBsb3JlZCxNb3Zlc0xpc3QpIDotIAogICBtb3ZlKFtDTDEsTUwxLEIxLENSMSxNUjFdLFtDTDMsTUwzLEIzLENSMyxNUjNdKSwgCiAgIG5vdChtZW1iZXIoW0NMMyxNTDMsQjMsQ1IzLE1SM10sRXhwbG9yZWQpKSwKICAgcGF0aChbQ0wzLE1MMyxCMyxDUjMsTVIzXSxbQ0wyLE1MMixCMixDUjIsTVIyXSxbW0NMMyxNTDMsQjMsQ1IzLE1SM118RXhwbG9yZWRdLFsgW1tDTDMsTUwzLEIzLENSMyxNUjNdLFtDTDEsTUwxLEIxLENSMSxNUjFdXSB8IE1vdmVzTGlzdCBdKS4KCiUgU29sdXRpb24gZm91bmQKcGF0aChbQ0wsTUwsQixDUixNUl0sW0NMLE1MLEIsQ1IsTVJdLF8sTW92ZXNMaXN0KTotIAoJb3V0cHV0KE1vdmVzTGlzdCkuCgolIFByaW50aW5nCm91dHB1dChbXSkgOi0gbmwuIApvdXRwdXQoW1tBLEJdfE1vdmVzTGlzdF0pIDotIAoJb3V0cHV0KE1vdmVzTGlzdCksIAogICAJd3JpdGUoQiksIHdyaXRlKCcgLT4gJyksIHdyaXRlKEEpLCBubC4KCiUgRmluZCB0aGUgc29sdXRpb24gZm9yIHRoZSBtaXNzaW9uYXJpZXMgYW5kIGNhbm5pYmFscyBwcm9ibGVtCmZpbmQgOi0gCiAgIHBhdGgoWzMsMyxsZWZ0LDAsMF0sWzAsMCxyaWdodCwzLDNdLFtbMywzLGxlZnQsMCwwXV0sXyku