Я смотрел на этот вопрос, в котором мы делаем предикат в Прологе, который находит путь между двумя узлами («станциями метро») в ориентированном графе.Исходный код, предложенный ниже:
path(Start, Dest, [[Start,Dest]]) :- connected(Start, Dest).
path(Start, Dest, [[Start, Waypoint]|Path]) :- dif(Dest, Waypoint),
connected(Start, Waypoint), path(Waypoint, Dest, Path).
Однако, чтобы иметь дело с циклами и исключить списки, которые их содержат, я попытался в рекурсивном хранилище станций, на которых я уже остановился, и проверить, чтоЯ не повторяю ни одного из них.Это код, который я придумал (обратите внимание, что я не делаю список списков, а скорее список самих станций)
alldifferent(_,[]).
alldifferent(X,[L|Ls]) :- dif(X,L), alldifferent(X,Ls).
pathaux(Start, Dest, [Start,Dest],Q) :- connected(Start, Dest), alldifferent(Start,Q).
pathaux(Start, Dest, [Start, Waypoint|Path],Q) :- dif(Dest, Waypoint),
connected(Start, Waypoint),
pathaux(Waypoint, Dest, Path, [Start|Q]), alldifferent(Start,Q).
path(X,Y,Z) :- pathaux(X,Y,Z,[]).
Однако, когда я добавляю правило, которое создает цикл
connected(ataba,naguib).
connected(naguib,sadat).
connected(sadat,opera).
connected(opera,dokki).
connected(opera,ataba). //Note this one
Я получаю бесконечную рекурсию!Как так?и как можно это исправить?