Использование заморозки в JIProlog

Я хочу выполнить поиск по графу с помощью JIProlog. Приведенный ниже пример отлично работает без memberchk, но затем он возвращает пути с циклами, которые мне не нужны. Однако когда я его включаю, Пролог зависает, вероятно, из-за бесконечного поиска.

connected(ac,a,b). connected(ac,a,c). connected(ac,b,c). 
connected(ac,b,a). connected(ac,c,a). connected(ac,c,b).

path(A,B,[AB]) :- connected(AB,A,B).
path(A,C,[H|T]) :- connected(H,A,B), path(B,C,T), \+ memberchk(H,T).

В этом ответе я нашел, почему (список ребер еще не экземпляр) и подсказку к решению (используя freeze/2). Однако freeze/2 не работает в JIProlog, который я использую. Может ли кто-нибудь помочь мне с альтернативным решением?

Редактировать: я знаю, что для графиков в целом было бы решением вместо этого отслеживать узлы, например, в в этом примере, но для моего конкретного приложения "узлы" также могут быть на ребре, что почему я хочу проверять посещенные ребра, а не посещенные узлы.


person roelandvanbeek    schedule 04.10.2012    source источник
comment
см. этот ответ   -  person CapelliC    schedule 04.10.2012
comment
Спасибо. Однако я искал решение, в котором проверяется, были ли посещены треки, а не узлы. Я отредактировал вопрос, чтобы указать это явно.   -  person roelandvanbeek    schedule 06.10.2012
comment
Если вам это действительно нужно, вы можете поэкспериментировать с мета-интерпретатором, как здесь: stackoverflow.com/a/35133159/502187   -  person Mostowski Collapse    schedule 28.02.2016


Ответы (1)


Я не уверен, что понимаю ваше требование. Я бы попытался адаптировать предложенный ответ.

% get a path from start to end
path(Start, End, Path) :-
    path(Start, End, [], Path).

path(A, B, Visited, [AB|Visited]) :- connected(AB, A, B).

path(A, C, Visited, Path) :-
    connected(AB, A, B),
    \+ memberchk(AB, Visited),
    path(B, C, [AB|Visited], Path).

остерегайтесь: непроверенный код....

person CapelliC    schedule 05.10.2012