Это левая рекурсия в Прологе? - PullRequest
1 голос
/ 25 февраля 2011

Я использую swipl 5.10.2.Сегодня я начал изучать Пролог для своего курса по искусственному интеллекту.Я начал с довольно простого примера:

father(giovanni,maria).
brother(paolo,pietro).

grandpa(X,Y) :-
        father(X,Z),
        father(Z,Y).
grandpa(X,Y) :-
        father(X,Z),
        mother(Z,Y).

mother(maria,paolo).
mother(I,J) :-
        mother(I,K),
        brother(K,J).

Ничего страшного, если я попробую эту цель grandpa(giovanni,pietro), она сработает и даст мне true .Затем я хочу ускорить вызов и изменил код следующим образом:

father(giovanni,maria).
brother(paolo,pietro).

grandpa(X,Y,Z) :-
        father(X,Z),
        father(Z,Y).
grandpa(X,Y,Z) :-
        father(X,Z),
        mother(Z,Y).

mother(maria,paolo).
mother(I,J) :-
        mother(I,K),
        brother(K,J).

, потому что я хотел знать middle-man , но когда я его запускаю, вот что происходит:1012 *

?- grandpa(giovanni,pietro,M).
M = maria ;
ERROR: Out of local stack

Это потому, что, imho, у матери есть левая рекурсия, дерево продолжает расширяться, не находя закрытия.

Тогда я написал это:вывод:

?- grandpa(giovanni,pietro,M).
M = maria ;
false.

Это правильно.Так это просто проблема левой рекурсии или я что-то упускаю из поведения swipl?И когда у меня «ОШИБКА: вне локального стека» , это всегда проблема рекурсии?

1 Ответ

3 голосов
/ 25 февраля 2011

Я считаю, что ошибка Out of local stack почти всегда (или всегда) происходит из-за слишком глубоких рекурсий; в простых программах эти рекурсии могут быть бесконечными. Проблема в вашем коде - действительно проблема левой рекурсии; попытка решить mother(anything, B) будет пытаться решить mother(anything, B1), mother(anything, B2) и т. д., пока не закончится пространство стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...