Нахождение расстояния между узлами графа в прологе - PullRequest
2 голосов
/ 25 июля 2011

У меня есть график в Прологе, представленный ребрами и весами:

connected(a,b,2).
connected(b,e,1).
connected(b,l,5).
connected(b,g,2).
connected(c,s,2).
connected(d,a,2).
connected(d,k,4).
connected(d,l,7).
connected(e,m,2).

Мне нужно написать предикат, который принимает список узлов и расстояния.

?- dist([a,b,e],X).
X=3

Я пытался написать это, но это очень неуклюже и не дает ожидаемого результата.

Основная идея, которую я имею: Если это список из 2 элементов, то посмотрите, связаны ли они. Если в списке более 2 элементов: посмотрите, связаны ли 1-й элемент и 2-й элемент, рекурсивно посмотреть, связаны ли следующие элементы. Я определил 2 вспомогательных предиката для головы и хвоста.

dist([A, B], X) :-
    connected(A, B, X).
dist([A|B], Length) :-
    connected(A, hd(B,H,N), X),  % sees if A & next element in the list are connected
    dist(tl(B,H,N), Length1),    % recursive call with the list excluding element A
    Length is X + Length1.       

hd([H|T],H,Q).
tl([H|T],T,Q).

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

1 Ответ

6 голосов
/ 25 июля 2011
dist([_], 0).            % path of length 0 has distance 0
dist([A, B | T], L) :-
    connected(A, B, L1), % A and B are connected directly, the distance is L1
    dist([B|T], L2),     % the distance between B and the last element is L2
    L is L1 + L2.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...