Я пытаюсь найти все пути в графе с минимальным расстоянием, используя DLV. Скажем, у меня есть следующий график:Найти кратчайший путь в DLV
Я ожидаю получить предикаты (я надеюсь, что я не пропустить какой-нибудь):
- путь (а, б, 1), путь (a, d, 1), путь (a, e, 1), путь (a, c, 2)
- путь (b, a, 1), путь (b, c, 1), путь (d, d, 2), путь (b, e, 2)
- путь (c, b, 1), путь (c, e, 1), путь (c, a, 2), путь (c, d, 3)
- Путь (d, a, 1), путь (d, b, 2), путь (d, e, 2), путь (d, c, 3)
- путь (e, a, 1), путь (e, c, 1) путь (e, d, 2), путь (e, b, 2)
Я предполагаю, что вы можете перемещать арку как влево, так и вправо. Итак, я попытался следующее:
path(X, Y, 1) :- arc(X, Y).
path(Y, X, 1) :- arc(X, Y).
path(X, Z, L) :- path(X, Y, M), path(Y, Z, N),
X!=Z,
L = M + N,
not path(X, Z, V), V < L, #int(V)
Идея третьих правил, чтобы добавить 2 существующих пути, если они не собираются обратно (X = Z!) И есть уже не путь, соединяющий то же ребро с более короткое расстояние (не путь (X, Z, V), V < L, #int (V)). Мне пришлось добавить #int (V), потому что в противном случае это правило не было безопасным. Я не знаю, есть ли лучший способ решить эту проблему безопасности с целым значением.
Когда я запускаю этот код (с флагом -N = 5 для установки # maxint = 5), я получаю пути, которых не должно быть, например, путь (d, a, 5). Я не знаю, связана ли проблема с #int (V) или чем-то еще, но я не ожидал появления этих путей, поскольку у меня уже есть путь (d, a, 1). Вероятно, это из-за #int (V), но я не могу понять, как это сделать правильно.
Может ли кто-нибудь помочь мне решить эту проблему? Заранее спасибо.
Я просто решил проблему нахождения пути с использованием списков в _path_ предикат, но все-таки я интересно знать, почему решение я вывешиваю здесь не работает – rutex
Я также сумел придумать решение, основанное на входе @CapelliC. Я отправлю решение с и без списков, если кто-то заинтересован. – rutex