Я держал пари, что выглядит менее запутанным, если вы лучше использовать имена переменных:
grand_parent(Grandchild, Grandparent) :-
parent(Parent, Grandchild),
parent(Grandparent, Parent).
Вы видите, когда вы задаете запрос grand_parent(carl, X)
Пролог собирается найти определение grand_parent/2
и заменить carl
для Grandchild
. Чтобы доказать это, он должен доказать parent(Parent, carl)
. Ну, это удается один раз, объединив Parent
с bob
. Комманда работает как «и», поэтому теперь Prolog должен доказать parent(Grandparent, bob)
. Это удается, объединяя Grandparent
с albert
. Prolog всегда ищет базу данных в том порядке, в котором вы ее снабжаете фактами, поэтому мы получили Альберта, прежде чем мы получим Алису.
Когда вы нажмете ;
, это похоже на то, что вы разговариваете с Прологом, и вы говорите «или?». как бы для запроса другого решения. Поэтому Prolog поддерживает до последнего пункт выбора и начинает сканирование вперед. Последний пункт выбора был в parent(Grandparent, bob)
, поэтому он просматривает вперед, пока не найдет parent(alice, bob)
, который преуспевает, объединяющий Grandparent
с alice
. Вы просите его о другом решении, и он исчерпает все возможности с parent(Grandparent, bob)
, поэтому он вернется к parent(Parent, carl)
, который больше не найдет решений. В этот момент Пролог говорит false
, потому что это из идей.
Надеюсь, это поможет!
В чем проблема? –
Извини, что-то испортилось. Я перепечатал его сейчас. Спасибо. – F1R3