Программирование на языке Пролог для искусственного интеллекта | страница 16
Возвращаясь к нашей программе, можно теперь задать системе вопрос: "Кто потомки Пам?" То есть: "Кто тот человек, чьим предком является Пам?"
>?- предок( пам, 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", добавленными в программу в виде комментариев. Эти имена будут использоваться в дальнейшем для ссылок на соответствующие правила. Вообще говоря, комментарии пролог-системой игнорируются. Они нужны лишь человеку, который читает программу. В Прологе комментарии отделяются от остального текста программы специальными скобками "