Переполнение стека в Прологе - PullRequest
1 голос
/ 23 октября 2010

Я пытаюсь написать код Пролога, чтобы определить, находится ли связанная переменная 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 Ответ

1 голос
/ 24 октября 2010

Мне было лень отследить фактическую ошибку, но следующий, упрощенный код

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