我正在尝试编写Prolog代码来确定绑定变量X
是否在列表中绑定变量Y
的范围内。列表可以嵌套,如果X
和Y
是同一列表的成员,或者X
是Y
的成员,则X
在Y
范围内作为列表成员的列表的列表...(无限期嵌套)与in_scope(X,Y,List)
在同一列表中。在此,我将X
定义为Y
在最外面的列表List
中的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).
范围内。我编写了以下代码,但此代码导致堆栈溢出:
{{1}}
我很感激帮助修改代码以避免堆栈溢出。
答案 0 :(得分: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 .