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

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

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