Strawberry Prolog
Три миссионера и три каннибала хотят переправиться с левого берега на правый. Как это сделать за минимальное число шагов, если в их распоряжении имеется трехместная лодка и ни при каких обстоятельствах (в лодке или на берегу) миссионеры не должны оставаться в меньшинстве.
Вот результаты нашей работы:
/*3 kannibala*/
move(state(X,X,X,M1,M2,M3),state(Y,Y,Y,M1,M2,M3)):-opposite(X,Y).
/*1 missioner*/
move(state(K1,K2,K3,X,M2,M3),state(K1,K2,K3,Y,M2,M3)):-opposite(X,Y).
move(state(K1,K2,K3,M1,X,M3),state(K1,K2,K3,M1,Y,M3)):-opposite(X,Y).
move(state(K1,K2,K3,M1,M2,X),state(K1,K2,K3,M1,M2,Y)):-opposite(X,Y).
/*2 missionera*/
move(state(K1,K2,K3,X,X,M3),state(K1,K2,K3,Y,Y,M3)):-opposite(X,Y).
move(state(K1,K2,K3,M1,X,X),state(K1,K2,K3,M1,Y,Y)):-opposite(X,Y).
move(state(K1,K2,K3,X,M2,X),state(K1,K2,K3,Y,M2,Y)):-opposite(X,Y).
/*3 missionera*/
move(state(K1,K2,K3,X,X,X),state(K1,K2,K3,Y,Y,Y)):-opposite(X,Y).
/*1 kannibal, 1 missioner*/
move(state(X,K2,K3,X,M2,M3),state(Y,K2,K3,Y,M2,M3)):-opposite(X,Y).
move(state(K1,X,K3,X,M2,M3),state(K1,Y,K3,Y,M2,M3)):-opposite(X,Y).
move(state(K1,K2,X,X,M2,M3),state(K1,K2,Y,Y,M2,M3)):-opposite(X,Y).
move(state(X,K2,K3,M1,X,M3),state(Y,K2,K3,M1,Y,M3)):-opposite(X,Y).
move(state(K1,X,K3,M1,X,M3),state(K1,Y,K3,M1,Y,M3)):-opposite(X,Y).
move(state(K1,K2,X,M1,X,M3),state(K1,K2,Y,M1,Y,M3)):-opposite(X,Y).
move(state(X,K2,K3,M1,M2,X),state(Y,K2,K3,M1,M2,Y)):-opposite(X,Y).
move(state(K1,X,K3,M1,M2,X),state(K1,Y,K3,M1,M2,Y)):-opposite(X,Y).
move(state(K1,K2,X,M1,M2,X),state(K1,K2,Y,M1,M2,Y)):-opposite(X,Y).
/*1 kannibal, 2 missionera*/
move(state(X,K2,K3,X,X,M3),state(Y,K2,K3,Y,Y,M3)):-opposite(X,Y).
move(state(X,K2,K3,M1,X,X),state(Y,K2,K3,M1,Y,Y)):-opposite(X,Y).
move(state(X,K2,K3,X,M2,X),state(Y,K2,K3,Y,M2,Y)):-opposite(X,Y).
move(state(K1,X,K3,X,X,M3),state(Y,K2,K3,Y,Y,M3)):-opposite(X,Y).
move(state(K1,X,K3,M1,X,X),state(K1,Y,K3,M1,Y,Y)):-opposite(X,Y).
move(state(K1,X,K3,X,M2,X),state(K1,Y,K3,Y,M2,Y)):-opposite(X,Y).
move(state(K1,K2,X,X,X,M3),state(K1,K2,Y,Y,Y,M3)):-opposite(X,Y).
move(state(K1,K2,X,M1,X,X),state(K1,K2,Y,M1,Y,Y)):-opposite(X,Y).
move(state(K1,K2,X,X,M2,X),state(K1,K2,Y,Y,M2,Y)):-opposite(X,Y).
opposite(east,west).
opposite(west,east).
/*2 kannibala, 1 missioner*/
unsafe(state(X,X,Y,X,Y,Y)):-opposite(X,Y).
unsafe(state(Y,X,X,X,Y,Y)):-opposite(X,Y).
unsafe(state(X,Y,X,X,Y,Y)):-opposite(X,Y).
unsafe(state(X,X,Y,Y,X,Y)):-opposite(X,Y).
unsafe(state(Y,X,X,Y,X,Y)):-opposite(X,Y).
unsafe(state(X,Y,X,Y,X,Y)):-opposite(X,Y).
unsafe(state(X,X,Y,Y,Y,X)):-opposite(X,Y).
unsafe(state(Y,X,X,Y,Y,X)):-opposite(X,Y).
unsafe(state(X,Y,X,Y,Y,X)):-opposite(X,Y).
/*3 kannibala, 1 missioner*/
unsafe(state(X,X,X,X,Y,Y)):-opposite(X,Y).
unsafe(state(X,X,X,Y,X,Y)):-opposite(X,Y).
unsafe(state(X,X,X,Y,Y,X)):-opposite(X,Y).
/*3 kannibala, 2 missionera*/
unsafe(state(X,X,X,X,X,Y)):-opposite(X,Y).
unsafe(state(X,X,X,Y,X,X)):-opposite(X,Y).
unsafe(state(X,X,X,X,Y,X)):-opposite(X,Y).
path(S,G,L,L1):-
move(S,S1),
not(unsafe(S1)),
not(member(S1,L)),
path(S1,G,[S1|L],L1),!.
path(G,G,T,T):-!. /*The final state is reached*/
go:-go(state(east,east,east,east),state(west,west,west,west)).
go(S,G):-
path(S,G,
,L),nl,write("A solution is: "),nl,write_path(L),fail.
go(_,_).
member(X,[X|_]).
member(X,[_|L]):-member(X,L).
/*1 kannibal*/
write_move(state(X,K2,K3,M1,M2,M3),state(Y,K2,K3,M1,M2,M3)):-!,
write("The 1 kannibal crosses the river from "),
write(X),
write(" to "),
write(Y),nl.
write_move(state(K1,X,K3,M1,M2,M3),state(K1,Y,K3,M1,M2,M3)):-!,
write("The 1 kannibal crosses the river from "),
write(X),
write(" to "),
write(Y),nl.
write_move(state(K1,K2,X,M1,M2,M3),state(K1,K2,Y,M1,M2,M3)):-!,
write("The 1 kannibal crosses the river from "),
write(X),
write(" to "),
write(Y),nl.
/*2 kannibala*/
write_move(state(X,X,K3,M1,M2,M3),state(Y,Y,K3,M1,M2,M3)):-!,
write("The 1 kannibal takes the 1 kannibala from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,X,X,M1,M2,M3),state(K1,Y,Y,M1,M2,M3)):-!,
write("The 1 kannibal takes the 1 kannibala from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(X,K2,X,M1,M2,M3),state(Y,K2,Y,M1,M2,M3)):-!,
write("The 1 kannibal takes the 1 kannibala from "),
write(X),
write(" of the river to "),
write(Y),nl.
/*3 kannibala*/
write_move(state(X,X,X,M1,M2,M3),state(Y,Y,Y,M1,M2,M3)):-!,
write("The 3 kannibala crosses the river from "),
write(X),
write(" to "),
write(Y),nl.
/*1 kannibal, 1 missioner*/
write_move(state(X,K2,K3,X,M2,M3),state(Y,K2,K3,Y,M2,M3)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,X,K3,X,M2,M3),state(K1,Y,K3,M1,Y,M3)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,K2,X,X,M2,M3),state(K1,K2,Y,M1,M2,Y)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(X,K2,K3,M1,X,M3),state(Y,K2,K3,M1,Y,M3)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,X,K3,M1,X,M3),state(K1,Y,K3,M1,Y,M3)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,K2,X,M1,X,M3),state(K1,K2,Y,M1,Y,M3)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(X,K2,K3,M1,M2,X),state(Y,K2,K3,M1,M2,Y)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,X,K3,M1,M2,X),state(K1,Y,K3,M1,M2,Y)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,K2,X,M1,M2,X),state(K1,K2,Y,M1,M2,Y)):-!,
write("The 1 kannibal takes the 1 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
/*1 kannibal, 2 missionera*/
write_move(state(X,K2,K3,X,X,M3),state(Y,K2,K3,Y,Y,M3)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(X,K2,K3,M1,X,X),state(Y,K2,K3,M1,Y,Y)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(X,K2,K3,X,M2,X),state(Y,K2,K3,Y,M2,Y)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,X,K3,X,X,M3),state(Y,K2,K3,Y,Y,M3)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,X,K3,M1,X,X),state(K1,Y,K3,M1,Y,Y)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,X,K3,X,M2,X),state(K1,Y,K3,Y,M2,Y)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,K2,X,X,X,M3),state(K1,K2,Y,Y,Y,M3)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,K2,X,M1,X,X),state(K1,K2,Y,M1,Y,Y)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_move(state(K1,K2,X,X,M2,X),state(K1,K2,Y,Y,M2,Y)):-!,
write("The 1 kannibal takes the 2 missionera from "),
write(X),
write(" of the river to "),
write(Y),nl.
write_path([H1,H2|T]):-!,
write_move(H1,H2),write_path([H2|T]).
write_path(_).
?-go.
Ответ почему-то выдает просто Yes... Помогите пожалуйста, буду очень признательна. 
Правильный ответ вот такой: Первыми пересекают реку миссионер и каннибал. После этого миссионер возвращается. Затем пересекают реку два каннибала. Один из них возвращается. Потом два миссионера пересекают реку. Миссионер и каннибал возвращаются. Два миссионера пересекают реку. Один каннибал возвращается. Два каннибала пересекают реку. Один каннибал возвращается. Два оставшихся каннибала пересекают реку.