Проблемы рекурсии в прологе - PullRequest
0 голосов
/ 26 ноября 2011

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

Буду признателен за любую помощь, которая может быть предложена.

go:-
    repeat,
    f([],0,lon,spa,OP,OD),
    write(OP),
    write(OD),
    fail.

city(lon).
city(ath).
city(spa).
city(kol).

path(lon,1,ath).
path(ath,3,spa).
path(spa,2,kol).
path(lon,1,kol).

joined(X,Y,D):-
    path(X,D,Y);path(Y,D,X).

f(Ci_Vi,Di,De,De,PaO,Di):-
    append([De],Ci_Vi,PaO),
    !.
f(Cities_Visited,Distance,Start,Destination,Output_Path,Output_Distance):-
    repeat,
    city(X),
    joined(Start,X,D),
    not_member(X,Cities_Visited),
    New_Distance is Distance + D,
    f([Start|Cities_Visited],New_Distance,X,Destination,Output_Path,Output_Distance).

not_member(X,List):-
    member(X,List),
    !,
    fail.
not_member(X,List).

Вывод, который я ожидаю здесь, это [spa, ath, lon] 4 [spa, kol, lon] 3.

Еще раз, любая помощь будет оценена.

Большое спасибозаранее.

1 Ответ

1 голос
/ 26 ноября 2011

Ваше решение по существу правильно.Введите f([],0,lon,spa,OP,OD), и вы получите первый путь, как и ожидалось.Единственная ошибка, которую я вижу, это то, что вы используете repeat в своем предикате поиска, поэтому вы продолжаете вычислять одно и то же решение.repeat почти никогда не требуется в бизнес-логике - отслеживание решений уже встроено в цикл REP.Уберите его, и вы получите второй путь, как и ожидалось, а затем (правильно) сбой.

...