Я хочу выполнить поиск по графу с помощью 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, который я использую. Может ли кто-нибудь помочь мне с альтернативным решением?
Редактировать: я знаю, что для графиков в целом было бы решением вместо этого отслеживать узлы, например, в в этом примере, но для моего конкретного приложения "узлы" также могут быть на ребре, что почему я хочу проверять посещенные ребра, а не посещенные узлы.