traceroute(_,L) :- member((A,A),L). traceroute(N,L) :- predecessor(N,P), append(N,L,L1), traceroute(P,L1).
0
0
ルーティング機能を作成しようとしていますが、必要な結果が得られないようです。 これが今のところコードです。 先行操作は、Nにリンクされているノードを見つけて、Pとして返します。
traceroute(_,L) :- member((A,A),L). traceroute(N,L) :- predecessor(N,P), append(N,L,L1), traceroute(P,L1).
「traceroute(placeA、Y)。」を実行すると、このデータが返されます。 Y = [(_G575、_G575)| _G579] .
基本的に、tracerouteの最初の行では、メンバーがそれ自体の先行メンバーである場合、再帰を終了しようとしています。 2番目の部分は、すべてのノードをループし、リストに追加する必要があります(L)。
ノードは[(placeA、placeB)、(placeB、placeC)]のように格納され、リストは[placeA、placeB、placeC]のように格納する必要があります
なぜこれらの結果を得ているのか理解できません。
1 回答
2
このように見えるソリューション(正しくない場合)は、通常、用語をどこに置くべきか(つまりインスタンス化)していないことを意味します。
あなたのコードがどのように機能するかは完全にはわかりませんが、主な問題は、tracerouteの2番目の引数に非グラウンド変数を渡すことです。
メンバー呼び出しでは、Lは非グラウンドであるため、実際には、プロローグに、完全にインスタンス化されていないリストの要素であるフォーム(A、A)のアイテムを返すように要求しています。 これはあまり意味がありませんが、この種のことを行うことが有用な場合がありますので、プロローグは忠実に準拠し、(バックトラック時に)増加する長さのリストを生成します(どこにも長さを指定していないため)ある時点でアイテム(A、A)を持つ変数。 ie:
?- traceroute(placeA, Y). Y = [ (_G271, _G271)|_G275] ; Y = [_G274, (_G271, _G271)|_G278] ; Y = [_G274, _G277, (_G271, _G271)|_G281] ; Y = [_G274, _G277, _G280, (_G271, _G271)|_G284] ;
グラウンドであるYの値を渡すか、述部内で取る値をさらに制約するか、場合によってはその両方を渡す必要があります。
また、2番目の句は実際には実行されませんが、同様の問題があります。再び非グラウンドであるLがNに追加され、L1が生成されます。 この述部はこれを再帰的に行うため、最終リストは常に非グラウンドになります。