Пролог-лабиринт остановить зацикливание

Мне удалось собрать сценарий, который проходит по всем ссылкам и отображает их мне, однако я не могу понять, почему с одной из ссылок весь сценарий зацикливается до бесконечности. Если вы удалите ссылку ниже, программа будет работать;

link(f,c).

Ниже приведен код полного скрипта;

link(a,b).
link(a,b).
link(b,c).
link(c,d).
link(f,c).
link(b,e).
link(d,e).
link(e,f).

path(X,Y,[X,Y]):-link(X,Y). 
path(X,Y,[X|R]):-link(X,Z),path(Z,Y,R).
route(X,Y,T):-find_route(X,Y,[],T).
find_route(X,Y,D,[Z|T]):-path(X,Y,Z),not(member(Z,D)), 
find_route(X,Y,[Z|D],T). 
find_route(_,_,_,[]).

Похоже, что в настоящее время он сопоставляет значения в массиве со значениями ссылок, затем сравнивает пути от a до f, после чего проверяет прошедшие значения и отображает их на консоли (это без ссылки (f, c).) Если кто-нибудь знает, где я прошел, пожалуйста, дайте мне знать.

Спасибо


person 10AlexD10    schedule 08.12.2014    source источник
comment
удалить бесполезный путь/3...   -  person CapelliC    schedule 08.12.2014


Ответы (1)


Связь (f,c) эффективно закрывает направленный цикл c->d->e->f->c. Таким образом, любой возврат на path(X,Y,Z) с X и Y, принадлежащими этому циклу, будет создавать все более и более длинные пути. Поэтому вам следует добавить проверку в правило path, чтобы избежать уже посещенных узлов.

person Eugene Sh.    schedule 08.12.2014