Программа на Prolog

551
.

Да да, и такое тоже бывает :-D
Есть проблема с программой на прологе. Что-то не могу понять :-(

Вот код (+/-)

predicates
child(string, string)
grandchild(string, string)
ggrandchild(string, string)
ancestor(string, string)
clauses
child("Ivan", "Petro").
child("Ivan", "Vira").
child("Vira", "Olena").
child("Vira", "Oleg").
child("Petro", "Maxim").
child("Oleg", "Anna").
grandchild(X, Z) :- child(X, Y), child(Y, Z).
ggrandchild(X, T) :- child(X, Y),
child(Y, Z), child(Z, T).
ancestor(X, Z) :- child(X, Z).
ancestor(X, Z) :- ancestor(X, Y), child(Y, Z).

goal
ancestor("Ivan", X), write(X), nl, fail.

Кто знаком с прологом, тот поймет чего я хочу :-)
Проблемы в строке: ancestor(X, Z) :- ancestor(X, Y), child(Y, Z). Трассирование зацыкливается..
Если поставить: ancestor(X, Z) :- child(X, Y), ancestor(Y, Z), то жизнь прекрасна и трассирование проходит на ура.
Как можно описать причину такого поведения?
.

Уже нашел кое-что. Понятие левосторонней рекурсии. Функция, которая сначала вызывает себя, а описывает правила. В данном случае оно проходит весь список и выводит предков, а потом по рекурсии делает тоже самое(зацыкливаясь) и в итоге: выдает ошибку о переполнение стека памяти.
Вывод: не пользуйтесь левосторонней функцией ;-)
p.s. Если кто-то дойдет то этого, то не против был бы, если бы сказали, что я понял неправильно.

Всего: 2