DLVを使用して、最小距離のグラフ内のすべてのパスを検索しようとしています。私は(私はいずれもスキップしないことを望む)述語を得るために期待していDLVの最短経路を見つける
:
- パス(A、B、1)、パス、私は次のグラフを持っていると言います(b、a、1)、パス(b、c、1)、パス(d、a、1)、パス(a、 (c、e、1)、パス(c、e、1)、パス(c、d、2)、パス(b、e、2) )
- path(d、a、 1)、パス(d、b、2)、パス(d、e、2)、パス(d、c、3)
- パス(e、a、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)
3番目のルールのアイデアは、彼らが戻って(X = Z!)を予定されていない場合は2つの、既存のパスを追加したと同じエッジを結ぶ経路が既に存在ではありませんより短い距離(経路(X、Z、V)ではなく、V <L、#int(V))である。 #int(V)を追加する必要がありました。それ以外の場合、ルールは安全ではなかったからです。この安全性の問題を整数値で解決するより良い方法があるかどうかはわかりません。
このコードを実行すると(フラグN = 5で#maxint = 5に設定すると)、そこには存在しないパス、たとえばpath(d、a、5)が得られます。 #int(V)などの問題があるかどうかは分かりませんが、すでにパス(d、a、1)があるのでこれらのパスが表示されるとは思われません。おそらくそれは#int(V)のせいだが、これをどうやって行うのか分からない。
誰も私がこれを解決するのを手助けできますか?前もって感謝します。
私は、_path_述語内のリストを使用してパスを見つける問題を解決しましたが、私がここに投稿しているソリューションがなぜ機能しないのかを知りたいと思っています。 – rutex
ソリューションベース@CapelliCの入力で誰かが興味を持っている場合に備えて、リストの有無にかかわらずソリューションを投稿します。 – rutex