Я пытаюсь реализовать предикат findall в Prolog (да, я знаю, что он встроен, это для назначения).Правило PROLOG возвращает только первое совпадение
Он записывается следующим образом:
my_findall(N,P,Pred,L) :- Pred, not(new(N,P)), !, assert(new(N,P)), my_findall(N1,P1,Pred,L1), L=[N,P,L1], retract(new(N,P)).
my_findall(_,_,_, []).
По какой-то причине это только дает мне первое решение и останавливается там, как будто второй вызов my_findall терпит неудачу. Насколько я понимаю, механизм возврата в исходное положение должен охватывать все возможные варианты, которые должны включать в себя все опции для вызова Pred (N, P), поэтому, несмотря на то, что второй вызов должен завершиться с первой попытки (первый вариант, который пытался использовать Pred, уже утверждалось), он должен сначала попробовать все другие варианты, прежде чем отказаться от my_findall ((,), _, []).
Если это не так, как это работает, существует ли способ заставить такое поведение полностью не переписывать решение?
С каким прологом вы работаете? – liori
Встроенные находки - findall/3 и findall/4. Какой из них вы пытаетесь реализовать? – Kaarel