У меня возникли проблемы с выяснением простой проблемы Prolog. Мне нужно выполнить какую-то манипуляцию (определенную мной) на элементах списка атомов. Тем не менее, я должен выполнять такую манипуляцию, если элемент, о котором идет речь о списке, возвращает true для заданного предиката P (x).Функция смены списка
Так в основном, если у меня есть правило:
mutate_if(isOdd, addOne, [1,2,3,4,5], L2).
я должен получить следующий вывод:
L2 = [2,2,4,4,6]
Я пришел с этим кодом до сих пор
mutate_if(P, OP, L1, L2):-
findall(Y, ((member(X,L1),
Oper=.. [P,X],
call(Oper)) -> (Mutate=.. [OP, X, Y], call(Mutate)); X=Y),
L2).
В моей голове это должно работать хорошо, однако, когда я запускаю это на Prolog-SWI, я получаю следующее:
?- mutate_if(isOdd, addOne, [1,2,3,4,5], L2).<
L2=[2].
, где isOdd
и addOne
являются простые правила, которые проверяют, чтобы увидеть, если входная переменная является нечетным, и добавьте к входной переменной, соответственно.
Не могу понять, почему Prolog находит только один элемент списка, когда предикат findall
должен технически находить всех членов первого списка.
Является ли это ошибкой в моей собственной логике?