1

我正在尝试编写 Prolog 代码来确定绑定变量X是否在列表中绑定变量的范围内Y。列表可以嵌套,并且在ifX的范围内,并且是同一列表的成员,或者如果是列表的成员,该列表的成员是列表的成员,并且是列表的成员...(无限期嵌套)在与 相同的列表。这里我定义的意思是在最外层列表的范围内。我编写了以下代码,但此代码导致堆栈溢出: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 回答