Задать вопрос
@tj57

Как исправить ошибку в задаче про волка, козу и капусту на prolog?

Есть известная задача: У фермера есть волк, коза и капуста. Все они находятся на левом берегу реки. Необходимо перевезти это «трио» на правый берег, но в лодку может поместиться что-то одно — волк, коза или капуста. Нельзя оставлять на одном берегу волка с козой и козу с капустой.
Решение взято отсюда: https://pro-prof.com/archives/1299
check(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)).


Я пытаюсь запустить код ровно так, как это описано в примере, но отображается ошибка :
5c37a3ff48b16866166724.png
Как определить функцию permutation_length ?
  • Вопрос задан
  • 655 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы