|
||||
|
Назад | Содержание| Вперёд 1. 3. Рекурсивное определение правил Д...Назад | Содержание| Вперёд 1. 3. Рекурсивное определение правил Давайте добавим к нашей программе ородственных связях еще одно отношение - предок.Определим его через отношение родитель.Все отношение можно выразить с помощью двухправил. Первое правило будет определятьнепосредственных (ближайших) предков, а второе -отдаленных. Будем говорить, что некоторыйявляется отдаленным предком некоторого Z, еслимежду X и 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", добавленными впрограмму в виде комментариев.Эти имена будут использоваться в дальнейшем дляссылок на соответствующие правила. Вообщеговоря, комментарии пролог-системойигнорируются. Они нужны лишь человеку, которыйчитает программу. В Прологе комментарииотделяются от остального текста программыспециальными скобками "/*" и "*/". Такимобразом, прологовский комментарий выглядит так /* Это комментарий */ Другой способ, более практичный для короткихкомментариев, использует символ процента %. Все,что находится между % и концом строки,расценивается как комментарии: % Это тоже комментарий Упражнение 1. 6. Рассмотрим другойвариант отношения предок: предок( X, Z) :- родитель( X, Z). предок( X, Z) :- родитель( Y, Z). предок( X, Y). Верно ли и такое определение? Сможете ли Выизменить диаграмму на рис. 1.7 таким образом, чтобыона соответствовала новому определению? Посмотреть ответ Назад | Содержание| Вперёд |
|
||
Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх |
||||
|