Программирование на языке Пролог для искусственного интеллекта - [8]
Рис. 1.5. Пример отношения >предок: (а) >X — ближайший предок >Z; (b) >X — отдаленный предок >Z.
Первое правило простое и его можно сформулировать так:
Для всех X и Z,
X — предок Z, если
X — родитель Z.
Это непосредственно переводится на Пролог как
>предок( X, Z) :-
> родитель( X, Z).
Второе правило сложнее, поскольку построение цепочки отношений >родитель может вызвать некоторые трудности. Один из способов определения отдаленных родственников мог бы быть таким, как показано на рис. 1.6. В соответствии с ним отношение предок определялось бы следующим множеством предложений:
>предок( X, Z) :-
> родитель( X, Z).
>предок( X, Z) :-
> родитель( X, Y),
> родитель( Y, Z).
>предок( X, Z) :-
> родитель( X, Y1),
> родитель( Yl, Y2),
> родитель( Y2, Z).
>предок( X, Z) :-
> родитель( X, Y1),
> родитель( Y1, Y2),
> родитель( Y2, Y3),
> родитель( Y3, Z).
>...
Рис. 1.6. Пары предок-потомок, разделенных разным числом поколений.
Эта программа длинна и, что более важно, работает только в определенных пределах. Она будет обнаруживать предков лишь до определенной глубины фамильного дерева, поскольку длина цепочки людей между предком и потомком ограничена длиной наших предложений в определении отношения.
Существует, однако, корректная и элегантная формулировка отношения >предок — корректная в том смысле, что будет работать для предков произвольной отдаленности. Ключевая идея здесь — определить отношение >предок через него самого. Рис 1.7 иллюстрирует эту идею:
Для всех X и Z,
X — предок Z, если
существует Y, такой, что
(1) X — родитель Y и
(2) Y — предок Z.
Предложение Пролога, имеющее тот же смысл, записывается так:
>предок( X, Z) :-
> родитель( X, Y),
> предок( Y, Z).
Теперь мы построили полную программу для отношения >предок, содержащую два правила: одно для ближайших предков и другое для отдаленных предков. Здесь приводятся они оба вместе:
>предок( X, Z) :-
> родитель( X, Z).
>предок( X, Z) :-
> родитель( X, Y),
> предок( Y, Z).
Рис. 1.7. Рекурсивная формулировка отношения >предок.
Ключевым моментом в данной формулировке было использование самого отношения >предок в его определении. Такое определение может озадачить - допустимо ли при определении какого-либо понятия использовать его же, ведь оно определено еще не полностью. Такие определения называются рекурсивными. Логически они совершенно корректны и понятны; интуитивно это ясно, если посмотреть на рис. 1.7. Но будет ли в состоянии пролог-система использовать рекурсивные правила? Оказывается, что пролог-система очень легко может обрабатывать рекурсивные определения. На самом деле, рекурсия — один из фундаментальных приемов программирования на Прологе. Без рекурсии с его помощью невозможно решать задачи сколько-нибудь ощутимой сложности.
Возвращаясь к нашей программе, можно теперь задать системе вопрос: "Кто потомки Пам?" То есть: "Кто тот человек, чьим предком является Пам?"
>?- предок( пам, 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", добавленными в программу в виде
В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИИнформационная технологияРУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯInformation technology. Guidelines for the management of software documentationИздание официальноеДата введения 1994-07-01ГОССТАНДАРТ РОССИИ Москва© Издательство стандартов, 1994.
Самоучитель UMLПервое издание.В книге рассматриваются основы UML – унифицированного языка моделирования для описания, визуализации и документирования объектно-ориентированных систем и бизнес-процессов в ходе разработки программных приложений. Подробно описываются базовые понятия UML, необходимые для построения объектно-ориентированной модели системы с использованием графической нотации. Изложение сопровождается примерами разработки отдельных диаграмм, которые необходимы для представления информационной модели системы.