Вот несколько указателей: для моделирования неориентированного графа вам не нужен факт «узел», просто факт «дуга».Что вы хотите подтвердить фактом «дуги», так это то, что между двумя узлами есть дуга.Таким образом, вам нужно всего лишь что-то вроде
arc(1, 2).
arc(1, 4).
...
Теперь, согласно вашему определению Path, кажется, что вы хотите, чтобы запрос выполнялся успешно, если существует путь от X до Y с общим весом A. Если выРабота с ориентированными графами, которые могут быть выражены с помощью предиката, подобного следующему:
path(X, Y, 1):- arc(X, Y).
path(X, Y, A):- arc(X, Z), Z\=Y,
path(Z, Y, A1),
A is A1+1.
Обратите внимание, что это может привести к бесконечным циклам, если граф циклический.Чтобы избежать этой проблемы, вы можете отслеживать посещенные узлы, так что вы посещаете почти один раз каждый узел:
path(X, Y, A):- path(X, Y, [X], A).
path(X, Y, _, 1):- arc(X, Y).
path(X, Y, Visited, A):- arc(X, Z),
not(member(Z, Visited)),
path(Z, Y, [Z|Visited], A1),
A is A1+1.
Теперь этот алгоритм может быть тривиально изменен для работы с неориентированными графами, добавив еще одно предложение.