Есть известная задача: У фермера есть волк, коза и капуста. Все они находятся на левом берегу реки. Необходимо перевезти это «трио» на правый берег, но в лодку может поместиться что-то одно — волк, коза или капуста. Нельзя оставлять на одном берегу волка с козой и козу с капустой.
Решение взято отсюда:
https://pro-prof.com/archives/1299check(L):-
member(wolf, L), !, not(member(goat, L));
member(goat, L), !, not(member(cabbage, L));
!.
generate((Left, Right, left)):-
permutation_length(Left, 1, LeftPart),
subtraction(Left, LeftPart, NewLeft),
append(LeftPart, Right, NewRight),
check(NewLeft),
not(edge(_, (NewLeft, NewRight, right))),
assert(edge((Left, Right, left), (NewLeft, NewRight, right))),
fail;!.
generate((Left, Right, right)):-
permutation_length(Right, 1, RightPart),
subtraction(Right, RightPart, NewRight),
append(RightPart, Left, NewLeft),
check(NewRight),
not(edge(_, (NewLeft, NewRight, left))),
assert(edge((Left, Right, right), (NewLeft, NewRight, left))),
fail;!.
path(Finish, [[Finish | PathPart] | _], [Finish | PathPart]):-!.
path(Finish, [[X | PathPart] | ProcList], Path):-
generate(X),
findall(Y, step(X, PathPart, Y), AdjNodes),
append(ProcList, AdjNodes, NewProcList), !,
path(Finish, NewProcList, Path).
step(X,T,[Y,X|T]):-
edge(X,Y),
not(member(Y,T)).
path(Start, Finish):-
path(Finish, [[Start]], RPath), !,
reverse(RPath,Path), write(Path).
Условие:
path(([wolf, goat, cabbage], [], left), ([], _, right)).
Я пытаюсь запустить код ровно так, как это описано в примере, но отображается ошибка :
Как определить функцию permutation_length ?