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が生成されます。 この述部はこれを再帰的に行うため、最終リストは常に非グラウンドになります。