2010-10-23 6 views
1

Я пытаюсь написать код Пролога, чтобы определить, находится ли связанная переменная X в области связанной переменной Y в списке. Списки могут быть вложенными и X находится в области Y, если X и Y являются членами одного и того же списка, или если X является участником списка, который является членом списка, являющегося членом списка ... (вложенные на неопределенный срок), который находится в том же списке, что и Y. Здесь я определяю in_scope(X,Y,List) так, что X находится в диапазоне Y в самом дальнем конце List. Я написал следующий код, но этот код приводит к переполнению стека:Переполнение стека в 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)' быть 'in (X, Sub)'? – sentinel

+0

Да, извинения. Я переименовал предикат, а затем переименовал его. –

+0

Добро пожаловать. Я нашел хотя бы одну ошибку в предикате 'in/2'. Менялось изменение имен переменных на что-то понятное :) –

Смежные вопросы