0
Я не понимаю, почему мой код не работает.инверсная перестановка в прологе
inv_perm3(X,[F],length(X)):-
length([F]) == 1,
!,
nth0(F,X,length(X)).
inv_perm3(X,[F|M],N):-
nth0(F,X,N), %nth0(?Index, List, Elem)
F is F+1,
N1 is N+1,
inv_perm3(X,M,N1).
inv_perm(A,B):-
inv_perm3(A,B,1).
Я получаю ложна в каждом входе, я проверить это следующим образом: inv_perm ([2,3,1], X).
У вас есть некоторые основные недоразумения в том, как работает Prolog. Предикаты, поскольку они называются, а не «функции», не «возвращают» значения. Они либо просто преуспевают, либо терпят неудачу (или не заканчиваются). Поэтому 'length ([F]) == 1' всегда будет терпеть неудачу, так как вы спрашивая Prolog, является ли термин 'length ([F])' идентичным '1', который невозможен. Prolog не вычисляет длину' [F] 'в этом контексте. В Prolog длина'/2' предикат, который преуспевает, если вторым аргументом является длина списка, заданного первым аргументом. – lurker
'F is F + 1' всегда будет терпеть неудачу, так как' F' и 'F + 1' никогда не могут иметь одинаковое значение при одном и том же время. – lurker