я должен найти перестановки, которые имеют 2 последовательных элементов, разность которых меньше 3.Ошибка во время выполнения
cons2Less3(L,Rd):-
findall(R, (permute(L,R),(isValid(R))), Rd).
isValid([H|T]):-
listContainsConsecLess3(T,H).
listContainsConsecLess3([H|_],C):-
4 > abs(H - C),!.
listContainsConsecLess3([H|T],_):-
listContainsConsecLess3(T,H).
permute(L,Rd):-
findall(R, (perm(L,R)), Rd).
perm([],[]).
perm([E|L],Z):-
perm(L,Z1),
elim(E,Z,Z1).
elim(E,[E|X],X).
elim(E,[A|X],[A|Y]):-
elim(E,X,Y).
Но во время выполнения:
Debug:
1 = [[6, 3, 6], [6, 6, 3], [3, 6, 6], [6, 3, 6], [6, 6, 3]]
2 = [3, 6, 6]
консоли:
ERROR: >/2: Type error: `[]' expected, found `[3,6,6]' ("x" must hold one character)
Что я делаю не так?
'переставить (L, R)' возвращает список списков в 'r'. Затем вы вызываете 'isValid (R)' в список списков, что означает 'H' в выражении' abs (H - C) '- это список, который является недопустимым синтаксисом. Избавьтесь от 'findall' в вашем предикате' permute' и пусть он возвращает результаты по одному с помощью backtracking. Почему бы вам не использовать предикат 'перестановки/2' Prolog? – lurker
Просили от меня сделать это так ... –
OK. Вы не должны использовать 'findall' в своей реализации' permute/2'. – lurker