2010-10-23 154 views
1

我正在嘗試編寫Prolog代碼以確定綁定變量X是否位於列表中綁定變量Y的範圍內。如果XY是同一個列表的成員,或者如果X是列表中的成員,則該列表可能是嵌套的,並且XY的範圍內,如果X是列表的成員,該列表是列表的成員...(嵌套無限期地)在與Y相同的列表中。這裏我將in_scope(X,Y,List)定義爲X在最外層列表List中的Y的範圍內。我寫了下面的代碼,但是這個代碼導致堆棧溢出:Prolog中的堆棧溢出

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

我才懶得跟蹤實際的錯誤,但下面的簡化代碼

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 . 
+0

謝謝!並且'in_sublist(X,Sub)'應該在(X,Sub)'中? – sentinel 2010-10-24 22:04:04

+0

是的,道歉。我重新命名了謂詞,然後重新命名了它。 – 2010-10-24 22:05:21

+0

不客氣。我在'in/2'謂詞中至少發現了一個錯誤。將變量名稱更改爲可理解的內容幫助了很多:) – 2010-10-25 10:59:50