У меня есть этот код, и я хочу пройти 3 дистанции и показать самое короткое на экране:
domains
node=symbol
distance = integer
PREDICATES
nondeterm link(node, node, distance)
nondeterm path(node, node, distance)
CLAUSES
link(a,b,4).
link(a,c,2).
link(b,g,5).
link(c,g,6).
link(c,d,5).
link(d,g,3).
path(S,D,TDist):-
link(S,D,TDist).
path(S,D,TDist):-
link(S,X,TD1), path(X,D,TD2), TDist=TD1+TD2.
GOAL
path(a,g,TotalDistance).
Как я могу изменить этот код, чтобы получить кратчайшее расстояние?
@DanielLyons - это другой синтаксис?
Учитывая положительные веса, вы должны реализовать Алгоритм Дейкстры или, если нет, Алгоритм Беллмана-Форда. Путем перечисления всех путей это может масштабировать экспоненциально, тогда как Алгоритм Дейкстры и Алгоритм Беллмана-Форда являются полиномиальными.
Он достаточно другой, чтобы доставлять хлопоты, и у меня нет Windows для тестирования или лицензии Visual Prolog. Большинство из нас, похоже, удовлетворяет наши потребности с помощью SWI или одной из других реализаций с открытым исходным кодом, большинство из которых также являются кроссплатформенными.
Возможно, вы захотите использовать что-то вроде
setof/3
, чтобы получить все расстояния и найти минимальное, отсортировав их по длине. Но Visual Prolog в наши дни используется редко, поэтому не так много людей, которые могут вам с этим помочь. Если вы можете переключиться на SWI, я бы порекомендовал это.