На примере кода на Prolog дайте объяснение того, как выполняется запрос и почему он выдаёт определённый набор результатов:
parent(alice, bob). parent(bob, carol). ancestor(X,Y) :- parent(X,Y). ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y). ?- ancestor(alice, Who).

18 Ноя в 17:18
4 +4
0
Ответы
1
Программа:
parent(alice, bob).\text{parent(alice, bob).}parent(alice, bob). parent(bob, carol).\text{parent(bob, carol).}parent(bob, carol). ancestor(X,Y) :- parent(X,Y).\text{ancestor(X,Y) :- parent(X,Y).}ancestor(X,Y) :- parent(X,Y). ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).\text{ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).}ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).
Запрос:
?−ancestor(alice, Who).?- \text{ancestor(alice, Who).}?ancestor(alice, Who).
Пошагово (SLD, глубинный поиск слева направо):
1) Пробуем первый вариант правила-основы ancestor(X,Y) :- parent(X,Y).\text{ancestor(X,Y) :- parent(X,Y).}ancestor(X,Y) :- parent(X,Y).. Унификация с ancestor(alice, Who)\text{ancestor(alice, Who)}ancestor(alice, Who) даёт подстановку {X/alice, Y/Who}\{X/alice,\;Y/Who\}{X/alice,Y/Who}. Требуется факт parent(alice, Who)\text{parent(alice, Who)}parent(alice, Who). Факт parent(alice, bob)\text{parent(alice, bob)}parent(alice, bob) соответствует, получаем первый ответ
{Who/bob}\{Who/bob\}{Who/bob} (то есть Who = bob).
2) При запросе следующих решений Prolog откатывается и пробует второй вариант правила
ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).\text{ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).}ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y)..
Унификация даёт {X/alice, Y/Who}\{X/alice,\;Y/Who\}{X/alice,Y/Who}. Нужно сначала parent(alice,Z)\text{parent(alice,Z)}parent(alice,Z) — это даёт {Z/bob}\{Z/bob\}{Z/bob}. Теперь остаётся решить ancestor(bob, Who)\text{ancestor(bob, Who)}ancestor(bob, Who).
3) Для ancestor(bob, Who)\text{ancestor(bob, Who)}ancestor(bob, Who) сначала снова применяется правило-основа ancestor(X,Y):-parent(X,Y)\text{ancestor(X,Y):-parent(X,Y)}ancestor(X,Y):-parent(X,Y). Требуется parent(bob, Who)\text{parent(bob, Who)}parent(bob, Who), есть факт parent(bob, carol)\text{parent(bob, carol)}parent(bob, carol), получаем второй ответ
{Who/carol}\{Who/carol\}{Who/carol} (то есть Who = carol).
4) Дальнейший бэктрекинг: альтернатив для ancestor(bob, Who)\text{ancestor(bob, Who)}ancestor(bob, Who) и для parent(alice,Z)\text{parent(alice,Z)}parent(alice,Z) исчерпались (второй вариант порождает требование ancestor(carol, ...)\text{ancestor(carol, ...)}ancestor(carol, ...), которое не выполняется), поэтому новых решений нет.
Итого ответы выдаются в порядке:
1) Who=bob\;Who = bobWho=bob 2) Who=carol\;Who = carolWho=carol
Порядок и наличие именно этих ответов объясняются стратегией поиска Prolog (глубинный DFS, слева направо) и структурой правил (сначала прямой родитель, затем рекурсивный шаг через промежуточного предка).
18 Ноя в 17:27
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир