2017-01-10 7 views
0

Если у вас есть эти факты:Как работает этот код Prolog (grandparent)?

parent(albert, bob). 
parent(albert, betsy). 
parent(albert, bill). 

parent(alice, bob). 
parent(alice, betsy). 
parent(alice, bill). 

parent(bob, carl). 
parent(bob, charlie). 

А потом этот код:

grand_parent(X, Y) :- 
parent(Z, X), 
parent(Y, Z). 

И если вы напечатаете:

grand_parent(carl, A) 

Затем он возвращает:

A = albert ? ; 
A = alice ? ; 
no 

Как это работа?
Это немного запутанно. Особенно часть «Z».

+0

В чем проблема? –

+0

Извини, что-то испортилось. Я перепечатал его сейчас. Спасибо. – F1R3

ответ

3

Я держал пари, что выглядит менее запутанным, если вы лучше использовать имена переменных:

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, потому что это из идей.

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^