Происхождение вашей «проблемы» (т. Е. Порядка целей) глубоко укоренено в основах языка.
Пролог основан на простой и эффективной стратегии обратного отслеживания, для реализации разрешения SLD , и оставленные рекурсивные предложения, такие как anc4/2
, вызывают бесконечную рекурсию.
Действительно, оператор запятой (,)/2
означает
вычислить правильное выражение только , если левое выражение содержит
Итак, порядок целей в предложении на самом деле является неотъемлемой частью программы.
Для вашего конкретного случая,
... , parent(Y,Z).
нельзя вызвать, если
anc4(X,Y),
не держит.
Аналогом целей порядка является пунктов порядка .
То есть вся программа имеет другую семантику после обмена предложениями:
anc4(X,Z):-
parent(X,Z).
anc4(X,Z):-
anc4(X,Y),
parent(Y,Z).
Чтобы лучше понять проблему, думаю, стоит попробовать и это определение.