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