0
edge(a, b).
edge(b, d).
edge(d, c).
edge(d, e).
edge(d, f).
edge(e, g).
edge(f, g).
edge(g, h).

(すべてのエッジが同じ長さであると仮定します)。

たとえば、a と d の間のパスの長さを取得するには、 を ?- length(a,d) 返す必要があり2*constant (a->b and b->d)ます。

isConnected2 つのノード間に接続があるかどうかをテストするために呼び出しを開始した再帰手順を実行することを知っています。

isConnected(X1, X2) :- edge(X1, X2).

isConnected(X1, X2) :- edge(X1, X), isConnected(X, X2).

しかし、ここから先に進む方法がわかりません。anddistを呼び出すプロシージャが必要であることはわかっています。その結果、次のエッジに移動し、次のような結果を追加します。しかし、これを行う方法がわかりません。isConnectedL is Length

どんな助けでも大歓迎です!

4

2 に答える 2

1

ダニエルからの答えは大丈夫です。返されたリストに length/2 を適用するだけです。ここでは、パスが確立された後に単位ステップを追加する、より直接的な方法を示します。

isConnected(X1, X2, 1) :- edge(X1, X2).
isConnected(X1, X2, D) :- edge(X1, X), isConnected(X, X2, T), D is T + 1.
于 2013-04-16T06:11:14.463 に答える