1

Xバインドされた変数がリスト内のバインドされた変数のスコープ内にあるかどうかを判断する Prolog コードを作成しようとしてYいます。リストは入れ子にすることができ、同じリストのメンバーである場合、またはあるリストのメンバーであるリストのメンバーであるリストのメンバーである場合Xのスコープ内にあります...(無期限にネストされています)と同じリスト。ここでは、最も外側の listの範囲内にあることを意味するように定義します。次のコードを書きましたが、このコードではスタック オーバーフローが発生します。YXYXYin_scope(X,Y,List)XYList

in_scope(X,Y,List) :- in(Parent,List), member(X,Parent), member(Y,Parent).
in_scope(X,Y,List) :- in(X,Parent), in_scope(Parent,Y,List).

in(X,Y) :- member(X,Y).
in(X,Y) :- member(X,Z), in(Z,Y).

スタック オーバーフローを回避するためにコードを修正していただければ幸いです。

4

1 に答える 1

1

実際のエラーを追跡するのが面倒でしたが、次の単純化されたコード

in_scope(X,Y,List) :- member(Y,List), in(X,List).
in_scope(X,Y,List) :- member(Sub,List), in_scope(X,Y,Sub).

in(X,List) :- member(X,List).
in(X,List) :- member(Sub,List), in(X,Sub).

意図した結果が得られます:

?- in_scope(x,z,[x,y,z]).
true .

?- in_scope(x,z,[[x,y],z]).
true .

?- in_scope(x,z,[[[[[x],y]],z]]).
true .

?- in_scope(x,a,[[[[[x],y]],z]]).
false.

ただし、次の点に注意してください。これが意図した動作かどうかはわかりません:

?- in_scope(x,x,[x]).
true .
于 2010-10-24T14:43:19.347 に答える