Пролог вернуть дубликат списка - PullRequest
1 голос
/ 19 октября 2011

Я получаю дублированный список, когда пытаюсь найти / 3 возможных путей в графике? Есть идеи, что не так с кодом? Шаблон дублирования: S: 6 дублируется с S: 13, S: 7 с S: 14, S: 8 с S: 15 и т. Д.

 co(X,Y) :- hen(X,Y) ; hen(Y,X).

 pan(A, B, _, [A,B]) :- co(A, B).
 pan(A, B, Vix, [A | Len]) :-
     co(A, C),
     C \== B,
     \+ member(C, Vix),
     pan(C, B, [C | Vix], Len).

 long_p(A, B):-
     findall(Len, pan(A,B,[A],Len), Z),
     printT(Z,0).

 printT([],_).
 printT([H|T],V) :-
     V1 is V + 1,
     write('S: '), write(V1), nl,
     write(H), nl,
     nl,
     printT(T,V1).

Приведет ли Prolog findall / 3 к отличному результату?

Ответы [ 2 ]

0 голосов
/ 19 октября 2011
findall(Len, pan(A,B,[A],Len), Z)

создаст список Z с всеми Len, так что pan(A,B,[A],Len) будет успешным.Итак, pan(A,B,[A],Len) возвращается, и все решения Len заносятся в список Z.

На вашем графике есть маршрут длиной 6 между двумя конкретными узлами A и B.Но есть также путь от A до B через некоторый C длиной 13. findall находит эти два маршрута и т. Д.

0 голосов
/ 19 октября 2011

Я угадаю.

printT/2 печатает S:(length-of-path). Почему не должно быть нескольких путей от А до Б одинаковой длины?

Полагаю, ваша проблема в том, что long_p/2 дважды успешно проходит по одному и тому же пути. Я не вижу никакой причины для этого в pan/4. Если я не ошибаюсь, причина в co/2 и / или hen/2. Например, если в вашей базе данных есть hen(a,b) и hen(b,a), co(a,b) будет выполнен дважды. Это можно исправить с помощью

co(X,Y) :- hen(X,Y).
co(X,Y) :- hen(Y,X), \+ hen(X,Y).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...