Это возможно, чтобы вернуться обратно.Это недавно продемонстрировал интерпретатор "chili" .Выполнение цели Пролога линеаризуется без обратного отслеживания, и необходимо использовать два предиката: первый / 3 и следующий / 2.
Вот пример запуска из арифметики Пеано:
?- first([add(X,Y,s(s(s(n)))),X-Y],[],[X-Y|L]).
X = n
Y = s(s(s(n)))
?- first([add(X,Y,s(s(s(n)))),X-Y],[],[_|L]), next(L,[X-Y|R]).
X = s(n)
Y = s(s(n))
В качестве демонстрации для транзитивного замыкания можно вычислить:
connection(harry, ron).
connection(ron, harry).
connection(hermione, harry).
connected(A, B) :-
connection(A, B).
connected(A, B) :-
connection(A, C),
connected(C, B).
?- connected(hermione, X).
X = harry ;
X = ron.
Как можно это сделать и добавитьзакрытие соответственно таблинг к нему?Я думаю, что итоговое табулирование будет более мощным, чем предикат closure , поскольку различные пути, ведущие к одному и тому же узлу, прекратят поиск быстрее,
, так как соответствующая табуляция может собирать посещенный список,который не возвращается, но столкнулся бы с разобщениями.Не уверен, приведет ли это также к демонстрации сдвига / сброса, то есть продолжения с разделителями.