Я пытаюсь реализовать алгоритм обхода DAG, который также получает затраты между ребрами. Я думаю, что я довольно близок, но запросы всегда возвращают недопустимые пути. Может ли кто-нибудь взглянуть и увидеть, что мне здесь не хватает?
edge(b, a, 5).
edge(a, u, 10).
edge(u, o, 140).
edge(u, r, 130).
edge(r, o, 20).
edge(r, v, 50).
edge(o, v, 45).
edge(b, v, 20).
path(Start, Start, [], 0).
path(Start, Finish, [Start, Finish], C) :-
edge(Start, Finish, Cost),
C is Cost.
path(Start, Finish, [Start|Path], C) :-
edge(Start, X, Cost),
path(X, Finish, Path, RCost),
C is Cost + RCost.
Я пытаюсь запустить path(b, v, S, C).
. Он генерирует все допустимые пути, но также генерирует несколько недопустимых путей.
C = 20,
S = [b, v]
C = 200,
S = [b, a, u, o, v]
C = 200,
S = [b, a, u, o]
C = 195,
S = [b, a, u, r, v]
C = 210,
S = [b, a, u, r, o, v]
C = 210,
S = [b, a, u, r, o]
C = 195,
S = [b, a, u, r]
C = 20,
S = [b]
Спасибо.