Я использую 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?И когда у меня «ОШИБКА: вне локального стека» , это всегда проблема рекурсии?