Программирование на языке Пролог для искусственного интеллекта - страница 10

стр.

>?-  предок( пам, 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. Как пролог-система отвечает на вопросы

В данном разделе приводится неформальное объяснение того, как пролог-система отвечает на вопросы.

Вопрос к системе — это всегда последовательность, состоящая из одной или нескольких целей. Для того, чтобы ответить на вопрос, система пытается достичь всех целей. Что значит достичь цели? Достичь цели — это значит показать, что утверждения, содержащиеся в вопросе, истинны в предположении, что все отношения программы истинны. Другими словами, достичь цели - это значит показать, что она логически следует из фактов и правил программы. Если вопрос содержит переменные, система должна к тому же найти конкретные объекты, которые (будучи подставленными вместо переменных) обеспечивают достижение цели. Найденные конкретизации сообщаются пользователю. Если для некоторой конкретизации система не в состоянии вывести цель из остальных предложений программы, то ее ответом на вопрос будет "нет".