Ключевым моментом в данной формулировке было использование самого отношения предок
в его определении. Такое определение может озадачить - допустимо ли при определении какого-либо понятия использовать его же, ведь оно определено еще не полностью. Такие определения называются
Возвращаясь к нашей программе, можно теперь задать системе вопрос: 'Кто потомки Пам?' То есть: 'Кто тот человек, чьим предком является Пам?'
?- предок( пам, X).
X = боб;
X = энн;
X = пат;
X = джим
Ответы системы, конечно, правильны, и они логически вытекают из наших определений отношений предок
и родитель
. Возникает, однако, довольно важный вопрос: '
Неформальное объяснение того, как система это делает, приведено в следующем разделе. Но сначала давайте объединим все фрагменты нашей программы о родственных отношениях, которая постепенно расширялась по мере того, как мы вводили в нее новые факты и правила. Окончательный вид программы показан на рис. 1.8.
При рассмотрении рис. 1.8 следует учесть два новых момента: первый касается понятия 'процедура', второй — комментариев в программах. Программа, приведенная на рис. 1.8, определяет несколько отношений — родитель
, мужчина
, женщина
, предок
и т.д. Отношение предок
, например, определено с помощью двух предложений. Будем говорить, что эти два предложения входят в состав отношения предок
. Иногда бывает удобно рассматривать в целом все множество предложений, входящих в состав одного отношения. Такое множество называется
родитель( пам, боб). % Пам - родитель Боба
родитель( том, боб).
родитель( том, лиз).
родитель( бoб, энн).
родитель( боб, пат).
родитель( пат, джим).
женщина( пам). % Пам - женщина
мужчина( том). % Том - мужчина
мужчина( боб).
женщина( лиз).
женщина( энн).
женщина( пат).
мужчина( джим).
отпрыск( Y, X) :- % Y - отпрыск X, если
родитель( X, Y). % X - родитель Y
мать( X, Y) :- % X - мать Y, если
родитель( X, Y), % X - родитель Y и
женщина( X). % X - женщина
родительродителя( X, Z) :-
% X - родитель родителя Z, если
родитель( X, Y), % X - родитель Y и
родитель( Y, Z). % Y - родитель Z
сестра( X, Y) :- % X - сестра Y
родитель( Z, X),
родитель( Z, Y) % X и Y имеют общего родителя
женщина( X, Y), % X - женщина и
различны( X, Y). % X отличается от Y
предок( X, Z) :- % Правило пр1: X - предок Z
родитель( X, Z).
предок( X, Z) :- % Правило пр2: X - предок Z
родитель( X, Y),
предок( Y, Z).
Рис. 1.8. Программа о родственных отношениях.
На рис. 1.8 два предложения, входящие в состав отношения предок
, выделены именами 'пр1' и 'пр2', добавленными в программу в виде /*
' и '*/
'. Таким образом, прологовский комментарий выглядит так
/* Это комментарий */
Другой способ, более практичный для коротких комментариев, использует символ процента %
. Все, что находится между %
и концом строки, расценивается как комментарии:
% Это тоже комментарий
1.6. Рассмотрим другой вариант отношения предок:
предок( X, Z) :-
родитель( X, Z).
предок( X, Z) :-
родитель( Y, Z),
предок( X, Y).
Верно ли и такое определение? Сможете ли Вы изменить диаграмму на рис. 1.7 таким образом, чтобы она соответствовала новому определению?
1.4. Как пролог-система отвечает на вопросы
В данном разделе приводится неформальное объяснение того,