Пролог транзитивного замыкания в интерпретаторе "чили" - PullRequest
0 голосов
/ 16 апреля 2019

Это возможно, чтобы вернуться обратно.Это недавно продемонстрировал интерпретатор "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 , поскольку различные пути, ведущие к одному и тому же узлу, прекратят поиск быстрее,

, так как соответствующая табуляция может собирать посещенный список,который не возвращается, но столкнулся бы с разобщениями.Не уверен, приведет ли это также к демонстрации сдвига / сброса, то есть продолжения с разделителями.

...