дб. Четвертое издание джозеф Джарратано Университет Хьюстон клиэрЛэйк Гари Райли People5oft, Издательский дом "Вильямс" Москва СанктПетербург Киев 2007 ббк 32. 973. 26 018 75 Д
Скачать 3.73 Mb.
|
size бу- Глава 8. Развитые средства сопоставления с шаблонами 658 S.12 Программа Sticks В предыдущих разделах данной главы описаны все основные методы, необходимые для завершения программы Sticks. Полный листинг программы Sticks приведен в файле sticks clp, который находится на компакт-диске, прилагаемом к данной книге. Ниже показан пример прогона этой программы после ее загрузки. CLIPS> (reset)J CLIPS> (run)J Who moves first (Computer: с Human: h)? GJ How many sticks in the pile? 15J Computer takes 2 stick(s). 13 stick(s) left in the pile. How many sticks do you wish to take? 3J 10 stick(s) left in the pile. Computer takes 1 stick(s). 9 stick(s) left in the pile. How many sticks do you wish to take? 2J 7 stick(s) left in the pile. Computer takes 2 stick(s) ° 5 stick(s) left in the pile. How many sticks do you wish to take? 1J 4 stick(s) left in the pile. Computer takes 3 stick(s). 1 stick(s) left in the pile. You must take the last stick! дет подставлено значение 7 и получено выражение (mod 7 4 ), результат вычисления которого равен 3. В списке фактов имеется только один факт take — sticks со значением слота for — равным 3. Для этого факта значение слота how — many равно поэтому компьютер в конечном итоге возьмет 2 палочки, оставив кучу с пятью палочками. А после любого следующего хода игрока-человека компьютер вынудит его проиграть. Обратите внимание на, что ограничение поля =, которое может использоваться только в условном элементе шаблона, не следует путать с предикативной функцией =, которая может применяться в ограничении, в условном элементе test, в правой части правила или в приглашении верхнего уровня. Ив этом случае, как и при использовании предикативного ограничения поля, можно формировать более сложные ограничения поля, применяя ограничения возвращаемого значения в сочетании с соединительными ограничениями поля -, & и . 8.13. Условный элемент or 659 You lose! CLIPS> 8.13 Условный элемент or (defrule shut-off-electricity-1 (emergency (type flood)) => (printout t "Shut off the electricity" crlf)) (defrule shut-off-electricity-2 (extinguisher-system (type water-sprinkler) (status on)) — > (printout t "Shut off the electricity" crlf)) В данном случае записаны два отдельных правила, нос использованием условного элемента or их можно объединить в следующее единственное правило shut-off-electricity (or (emergency (type flood)) (extinguisher- system (type water-sprinkler) (status on))) > (printout t "Shut off the electricity" crlf)) Одно это правило, в котором применяется условный элемент or, эквивалентно двум предыдущим правилам. Ввод в список фактов двух фактов, согласующихся с шаблонами данного правила, приведет к двукратному запуску этого правила, по одному разув расчете на каждый из фактов. Другие условные элементы могут быть включены вне условного элемента or и войти в состав неявного условного элемента and для всей левой части правила. Например, следующее правило: До сих пор все рассматриваемые правила содержали между шаблонами неявно заданный условный элемент and. Это означает, что запуск правила осуществляется, только если все шаблоны принимают истинное значение. Кроме того, в языке предусмотрена возможность задавать в левой части правили явный условный элемент and, и явный условный элемент or. В качестве примера применения условного элемента or рассмотрим приведенные ниже правила, предназначенные для использования в системе текущего контроля над промышленной установкой (cM. главу 7), которые вначале формулируются безусловного элемента ог. Затем в данном разделе будет показано, как перезаписать эти правила с условным элементом or. 660 Глава 8. Развитые средства сопоставления с шаблонами shut-off-electricity (electrical-power (status on)) (or (emergency (type flood)) (extinguisher-system (type water-sprinkler) (status on))) — > (printout t "Shut off the electricity" эквивалентно таким двум правилам (defrule shut-off-electricity-1 (electrical-power (status on)) (emergency (type flood)) — > (printout t "Shut off the electricity" crlf)) (defrule shut-off-electricity-2 (electrical- power (status on)) (extinguisher-system (type water-sprinkler) (status on)) => (printout t "Shut off the electricity" crlf)) Таким образом, условные элементы or позволяют создавать правила, эквивалентные нескольким правилам, поэтому возможно, что созданное сих помощью правило будет активизироваться несколько раз, с учетом различных шаблонов, содержащихся в условном элементе or. Итак, возникает резонный вопрос как устранить проблему неоднократного запуска Например, не требуется многократный вывод сообщения "Shut o f f the electricity" (Отключите подачу электроэнергии, связанный с наличием нескольких активизирующих фактов. Ведь подачу электроэнергии требуется отключить только один раз, независимо оттого, сколько причин вынуждают это сделать. По- видимому, наиболее приемлемый способ предотвращения запуска прочих правил состоит в модификации данного правила таким образом, чтобы оно обновляло список фактов, указывая, что сообщение о необходимости отключения электроэнергии уже передано. Модифицированное правило приведено ниже. (Важно отметить, что эти правила сформулированы на основании того предположения, что в нашем распоряжении есть внимательный оператор технологической установки, который следит за сообщениями системы текущего контроля и предпринимает необходимые действия. В реальном мире экспертной системе может быть предоставлена возможность непосредственно управлять включением и отключением различных систем еще один вариант состоит в том, что оператору технологической установки может быть предоставлен механизм, позволяющий сообщить 8.13. Условный элемент or системе текущего контроля о том, что им были выполнены те или другие действия off the electricity" После этой корректировки запуск правила осуществляется только один раз, поскольку вслед за запуском правила модифицируется факт, содержащий информацию о подаче электроэнергии. В результате этого возможность других активизаций правила под действием других шаблонов исключается. А если необходимо также удалить из списка фактов сам факт, ставший причиной отключения подачи электроэнергии, то данное правило должно быть записано следующим образом (defrule shut-off-electricity ?power <- (electrical-power (status on)) (or ?reason <- (emergency (type flood)) ?reason <- (extinguisher-system (type water — sprinkler) (status on))) (retract ?reason) (modify ?power (status off)) (printout t "Shut off the electricity" crlf)) (defrule shut-off-electricity-1 ?power <- (electrical-power (status on)) ?reason <- (emergency (type flood)) => (retract ?reason) Обратите внимание на то, что все условные элементы шаблона, относящиеся к условному элементу связываются с одной и той же переменной ? reason. На первый взгляд может показаться, что это — ошибка, поскольку чаще всего одна и та же переменная не присваивается разным шаблонам обычного правила. Но правила, в которых используются условные элементы or, имеет свою специфику. Дело в том, что применение условного элемента or фактически приводит к созданию нескольких правил, поэтому приведенное выше правило эквивалентно следующим двум правилам: Глава 8. Развитые средства сопоставления с шаблонами 662 (modify ?power (status off)) (printout t "Shut off the electricity" crlf)) (defrule shut-off-electricity-2 ?power <- (electrical-power (status on)) ?reason <- (extinguisher-system (type water — sprinkler) (status on)) (retract ?reason) (modify ?power (status off)) (printout t "Shut off the electricity" crlf)) Рассматривая эти два правила, можно убедиться в том, что для согласования действия (retract ?power ?reason) в правой части правила требовалось применить одно и тоже имя переменной. 8.14 Условный элемент and (defrule shut- off-electricity ?power <- (electrical-power (status on)) (emergency (type flood)) > (modify ?power (status off)) (printout t "Shut off the electricity" crlf)) может быть также записано с явным условным элементом and, таким образом (defrule shut-off-electricity (and ? power <- (electrical-power (status on)) (emergency (type flood))) > (modify ?power (status off)) (printout t "Shut off the electricity" Безусловно, способ записи правила с указанием явного условного элемента and, включающего всю левую часть правила, не дает никаких преимуществ. По своему назначению условный элемент and является противоположным условному элементу or. В последнем случае для активизации правила достаточно использовать любой из нескольких условных элементов, а в первом случае (когда применяется условный элемент and) требуется, чтобы были выполнены успешно проверки с помощью всех условных элементов. Система автоматически включает левую часть правила в неявный условный элемент and. Например, правило. Условный элемент and 663 Условный элемент and предусмотрен для того, чтобы его можно было использовать в сочетании с другими условными элементами для создания более сложных шаблонов. Например, условный элемент and может применяться в составе условного элемента or для обеспечения успешного выполнения проверки с помощью сразу нескольких условий, как показано в следующем примере use-carbon-dioxide-extinguisher ?system <- (extinguisher- system (type carbon-dioxide) (status off)) (or (emergency (type В) (and (emergency (type С) (electrical-power (status off)))) (modify ?system (status on)) (printout t "Use carbon dioxide extinguisher" crlf)) (defrule use-carbon-dioxide-extinguisher- 1 ?system <- (extinguisher-system (type carbon-dioxide) (status off)) (emergency (type В) => (modify ?system (status on)) (printout t "Use carbon dioxide extinguisher" crlf)) (defrule use- carbon-dioxide-extinguisher-2 ?system <- (extinguisher-system (type carbon-dioxide) (status off)) (emergency (type С (status off)) => Это правило активизируется, только если возникает чрезвычайная ситуация, при которой происходит пожар категории В (когда горит мазут или консистентная смазка) или категории С (охватывающий электрическое оборудование, а подача электроэнергии уже была отключена. По существу, углекислотные огнетушители всегда должны использоваться для тушения пожара категории В, но их применение для борьбы с пожаром категории С допустимо, только если выключение подачи электроэнергии не привело к угасанию огня. Правило use — carbon- dioxide — extinguisher эквивалентно следующим двум правилам Глава 8. Развитые средства сопоставления с шаблонами 664 (modify ?system (status on)) (printout t "Use carbon dioxide extinguisher" crlf)) S.15 Условный элемент not Иногда возникает такая необходимость, чтобы активизацию правила можно было осуществить исходя из отсутствия какого-то конкретного факта в списке фактов. Система CLIPS позволяет задавать условие отсутствия некоторого факта в левой части правила с помощью условного элемента not. В качестве простого примера укажем, что экспертная система текущего контроля может иметь следующие два правила, позволяющие получить отчет о состоянии контролируемой установки IF the monitoring status is to be reported and there is an emergency being handled THEN report the type of the emergency IF the monitoring status is to be reported and there is по emergency being handled THEN report that по emergency is being handled Для реализации приведенных выше простых правил удобно применить условный элемент not следующим образом (defrule report-emergency (report-status) (emergency (type ?type)) — > (printout t "Handling " ?type " emergency" crlf)) (defrule по (report-status) (not (emergency)) — > (printout t "No emergency being handled" Обратите внимание на то, что рассматриваемые два правила являются взаимоисключающими. Это означает, что эти два правила не могут находиться водно и тоже время в рабочем списке правил, поскольку невозможно одновременно получить успешный результат проверки второго шаблона в каждом правиле. Для создания некоторых интересных эффектов в отрицаемом шаблоне можно также использовать переменные. Рассмотрим следующее правило, применяемое для поиска наибольшего числа в группе фактов, представляющих числа. Условный элемент not 665 (defrule largest-number (number х) (not (number у ух" х crlf)) В первом шаблоне выполняется привязка к переменной значений всех фактов number, а второй шаблон предотвращает возможность активизации правила применительно к любому факту, кроме того факта, в котором хранится наибольшее значение ? х. Заслуживает внимания то, что переменные, впервые связанные со значением в условном элементе сохраняют свое значение только в области определения условного элемента not. Например, применение следующего правила (defrule no-emergency (report-status) (not (emergency (type ?type))) — > (printout t "No emergency of type " ?type приводит к появлению ошибки, поскольку переменная type используется в правой части правила, тогда как она остается связанной только в условном элементе not в левой части правила. Область определения переменных необходимо также учитывать, анализируя левую часть правила. Например, следующее правило позволяет определить, есть ли такие лица, данные о которых имеются в списке фактов, день рождения которых выпадает на какой-то конкретный день (defrule по- birthdays-on-specific-date (check-for-no-birthdays (date ?date)) (not (person (birthday ?date))) => (printout t "No birthdays on " ?date crlf)) Если бы первые два условных элемента были переставлены местами, как показано ниже, то данное правило прекратило бы действовать должным образом. (defrule по- birthdays-on-specific-date (not (person (birthday ?date))) (check-for- по (date ?date)) > (printout t "No birthdays on " ?date Проверка первого условного элемента оканчивалась бы неудачей, даже при наличии подходящих фактов person сданными о каких-либо людях. Дело в том, что значение, связанное с переменной ?date в первом условном элементе, не Глава 8. Развитые средства сопоставления с шаблонами бей по — identical — birthdays (not (and (person (name ? name) (birthday ?date)) (person (name -?name) (birthday ?date)))) (printout t "No two people have the same birthday" crlf) В условном элементе not применяется условный элемент and, поскольку условный элемент not может содержать самое большее один условный элемент. Обратите внимание на то, что в условном элементе not для правильного ограничения поиска двух человек с одними тем же днем рождения повторно используются переменные ? пате и ? date. Кроме того, специфика основополагающих алгоритмов, применяемых в системе такова, что шаблон (initial-fact) добавляется в начало любого условного элемента and (неявного или явного, первым условным элементом которого является условный элемент not или условный элемент test. Таким образом, следующее правило по (not (emergency)) =) (printout t "No emergencies" crlf)) преобразуется в такое правило (defrule повлияет на допустимые значения для переменной ? date во втором условном элементе. Такая ситуация противоположна ситуации, складывающейся при использовании первоначальной версии правила посв которой значение, связанное с переменной ? date в первом условном элементе, ограничивает поиск фактов person во втором условном элементе теми фактами, которые содержат данные о дне рождении, выпадающем на конкретную дату. В отличие от условных элементов шаблона, порядок расположения условного элемента not в левой части правила может повлиять на активизацию правила. Условный элемент not может использоваться в сочетании с другими условными элементами. Например, следующее правило позволяет определить, нет ли в списке фактов информации о двух таких лицах, дни рождения которых выпадают на одну и туже дату 8.16. Условный элемент exists — > (printout t "No emergencies" crlf)) Об этом преобразовании следует помнить, изучая вывод команды matches. Кроме того, необходимо учитывать, что индексы фактов для условных элементов not не отображаются в частичных согласованиях или в активизациях правил. Таким образом, активизация "f — 5,, f — 3" показывает, что первый условный элемент согласован с фактом, имеющим индекс факта 5, вторым условным элементом был условный элемент not, который не был согласован с каким-либо фактом, и поэтому проверка сего помощью завершилась успешно, а третий условный элемент согласован с фактом, имеющим индекс факта 3. 8.16 Условный элемент exists Условный элемент exists позволяет выполнять сопоставление с шаблонами с учетом наличия по меньшей мере одного факта, согласующегося с шаблоном, не принимая во внимание то, какое общее количество фактов в действительности согласуется с шаблоном. Это дает возможность создавать единственное частичное согласование или единственную активизацию для правила исходя из наличия хотя бы одного факта из класса фактов. Например, предположим, что при возникновении любой критической ситуации необходимо выводить информационное сообщение, чтобы указать операторам технологической установки на то, что они должны быть готовы к неблагоприятному развитию событий. Такое правило может быть записано следующим образом CLIPS> (reset)J CLIPS> (assert (emergency (type fire))) 1 (emergency (type flood)))J Alert CLIPS> Правило operator — alert — for — emergency можно модифицировать следующим образом для предотвращения повторной активизации правила в случае возникновения еще одной критической ситуации (defrule operator-alert-for-emergency (emergency) (not (operator-alert)) — > (printout t "Emergency: Operator Alert" crlf) (assert (operator-alert))) Повторную активизацию правила предотвращает условный элемент (not (operator — alert) ). Но, модифицируя правило указанным образом, приходится исходить из предположения, что если к операторам уже поступил тревожный сигнал, то он был активизирован с помощью правила operator — alertfor — emergency. Однако, как показывает следующее правило, тревожный сигнал операторам может быть передан входе учебы по подготовке к устранению чрезвычайных ситуаций operator-alert-for-drill (operator-drill) (not (operator-alert)) — > (printout t "Drill: Operator Alert" crlf) (assert (Обратите внимание на то, что если вначале произойдет запуск правила, касающегося формирования тревожного сигнала входе учебной подготовки, тов дальнейшем невозможно будет выполнить запуск правила формирования тревожного сигнала при возникновении критической ситуации, поскольку факт operator— alert (оператору передано сообщение) уже был вставлен в список фактов. Для устранения этой проблемы можно модифицировать структуру факта operator- alert, чтобы он хранил данные о причине формирования тревожного сигнала. Тем не менее при чрезмерном использовании управляющих фактов для предотвращения запуска правил сложность правил увеличивается, а удобство сопровождения правил уменьшается, поскольку вводятся дополнительные управляющие зависимости между правилами. К счастью, правило operator — alert — for — emergency можно модифицировать для использования в нем условного элемента exists, который устраняет. Условный элемент exists 669 необходимость в применении управляющих фактов. Условный элемент exists вырабатывает только одночастичное согласование, независимо от того, сколько фактов сопоставляется с условными элементами в условном элементе exists. Таким образом, если условный элемент exists является м условным элементом правила и предыдущие N — 1 условных элементов выработали М частичных согласований, то наибольшее количество частичных согласований, которое может быть выработано первыми Nусловными элементами, равно М. Ниже приведено правило operator — alert — for — emergency, откорректированное в целях использования условного элемента exists. (defrule operator-alert- for-emergency (exists (emergency)) — > (printout t "Emergency: Operator Alert" crlf) (assert (operator-alert))) Это правило вырабатывает только одну активизацию, и поэтому тревожное сообщение операторам будет выведено только один раз, как показывает следующий диалог CLIPS> (reset)J CLIPS> (assert (emergency (type fire)))J Emergency: Operator Alert CLIPS> Условный элемент exists реализуется с использованием сочетания условных элементов and и условных элементов not. Условные элементы, относящиеся к условному элементу exists, заключаются в один условный элемента затем в два условных элемента Таким образом, правило operator — alertfor-emergency можно преобразовать в следующее правило, заключив всю левую часть правила в условный элемента затем заменив условный элемент ех s 1 Б, как указано выше (defrule operator- alert-for-emergency (and (not (not (and (emergency))))) — Глава 8. Развитые средства сопоставления с шаблонами 670 (printout t "Emergency: Operator Alert" crlf) (assert (Условный элемент and, в который входит левая часть правила, содержит в качестве первого условного элемента условный элемент not, поэтому вначале добавляется условный элемент шаблона ( initial — fact ) . В результате добавления шаблона) и удаления ненужного условного элемента включающего в себя шаблон emergency, формируется следующее правило (defrule operator-alert-for-emergency (and (initial-fact) (not (not (emergency)))) => (printout t "Emergency: Operator Alert" crlf) (assert (operator-alert))) 8.17 Условный элемент f orall Условный элемент forall позволяет выполнять сопоставление с шаблонами с использованием множества условных элементов, проверка которых завершается успешно применительно к каждому вхождению другого условного элемента. Например, предположим, что промышленная установка расположена на нескольких производственных площадках (таких как отдельные здания, на которых может возникнуть пожар, и мы хотим определить, проведена ли эвакуация в каждом здании, охваченном пожаром, и отправлена ли в каждое здание команда пожарников, пытающихся погасить огонь. Для проверки этого можно воспользоваться условным элементом forall. С этой целью модифицирован факт как показано ниже, чтобы он содержал информацию не только о том, к какому типу относится чрезвычайная ситуация, но ив каком месте она возникла. Две другие конструкции de f template применяются для обозначения местонахождения пожар- Объяснением тому, что в приведенном выше диалоге для данного правила после выдачи команды agenda был указан индекс факта f — О, является наличие шаблона ( initial — fact ) вначале правила. Если фактов emergency в списке фактов нетто проверка самого внутреннего условного элемента not завершается успешно. А если проверка этого условного элемента завершается успешно, то проверка самого внешнего условного элемента not оканчивается неудачей, поэтому правило не активизируется. И наоборот, если в списке фактов есть факты emergency, то проверка самого внутреннего условного элемента not оканчивается неудачей. А поскольку проверка этого условного элемента оканчивается неудачей, проверка самого внешнего условного элемента not завершается успешно и правило активизируется. Условный элементных команд и для указания на то, эвакуированы ли люди из здания. Эти конструкции используются в правиле all — fires — being — handled для определения того, выполнены ли указанные условия (deftemplate emergency (slot type) (slot location)) (deftemplate fire squad (slot name) (slot location)) (deftemplate evacuated (slot building)) (defrule all-fires-being-handled (forall (emergency (type fire) (location ?where)) (fire-squad (location ?where)) (evacuated (building ?where))) (printout t "All buildings that are on fire " crlf "have been evacuated and" crlf "have firefighters on location" crlf)) CLIPS> (watch activations)J CLIPS> (reset)J > Activation О all-fires- being-handled: О, CLIPS> А после ввода в список фактов любого факта emergency данное правило переводится в неактивное состояние и остается в нем до тех пор, пока в список фактов не будут введены соответствующие факты fire — squad и evacuated: CLIPS> (assert (emergency (type fire) Для каждого факта, который согласуется с шаблоном (emergency (type fire) ( location ?where) ), должны присутствовать также факты, согласующиеся с шаблонами (fire — squad (location ?where) ) и (building ?where) ). После первоначальной загрузки в систему указанных конструкций deftemplate и конструкции defrule с последующей выдачей команды reset проверка условий этого правила должна быть завершена успешно, поскольку чрезвычайные ситуации, связанные с пожарами, отсутствуют, как показано ниже Глава 8. Развитые средства сопоставления с шаблонами building-11)))J all-fires-being-handled: О, < Activation ОАО О all-fires-being-handled: CLIPS> (assert (fire-squad (name ВО ООО, б CLIPS> all-fires-being-handled: f-О, Если будет удален факт fire — squad, касающийся здания building — 1, то правило переводится в неактивное состояние. А если будет удален факт emergency, относящийся к тому же зданию, это правило снова активизируется следующим образом (retract 4)J < Activation ООО location CLIPS> 8 18. Условный элемент logical 673 Условный элемент f orall имеет такой общий формат (forall согласующиеся со всеми шаблонами которое показывает, что пожарники должны использовать кислородные маски, если при пожаре выделяется ядовитый дым > f-1 ( > f — 2 ( (assert (use-oxygen-masks))) Как показывает следующий диалог, в приведенном выше правиле предусмотрена вставка факта use — oxygen — masks в список фактов каждый раз, когда возникает указанная критическая ситуация, связанная с пожаром CLIPS> (unwatch all)J CLIPS> (reset)J CLIPS> (watch facts)J CLIPS> (assert (emergency (type fire)) (noxious-fumes-present)))J emergency (type fire)) noxious-fumes-present) Глава 8. Развитые средства сопоставления с шаблонами 674 > f — 3 CLIPS> (use-oxygen-masks) CLIPS> (retract 1 2) 1 < f-1 (emergency (type fire)) < f — 2 (noxious-fumes-present) CLIPS> (facts)J О (initial-fact) f-3 (use-oxygen-masks) For а total of 2 facts. CLIPS> В языке CLIPS предусмотрен механизм поддержания истинности для создания зависимостей между фактами таким механизмом является условный элемент logical. Ниже приведено модифицированное правило noxious — fumes— present, позволяющее создать зависимость между фактами, которые сопоставляются с шаблонами в левой части правила, и фактами, введенными в список фактов в результате выполнения правой части правила. (defrule noxious-fumes-present (logical (emergency (type fire)) (noxious-fumes-present)) > (assert (use- oxygen-masks))) После выполнения правила noxious — fumes — present создается связь между фактами, сопоставляемыми с шаблонами, которые содержатся в условном элементе в левой части правила logical, и фактами, введенными в список фактов в результате выполнения правой части правила. Благодаря действию этого правила, если извлекается либо факт emergency, либо noxious — fumes — present, то извлекается также факт use — oxygen — masks, как показывает следующий диалог CLIPS> (unlatch all)J CLIPS> (reset)J CLIPS> (watch facts)J CLIPS> (assert (emergency (type fire)) (noxious-fumes- present)))J > f-1 (emergency (type fire)) А что должно произойти после того, как пожар будет потушен ив воздухе рассеется ядовитый дым Как показывает следующий диалог, извлечение факта emergency или noxious-fumes — present не влияет на факт use — oxygen— Л. Условный элемент logical 675 (noxious-fumes-present) > f-2 (retract 1)J < f-1 (emergency (type fire)) < — f — 3 (use-oxygen- masks) CLIPS> (defrule noxious-fumes-present (logical (noxious- fumes-present)) (emergency (type fire)) — > (assert (use-oxygen- masks))) Как показывает это модифицированное правило извлечение факта useoxygen-masks не будет происходить автоматически после извлечения факта Это означает, что факт use — oxygen-masks получает логическое обоснование от фактов emergency и noxious- fumes — present. Иначе эта мысль формулируется таким образом, что факты emergency и noxious — fumes-present предоставляют логическое обоснование факту use — oxygen — masks. Факт useoxygen — masks называется зависимым от фактов emergency и noxious— Факты noxious-fumes-present и emergency называются зависимостями для факта use — oxygen — masks. Условный элемент logical необязательно должен включать все шаблоны в левой части правила. Но если этот условный элемент используется, то должен включать первый условный элемент в левой части правила, а количество условных элементов logical в правиле не должно быть больше одного. Например, нельзя включить в условные элементы logical второй и четвертый условные элементы правила или даже включить в них первый и третий условные элементы правила, поскольку при этом область действия условного элемента logical разрывается. Такое ограничение по использованию условного элемента logical связано со спецификой реализации, лежащей в его основе. Кроме того, условный элемент logical позволяет сделать факты зависимыми от отсутствия других фактов с использованием условных элементов not. В условном элементе logical можно также проверять более сложные условия с помощью условных элементов exists и f orall или других сочетаний условных элементов. Но условный элемент logical действует во всех отношениях подобно условному элементу and, не считая того, что он создает зависимости между группами фактов. Для модификации правила noxious — fumes — present стем, чтобы сделать факт use — oxygen — masks зависимым только от факта noxious — fumes— present, потребовалось бы переупорядочить шаблоны, как показано ниже 676 Глава 8. Развитые средства сопоставления с шаблонами emergency (в этом состоит более безопасная организация работы по пожаротушению, поскольку ядовитый дым может все еще содержаться в воздухе, даже если огонь полностью погашен. При обычных обстоятельствах попытка ввести факт, который уже находится в списке фактов, не приводит к возникновению каких-либо изменений в списке фактов. С другой стороны, логически зависимый факт, происходящий из нескольких источников, не извлекается автоматически до тех пор, пока не будет удалено логическое обоснование со стороны всех источников этого факта. Например, предположим, что добавлено одно следующее правило для указания на то, что в случае применения газовых огнетушителей пожарники должны надевать кислородные маски (defrule gas-extinguishers-in-use (logical (gas-extinguishers-in-use)) (emergency (type fire)) — > (assert (use-oxygen-masks))) Теперь эксплуатация системы вызовет ввод в список фактов одного итого же факта под действием двух отдельных правили по разным причинам, как показано ниже. CLIPS> (unwatch а) 1 CLIPS> (reset)J CLIPS> (watch facts)J CLIPS> (watch rules)J CLIPS> (assert (emergency (type fire)) (noxious-fumes-present) (gas-extinguishers-in-use))J > f- 1 (emergency (type fire)) > f-2 (noxious-fumes-present) > f-3 (gas- extinguishers-in-use) noxious-fumes-present: f-l,f-2 CLIPS> Извлечение факта noxious — fumes — present не будет достаточным, чтобы вызвать автоматическое извлечение факта use — oxygen — поскольку остается еще одно логическое обоснование для использования кислородных масок. Прежде чем появится возможность извлечь факт use — oxygen — masks, необхо- 8.18. Условный элемент logical 677 димо также извлечь факт gas — extinguishers-in-use, как показывает следующий диалог (retract 2) < f-2 (noxious-fumes-present) CLIPS> (retract 3)J < f-3 (gas-extinguishers-in-use) < f-4 (use-oxygen-masks) CLIPS> Факт, введенный в список фактов из приглашения верхнего уровня или из правой части правила, не имеющего каких-либо условных элементов logical в своей левой части, называется безусловно обоснованным. Факт, который является безусловно обоснованным, нив коем случае не будет извлечен автоматически в результате извлечения другого факта. А после того как факт получает безусловное обоснование, все предусмотренные ранее логические обоснования того же факта отбрасываются. В языке CLIPS предусмотрены две команды, позволяющие просматривать зависимые факты (команда dependents) и зависимости (команда dependencies), связанные с фактами. Эти команды имеют следующий синтаксис выполненные до извлечения фактов noxious — fumes-present и gas-extinguishers — in — use, приводят к получению следующего вывода CLIPS> (facts)J f — О (initial-fact) f — 1 (emergency (type fire)) f-2 (noxious-fumes-present) f — 3 (gas — extinguishers — in— - use) f — 4 (use-oxygen-masks) For а total of 5 facts. CLIPS> (dependents 1)J None CLIPS> (dependents 2)J f-4 CLIPS> (dependents 3)J f-4 CLIPS> (dependents 4) ! None CLIPS> (dependencies Глава 8. Развитые средства сопоставления с шаблонами 678 None CLIPS> (dependencies 2) 1 None CLIPS> (dependencies 3)J None CLIPS> (dependencies 4) f — 2 f-3 CLIPS> 8.19 Резюме В настоящей главе приведено вводное описание понятия ограничений поля. Ограничения поля позволяют применять отрицания ограничений и формировать комбинации больше чем из одного ограничения для данного поля. Ограничение поля not используется для предотвращения согласования с определенными значениями. Ограничение поля and позволяет обеспечить, чтобы целый ряд условий согласования принимал истинное значение. Ограничение поля or служит для обеспечения того, чтобы было истинным по крайней мере одно из целого ряда условий согласования. Функции вводятся в цикле обработки команд верхнего уровня системы CLIPS либо используются в левых или правых частях правил. Многие функции могут иметь переменное количество параметров (в частности, к ним относятся некоторые арифметические функции. Входе выполнения вызовов функций могут осуществлять вызовы других функции такие вызовы называются вложенными. Команда bind позволяет связывать переменные в правой части правила. В языке предусмотрено несколько функций ввода-вывода. Функции open и close предназначены для открытия и закрытия файлов. Открытые файлы ассоциированы с логическим именем. Логические имена могут использоваться в большинстве функций, которые осуществляют вводи вывод с использованием больше чем одного типа физических устройств. В частности, логические имена применяются в функциях printout и Функция printout обеспечивает вывод на терминал ив файлы. Функция read позволяет выполнять ввод с клавиатуры и из файлов. Функции format и readline также принимают в качестве параметров логические имена. Функция format обеспечивает больший контроль над тем, какое внешнее представление приобретают выводимые данные. Функция readline может использоваться для чтения целой строки данных. Функция expl ode P преобразовывает строку в многозначное значение. В программе на языке CLIPS могут использоваться различные методы управления потоком выполнения. В настоящей главе демонстрируется, как может быть Задачи Задачи 8.1. Предположим, что даны следующие конструкции de f template для фактов, представляющих генеалогическое дерево (deftemplate father-of (slot father) (slot child)) (deftemplate mother-of (slot mother) (slot child)) (deftemplate male (slot person)) (deftemplate female (slot person)) (deftemplate wife-of (slot wife) (slot husband)) (deftemplate husband-of (slot husband) (slot wife)) Напишите правила, позволяющие вывести перечисленные ниже отношения. Составьте конструкции de f template, применяемые для выполнения этого задания. создан простой цикл управления (в котором из списка фактов извлекаются, а затем снова вставляются управляющие факты) для ввода данных с использованием функции read. Для обеспечения более мощных возможностей сопоставления с шаблонами в левой части правила наряду с предикативными функциями могут использоваться условные элементы Кроме того, условные элементы test могут служить для поддержания функционирования цикла управления. Предикативные ограничения поля позволяют предусматривать предикативные проверки непосредственно в шаблоне. Ограничения поля со знаком равенства используются для сравнения значения поля со значением, возвращаемым функцией. Некоторые из этих методов управления демонстрируются в программе Sticks. Кроме условного элемента test, в программе на языке CLIPS могут применяться еще несколько типов условных элементов. Условный элемент or используется для представления нескольких правил как единственного правила. Условный элемент not позволяет выполнять сопоставление с шаблонами исходя из отсутствия некоторого факта в списке фактов. Условный элемент and используется для группирования условных элементов и вместе с условными элементами or и not позволяет создавать выражения с произвольной вложенностью, представляющие сложные условия, которые необходимы для активизации правила. Для определения того, существует ли по крайней мере одна группа фактов, которая согласуется с условным элементом или с комбинацией условных элементов, используется условный элемент exists. Условный элемент forall позволяет определить, соответствует ли множество условных элементов каждому вхождению другого условного элемента. Условный элемент logical позволяет создать механизм поддержания истинности. В программе можно добиться того, чтобы присутствие в списке фактов некоторых фактов зависело от присутствия или отсутствия других фактов Глава 8. Развитые средства сопоставления с шаблонами 680 а (дядя, aunt (тетя б) cousin (двоюродный брат или двоюродная сестра в) grandparent (дедушка или бабушка г (дедушка, grandmother (бабушка д) sister (сестра брате (предок. 8.2. На промышленной установке имеются десять датчиков с идентификационными номерами 1 — 10. Каждый датчик показывает состояние контролируемого узла — "исправный" или "неисправный". Составьте конструкцию de f template для представления состояния датчиков и напишите одно или несколько правил, которые выводят предупреждающее сообщение, если три или больше датчиков показывают неисправное состояние. Проверьте подготовленные вами правила сдатчиками и показывающими неисправное состояние сдатчиками и показывающими неисправное состояние и сдатчиками и, показывающими неисправное состояние. Что необходимо сделать, чтобы предотвратить многократное отображение предупреждающего сообщения 8.3. Разработайте программу на основе правил IF-THEN, составленных входе решения задачи 3.5, представленной на стр. 289. Программа должна задавать вопросы о том, какой метод оплаты предпочитает путешественники какое путешествие его интересует, после чего предлагать возможные поездки с учетом ответов на эти два вопроса. 8.4. Предположим, что дано несколько совокупностей фактов, описывающих геометрические фигуры, в которых используются следующие конструкции deftemplate: Напишите одно или несколько правил, которые вычисляют указанные ниже суммы. а) Сумма площадей фигур. б) Сумма периметров фигур. Проверьте вывод этих правил с помощью следующих конструкций deffacts: (deftemplate (slot id) (deftemplate (slot id) (deftemplate (slot id) square (slot side-length)) rectangle (slot width) (slot height)) circle (slot radius)) Задачи 681 (deffacts test-8-8 (square (id А) (side-length 3)) (square (id В) (side-length 5)) (rectangle (id С) (width 5) (height 7)) (circle (id D) (radius 2)) (circle (id E) (radius б) 8.5. Предположим, что дана информация об имени, цвете глаз и волоса также о гражданстве лица, принадлежащего к некоторой группе, с использованием следующей конструкции бей1етр1а1е: (deftemplate person (slot name) (slot еуе-color) (slot hair-color) (slot nationality)) Напишите одно правило, которое позволяет выявить описанных ниже лица) Любого человека с синими или зелеными глазами, который имеет каштановые волосы и прибыл из Франции. б) Любого человека, кто не имеет синих глаз или темных волоса также не имеет волос и глаз одинаково светлого или одинаково темного цвета. в) Двух человек, первый из которых имеет карие или синие глаза, не имеет светлые волосы и является гражданином Германии второй имеет зеленые глаза, тот же цвет волос, что и первый человека также может быть гражданином любого государства. Глаза второго человека могут быть карими, если волосы первого человека — каштановые. Преобразуйте приведенные ниже инфиксные выражения в префиксные выражения. а) (3+ 4) * (5+ б) + 7. б) (5 * (5 + б + 7)) — ((3 * + 2) / 8). в) б — 9 * 8 / 3 + 4 — (8 — 2 — 3) * б / 7. Рассмотрите следующую информацию о бейсбольной команде. Энди не любит кетчера. Сестра Эда замужем за вторым бейсменом. Центральный фильдер имеет более высокий рост, чем правый фильдер. Гарри и третий бейсмен живут водном доме. И Пол, и Аллен выиграли по 20 долларов у питчера в пинокль. Эд и игроки нападающей команды в свободное время играют в покер. Жена питчера — сестра третьего бейсмена. Вся батарея (питчер и кетчер) и защищающаяся команда, кроме Аллена, Гарри и Энди, имеют рост меньше, чему Сэма. И Пол, и Энди, и шорт-стоп проиграли по 50 долларов на скачках. Пол, Гарри, Билли кетчер потерпели поражение в бейсбольном матче от второго бейсмена. Сэм проходит процедуру развода 682 Глава 8. Развитые средства сопоставления с шаблонами И кетчер, и третий бейсмен имеют по два ребенка. Эд, Пол, Джерри, правый фильдер и центральный фильдер — холостяки; остальные члены команды женаты. И шорт-стоп, и третий бейсмен, и Билл заработали по 100 долларов, держа пари на один боксерский поединок. Одного из игроков нападающей команды зовут или Майк, или Энди. Джерри имеет более высокий рост, чем Билл. Майк ниже ростом, чем Билл. Каждый из них весит больше, чем третий бейсмен. Сэм, кетчер и третий бейсмен — левши. Эд, Сэм и шорт- стоп вместе ходили в среднюю школу. Напишите программу CLIPS, чтобы определить имена всех членов команды. 8.8. Преобразуйте дерево решений, показанное на рис. 3.3 (см. стр. 197), вряд правил. Создайте шаблоны для согласования с фактами с использованием следующей конструкции de f template: (deftemplate question (slot query-string) (slot answer)) Например, если ответом на вопрос, представленный корневым узлом в дереве, является слово "по, то факт, представляющий эту информацию, должен иметь такой вид (question (query-string "Is it very big?") (answer по) Используйте в правой части правил функции printout и read, чтобы задавать вопросы, показанные на рис. 3.3, и вводите в базу знаний факты question с ответами пользователя. 8.9. Напишите программу CLIPS, которая складывает два двоичных числа без использования каких-либо арифметических функций. Используйте для представления двоичных чисел следующую конструкцию de Й1евр1а1е: (deftemplate binary-№ (multislot name) (multislot digits)) После ввода фактов, указывающих, какие два двоичных числа необходимо сложить, программа должна создать новое именованное двоичное число, содержащее сумму. Например, после ввода следующих фактов (binary-№ (name A) (digits 1 0 1 1 1)) (binary-№ (name ВО) (асЫ-binary-¹s (name-1 А В) к списку фактов будет добавлен такой факт (binary — № (name ( А + В }) (digits 1 0 0 1 0 1)) Задачи 683 8.10. 8.11. 8.12. 8.13. Напишите программу которая запрашивает группу крови пациента, нуждающегося в переливании крови, и группу крови донора. Затем программа на основании данных о группах крови должна определить, должно ли быть сделано переливание крови отданного донора. Кровь группы О может быть перелита только пациенту с группой крови О. Кровь группы А может быть перелита пациенту с группой крови А или пациенту с группой крови О. Кровь группы В может быть перелита пациенту с группой крови Вили с группой крови О. Кровь группы АВ может быть перелита пациенту с группой крови АВ, группой крови А, группой крови Вили группой крови О. Напишите программу CLIPS, которая предоставляет информацию либо о способах приготовления указанных мясных полуфабрикатов из говядины, либо о мясных полуфабрикатах из говядины, которые могут быть приготовлены с применением указанного способа. Программа должна вначале задать вопрос о том, какая информация должна быть получена, — о мясных полуфабрикатах или способах приготовления, а затем должна предложить сделать соответствующий выбор. Для определения соответствующих мясных полуфабрикатов или способов приготовления используйте следующие рекомендации кострец на ростбиф следует тушить или запекать "английский" филей следует жарить в жире, жарить на открытой сковороде почти без жира или жарить на сковороде с малым количеством жира; бифштекс на ребрышке следует жарить в жире, жарить на открытой сковороде почти без жира или жарить на сковороде с малым количеством жира кусок края следует запекать говяжий фарш следует запекать, жарить в жире, жарить на открытой сковороде почти без жира, жарить на сковороде с малым количеством жира или тушить кусок пашины для стейка следует тушить вырезку следует тушить. Модифицируйте программу, разработанную в результате решения задачи 7.14 (см. с. таким образом, чтобы для определения входных данных пользователю предъявлялся ряд вопросов о необходимых характеристиках кустарника. Выходные данные программы должны оставаться прежними. Для классификации микроорганизмов применяется несколько их характеристик включая их основную форму (сферическая, палочковидная, спиралевидная или нитевидная, результаты лабораторного исследования окрашивания по Граму (положительные, отрицательные или отсутствующие, а также потребность в кислороде для выживания (аэробный или анаэробный микроорганизм. Напишите программу, которая идентифицирует тип микроорганизма на основе информации, представленной в табл. 8.4. Пользователь должен указывать по запросу программы форму, окрашивание по Граму и потребность микроорганизма в кислороде. Пользователь должен иметь Глава 8. Развитые средства сопоставления с шаблонами возможность указывать, что любые из входных данных являются неизвестными. Результаты работы программы должны представлять собой список всех возможных разновидностей микроорганизмов, составленный на основе информации, полученной от пользователя. Таблица 8.4. Признаки микроорганизмов Тип Форма Окрашивание Потребность по Граму в кислороде Актиномицеты Положительное Аэробный Палочковидная или нитевидная Сферическая Коккоиды Положительное Коринемикроорганизмы Формирующие эндоспоры Палочковидная Положительное Палочковидная Положительное Кишечные Жгутиковые Микомикроорганизмы Мико плазма Псевдомонады Риккетсии палочковидная Нитевидная Спиралевидная Спиралевидная Палочковидная. Компания Acme Electronics изготавливает устройства, известные под названием Thingamabob 2000. Эти устройства выпускаются в пяти различных модификациях, которые отличаются по конструкции шасси. В каждом шасси предусмотрен ряд отсеков для установки дополнительных приспособлений и имеется блок питания, способный вырабатывать определенное количество единиц мощности. Общие сведения о характеристиках шасси приведены в табл. Стрептококки Спириллы Спирохеты Вибрионы Палочковидная Палочковидная Сферическая Сферическая Палочковидная Сферическая или отрицательное Отрицательное Отрицательное Отсутствует Отсутствует Отрицательное Отрицательное Отрицательное Отрицательное Отрицательное Отрицательное Аэробный и анаэробный Аэробный Аэробный и анаэробный Аэробный Аэробный Аэробный Аэробный Аэробный Аэробный Аэробный Аэробный Анаэробный Аэробный Задачи 685 Таблица 8.5. Общие сведения о характеристиках шасси Шасси Количество Вырабатываемая Цена мощность (в долларах) отсеков, предусмотренных для приспособлений С100 С СЗОО С С 2000,00 2500,00 3000,00 3000,00 3500,00 Для работы каждого приспособления, которое может быть установлено в блоке, требуется определенное количество единиц мощности. Общие сведения о характеристиках приспособлений приведены в табл. 8.6. Таблица 8.6. Общие сведения о характеристиках приспособлений Приспособление Потребляемая мощность Цена (в долларах) 100,00 800,00 300,00 200,00 150,00 50,00 400,00 Zaptron Yatmizer Phenerator Malcifier Zeta-shield Warno synchronizer Dyno separator Напишите программу, которая принимает в качестве входных данных ряд фактов, представляющих результаты выбора пользователем шасси и всех необходимых приспособлений, а затем вырабатывает факты, представляющие количество используемых приспособлений, общее количество единиц мощности, необходимых для работы приспособлений, а также общую стоимость шасси и всех выбранных приспособлений. Используя табл. 7.2 сданными о драгоценных камнях, представленную в задаче 7.13 (см. с. 620), напишите правила идентификации следующих драгоценных камней алмаз, корунд, хризоберилл, шпинель, кварц и турмалин. Включите правила, позволяющие запрашивать у пользователя данные о твердости, плотности и цвете драгоценного камня. Если пользователь неправильно укажет цвет, то вопрос должен повторяться до тех пор, пока не будет указан один из цветов, перечисленных в таблице Глава 8. Развитые средства сопоставления с шаблонами. Введите в программу Sticks дополнительные правила, с помощью которых пользователю после окончания игры будет передаваться вопрос, желает ли он сыграть еще раз. Модифицируйте программу Sticks так, чтобы она позволяла не только человеку играть против компьютера, но и вести игру друг против друга двум игрокам-людям. 8.18. Представьте следующие правила в виде единственного правила с использованием условных элементов and и or: (defrule rule-1 (fact à) (fact — d) =>) (defrule rule-2 (fact-b) (с) (fact-e) (fact-f) =>) (defrule rule-3 ас. Напишите с использованием условных элементов and и or программу для дерева AND — показывающего, как добраться до места работы с помощью различных способов, которое приведено на рис. 3.10 (см. с. Проверьте работу этой программы на всех ребрах графа. Определите, правильно ли оформлена ссылка на переменную х в каждом из следующих правил. Объясните ваши ответы. ах х 4)) Задачи 687 б) (defrule example-2 (not (fact х х 4))) =>) в example-3 (not (fact ?x)) (fact ?уй:(> ух) г) (defrule example-4 (not (fact х) (fact х х 4))) =>) 8.21. Перепишите программу для "мира блоков, приведенную в разделе таким образом, чтобы она могла переупорядочивать блоки, переходя из любого начального состояния блоков, сложенных в столбики, в любое целевое состояние сложенных блоков. Например, если начальное состояние блоков таково (stack А ВСЕ) то одним из возможных целевых состояний может стать следующее (stack D СВАЕ) Напишите программу CLIPS, которая запрашивает у пользователя значения цветов, а затем выводит список всех государств, флаги которых содержат все указанные цвета. Цвета флагов различных стран перечислены в табл. 8.7. Предположим, что дана следующая конструкция de f template с описанием множества (deftemplate set (multislot name) (multislot members)) Напишите одно или несколько правил, которые обеспечивают выполнение перечисленных ниже заданий. а) Вычисление объединения двух указанных множеств после получения факта, в котором используется следующая конструкция de f template: (deftemplate union (multislot set-1-name) (multislot Глава 8. Развитые средства сопоставления с шаблонами 688 б) Вычисление пересечения двух указанных множеств после получения факта, в котором используется следующая конструкция de f template: (deftemplate intersection (multislot set-1 — name) (multislot set-2-name)) Таблица 8.7. Цвета флагов различных стран Цвета флага Государство Красный, белый и синий Черный, желтый и красный Белый и красный Белый и красный Желтый и синий Соединенные Штаты Америки Бельгия Польша Монако Швеция Панама Красный, белый и синий Черный, желтый и зеленый Желтый, синий и красный Зеленый, белый и красный Зеленый, белый и оранжевый Синий и белый Ямайка Колумбия Италия Ирландия Греция Ботсвана Синий, белый и черный No М is Р Some М is not S .. Some S is Р В качестве входных данных для правил должен служить единственный факт, представляющий большую посылку, меньшую посылку и заключение. Выходом программы должна быть выведенная на внешнее устройство информация о модусе и фигуре. Следует отметить, что после выполнения операций объединения и пересечения не допускается наличие дублирующих элементов в объединении или пересечении множеств. Конечным результатом в заданиях аи б) должен быть новый факт set, содержащий объединение или пересечение двух указанных множеств после выполнения операции необходимо удалять и факт union, и факт intersection. 8.24. Напишите ряд правил для классификации силлогистических форм по модусам и фигурам. Например, следующая силлогистическая форма имеет типа Задачи 689 8.25. 8.26. 8.27. 8.28. Напишите программу, которая будет считывать файл данных, содержащий список имен людей с указанием возрастов, и создавать новый файл, в котором содержится тот же список, отсортированный в порядке увеличения возрастов. Программа должна запрашивать имена обоих файлов, и входного, и выходного. Например, после обработки такого входного файла Linda A. Martin 43 Phyllis Sebesta 40 Robert Delwood 38 Jack Kennedy 39 Glen Steele должен быть создан следующий выходной файл Glen Steele 37 Robert Delwood 38 Jack Kennedy 39 Phyllis Sebesta 40 Linda А 43 Напишите программу для вычисления стоимости карт, находящихся на руках игрока в бридж, с помощью метода подсчета очков. Тузы стоят четыре очка короли — три очка; дамы — два очка а валеты — одно очко. Пустая масть (отсутствие карт одной масти) стоит три очка масть с одной картой (одна карта определенной масти) — два очка а масть с двумя картами (две карты определенной масти) — одно очко. Напишите программу, которая указывает, какие действия должны быть предприняты по спасению человека, проглотившего яд. В программе должны присутствовать знания о следующих ядах кислоты (такие как жидкость для удаления ржавчины и йодистый усилитель, щелочи (такие как аммиачная вода и отбеливатель) и горючие вещества (такие как бензин и скипидар. Все остальные яды должны быть зачислены в категорию "прочие. В случае отравления необходимо вызвать врача или бригаду скорой помощи, специализирующихся по ядам. При отравлении кислотами, щелочами и ядами прочих типов (но отличными от горючих веществ) необходимо снижать концентрацию яда, вынуждая пострадавшего пить жидкость, такую как воду или молоко. При попадании в желудок ядов прочих типов следует вызвать рвоту. Нов случае отравления кислотами, щелочами или горючими веществами вызывать рвоту не следует. Нельзя давать жидкость или вызывать рвоту, если пострадавший находится без сознания или у него конвульсии. Напишите программу, которая после получения значений координат двух точек на плоскости определяет наклон прямой, проходящей через эти две точки. Программа должна выполнять проверку для определения того, что Глава 8. Развитые средства сопоставления с шаблонами координаты точек заданы числами и что одна и та же точка не указана дважды. Линии, направленные перпендикулярно горизонтальной оси, следует рассматривать как имеющие бесконечный наклон. 8.29. Косоугольным называется треугольник, который имеет три неравных сто- роны. Равнобедренный треугольник имеет две стороны одинаковой длины. Равносторонний треугольник имеет три стороны одинаковой длины. Напишите программу, которая после получения координат трех точек на плоскости, образующих вершины треугольника, определяет тип треугольника. В программе необходимо учитывать возможную ошибку округления (примите предположение, что две стороны равны, если разница между значениями их длины не превышает. Проверьте разработанную вами программу по приведенным ниже данным о треугольниках. а) Точки (О, (и (6,0) б) Точки (1, 2), (4, 5) ив) Точки (0,0), (3,5.196152) и. 8.30. Напишите программу для поиска решения задачи с ханойскими башнями, в которой необходимо переместить ряд колец, имеющих разный наружный диаметр и одинаковый внутренний диаметр, с одного колышка на другой колышек, ни разу не насаживая на колышек кольцо с большим наружным диаметром поверх кольца с меньшим наружным диаметром. Для насаживания колец используются три колышка. Входными данными для программы должно быть количество колец. В начальной конфигурации все кольца находятся на первом колышке, будучи расположенными в порядке уменьшения наружного диаметра от нижнего кольца к верхнему. Конечная цель состоит в перемещении всех колец с первого колышка на третий колышек. 8.31. Напишите программу, позволяющую определить цифровые значения букв, после подстановки которых следующая криптоарифметическая задача решается правильно. Каждой из букв НОС, РЕ и Т соответствует уникальная цифра от 0 до 9. HOCUS + POCUS PRESTO 8.32. Напишите программу, которая выдает рекомендации по инвестированию во взаимные фонды. В выводе программы должно быть указано, какие процентные доли денежных средств должны инвестироваться в фонды с фиксированным доходом (фонды, предназначенные главным образом для вложения капитала в облигации и привилегированные акции) или в акционерные фонды (характеризующиеся более высоким риском, но предоставляющие больший потенциальный доход. Процентные доли следует определять, Задачи 691 "оценивая, какой риск готов взять на себя инвестор, на основе полученных ответов на различные вопросы. Если инвестору 29 лет или меньше, к оценке следует добавить 4; 30 — 39 — добавить 3; 40 — 49 — добавить 2; 50 — 59— добавить 60 или больше — добавить О. Если инвестору осталось до пенсии от О до 9 лет — добавить О 10 — 14 — добавить 1; 15 — 19 — добавить 2; 20 — 24 — добавить 3; 25 или больше добавить 4. Если инвестор готов потерпеть убытки только в размере Ъ или меньше — добавить к оценке О 6 — 10 добавить 1; 11 — 15 — добавить 2; 16 или больше добавить 3. Если инвестор очень хорошо разбирается в инвестициях ив работе фондовой биржи, добавить к оценке если довольно хорошо осведомлен в этих вопросах, добавить к оценке 2; если не очень хорошо осведомлен, добавить к оценке О. Если инвестор согласен взять на себя существенный риск ради более высокой возможной прибыли, добавить к оценке 4; если готов пойти на определенный риск, добавить 2; а если для него приемлем лишь небольшой риск, добавить О. Если инвестор полагает, что цели по достижению определенного благосостояния, которые он поставил перед собой в связи с уходом на пенсию, будут достигнуты, учитывая его текущие доходы и активы, добавить к оценке 4; если эти цели скорее всего будут достигнуты, добавить 2; если эти цели вряд ли будут достигнуты, добавить О. Если окончательная оценка больше пунктов, то Ъ инвестиций должно быть сделано в акционерные фонды если 16 — 20 пунктов, то Ъ должно быть сделано в акционерные фонды ив фонды с фиксированным доходом если 11 — 15 пунктов, то Ы должно быть сделано в акционерные фонды и Ъ в фонды с фиксированным доходом если 6 — 10 пунктов, то Ъ должно быть сделано в акционерные фонды и Ъ в фонды с фиксированным доходом если от О до 5 пунктов, то 20'Ъ должно быть сделано в акционерные фонды и Ъ в фонды с фиксированным доходом. 8.33. Модифицируйте программу, разработанную в результате решения задачи 7.12 (см. с. таким образом, чтобы информация о звездах была представлена с использованием фактов. Вывод программы должен осуществлять в том же порядке все звезды, имеющие указанный спектральный класс, все звезды, имеющие указанную величину, наконец, все звезды, соответствующие и спектральному классу, и величине, наряду сих расстоянием от Земли в световых годах Глава Модульное проектирование, управление выполнением и эффективность правил 9.1 Введение В настоящей главе приведено вводное описание целого ряда средств языка позволяющих упростить разработку и сопровождение экспертных систем. Атрибуты def template обеспечивают принудительное соблюдение ограничений назначения применительно к значениям слотов конструкции de f template. Вовремя загрузки правила атрибуты ограничения конструкции def template позволяют обнаруживать семантические ошибки, которые исключают возможность сопоставления с левой частью правила. Кроме того, как показано в этой главе, на основе понятия значимости, которое лежит в основе метода определения приоритета правила также фактов, представляющих знания о путях передачи управления, могут быть созданы эффективные методы управления исполнением программ CLIPS. Наряду с этим в данной главе рассматривается конструкция defmodule, позволяющая секционировать базу знаний и предоставляющая более явный метод управления исполнением программы. Дополнительно к этому в настоящей главе представлено много способов повышения эффективности экспертной системы, основанной на правилах, в которой используется алгоритм сопоставления с шаблонами. Причем вначале дано описание причин, по которым требуется эффективный алгоритм сопоставления с шаблонами, и только после этого дается описание алгоритма. Наконец, обсуждается несколько способов более эффективной формулировки правил. Глава 9. Модульное проектирование, управление выполнением. 694 9.2 Атрибуты de f template В языке предусмотрен целый ряд атрибутов слота, которые могут быть заданы при определении слотов конструкции Применение этих атрибутов позволяет упростить разработку и сопровождение экспертной системы и обеспечивает строгий контроль типов и проверку ограничений. К тому же обеспечивается возможность определить допустимые типы и значения, которые могут храниться в слоте, а для числовых значений может быть указан допустимый диапазон. Конструкции multis lot позволяют указывать минимальное и максимальное количество полей, которые они могут содержать. Наконец, атрибут бе fault предоставляет возможность определять заданное по умолчанию значение слота, которое будет использоваться, если значение соответствующего слота не задано в команде assert. Атрибут type (deftemplate person (multislot name (type SYMBOL)) (slot age (type INTEGER))) После определения этой конструкции de f template система автоматически предписывает применение заданных ограничений к любым атрибутам слотов. Например, как показано ниже, присваивание слоту age символа four, а нецелого числа 4 приводит к возникновению ошибки. Атрибут type определяет типы данных, которые могут храниться в слоте. Атрибут type имеет общий формат (type NUMBER, INSTANCE-NAME, INSTANCE-ADDRESS, INSTANCE, FACT — ADDRESS или ЕХТЕКНА? -ADDRESS. Если используется переменная ?VARIABLE, то слот может содержать данные любого типа (по умолчанию для всех слотов предусмотрен именно такой способ их применения. Если же используется одна или несколько символических спецификаций типа, применение слота ограничивается одним из указанных типов. Использование спецификации типа эквивалентно заданию спецификаций SYMBOL и Использование спецификации типа NUMBER эквивалентно заданию спецификаций INTEGER и FLOAT, а применение спецификации типа INSTANCE эквивалентно заданию спецификаций INSTANCE — NAME и INSTANCE — Ниже приведена конструкция de f template с именем которая ограничивает значения, хранимые в слоте символами, и значения, хранимые в слоте age, целыми числами. Атрибуты de f template 695 CLIPS> (assert (person (name Fred Smith) (age four)))J [СЯТВИСНК1] А literal slot value found in the assert command does not match the allowed types for slot age. CLIPS> В системе CLIPS осуществляется также проверка совместимости связывания переменных в левой и правой частях правила. Например, предположим, что в некотором правиле обновляется слот age сданными о возрасте некоторого лица после каждого дня его рождения. Конструкция de f template для управляющего факта, который показывает, что у рассматриваемого человека только что был день рождения, является следующей (deftemplate а (slot пате (type STRING))) Но допустимые типы для слотов пате в этих двух конструкция de f template являются несовместимыми. Как показывает следующий диалог, попытка непосредственно сравнить значения двух указанных слотов приводит к возникновению ошибки CLIPS> (defrule update-birthday ?f1 а (name ?name)) ?f2 <- (person (name ?name) (age ? age)) mP (retract ?f1) (modify ?f2 (age (+ ?age 1)))) [RULECSTR1] Variable ?name in CE ¹2 slot пате has constraint conflicts which make the pattern unmatchable. ERROR: (defrule MAIN::update-birthday ?fl <- (а (name ?name)) ?f2 <- (person (name ?name) (age ?age)) => (retract ?f1) (modify ?f2 (age (+ ?age 1)))) CLIPS> Слот пате для факта had — а — birthday должен представлять собой строку, а слот пате для факта person должен быть символом. Переменная ?name не может соответствовать обоим этим ограничениями поэтому проверка условия в левой части данного правила никогда не может завершиться успешно Глава 9. Модульное проектирование, управление выполнением. Статическая и динамическая проверка ограничений В языке CLIPS предусмотрены два уровня проверки ограничений. Первый уровень, статическая проверка ограничений, применяется по умолчанию при выполнении в системе CLIPS синтаксического анализа выражения или конструкции. Использование этого уровня можно проиллюстрировать с помощью приведенных выше примеров нарушения ограничений атрибута type. Статическую проверку ограничений можно отменить, вызвав функцию set-static- constraint-checking и передав ей в качестве параметра символ. И наоборот, в случае вызова этой функции с символом TRUE статическая проверка ограничений активизируется. Функция возвращает значение, соответствующее применявшемуся перед ее выполнением режиму статической проверки ограничений (символ FALSE, если такая проверка была перед этим запрещена, и символ TRUE — в противном случае. Текущее состояние статической проверки ограничений можно определить, вызвав функцию которая возвращает символ TRUE, если статическая проверка ограничений разрешена, и символ FALSE — в противном случае. На этапе синтаксического анализа не всегда возможно определить все ошибки, связанные с ограничениями. Например, ниже приведено правило create— person, в котором переменные age и ? name могут быть связаны с недопустимыми значениями. (defrule create-person => (printout t "What is your name? ") (bind ?name (explode9 (readline))) (printout t "What is your age? ") (bind ?age (read)) (assert (person (name ?name) (age ? age)))) Для ввода полного имени лица в виде строки используется функция read- line, после чего функция преобразует содержимое строки в многозначное значение, которое может быть помещено в слот пате. Затем для ввода данных о возрасте рассматриваемого лица применяется функция read, которая записывает полученное значение в слот age. Ноне исключена возможность, что в качестве обоих входных значений будут введены недопустимые данные. Например, как показывает следующий диалог, в качестве данных о возрасте лица может введен символ Йоыг: CLIPS> (reset)J CLIPS> (run)J What is your name? Fred SmithJ What is your age? fourJ 9.2. Атрибуты de f template 697 CLIPS> (facts)J f — 0 (initial-fact) f — 1 (person (name Fred Smith) (age four)) For а total of 2 facts. CLIPS> Здесь заслуживает внимания то, что такой же факт person, касающийся лица по имени Fred Smith, который перед этим вызвал нарушение ограничения и не был добавлен к списку фактов, теперь был добавлен успешно. Это связано стем, что второй уровень проверки ограничений, предусмотренный в системе CLIPS, уровень динамической проверки ограничений, запрещен по умолчанию. Динамическая проверка ограничений применяется к фактам в то время, как действительно происходит их ввод в список фактов, что позволяет перехватывать ошибки, которые не могут быть обнаружены вовремя синтаксического анализа. Динамическая проверка ограничений может быть разрешена или запрещена с помощью функции set-dynamic-constraint-checking, а текущее состояние динамической проверки ограничений можно определить с помощью функции Ниже приведен диалог, который показывает, какие действия предпринимаются в случае нарушения ограничения, если разрешена динамическая проверка ограничений. Факт person сданными о человеке по имени Fred Smith все равно вводится в список фактов, но обнаруживается нарушение ограничения и выполнение правил прекращается. CLIPS> (set-dynamic- constraint-checking TRUE)J FALSE CLIPS> (reset)J CLIPS> (run)J What is your name? Fred SmithJ What is your age? fourJ [CSTRNCHK1] Slot value (Fred Smith) found in fact f-1 does not match the allowed types for slot age. [PRCCODE4] Execution halted during the actions of defrule create-person. CLIPS> (facts)J f — 0 (initial-fact) f — 1 (person (name Fred Smith) (age four)) For а total of 2 facts. CLIPS> 698 Глава 9. Модульное проектирование, управление выполнением. Атрибуты допустимого значения Язык позволяет не только регламентировать перечень допустимых типов с помощью атрибута уре, но и дает возможность задавать список допустимых значений для конкретного типа. Например, если в конструкцию de f template с именем person дополнительно вводится слот gender (пол, может быть реализована возможность ограничить перечень допустимых символов для этого слота значениями male и female, как показано ниже. (deftemplate person (multislot пате (type SYMBOL)) (slot age (type INTEGER)) (slot gender (type SYMBOL) (allowed-symbols male female))) В языке CLIPS предусмотрено восемь различных атрибутов допустимого значения allowed- symbols, allowed-strings, allowed-lexemes, allowed-integers, allowed-floats, allowed-numbers, allowed-instance-names и allowed- values. За каждым из этих атрибутов должно следовать либо обозначение переменной ? VARIABLE (которое указывает на то, что любые значения заданного типа являются допустимыми), либо список значений этого типа, следующего за префиксом allowed-. Например, за атрибутом allowed — lexemes должно следовать либо обозначение ?VARIABLE, либо список символов и (или) строк. По умолчанию атрибут допустимого значения для слотов имеет вид (allowed — values ? VARIABLE) . Следует отметить, что атрибуты допустимого значения не ограничивают состав допустимых типов слота. Например, конструкция (allowed — symbols male female) не налагает такого ограничения, чтобы типом слота gender был символ. Эта конструкция указывает, что если значением слота является символ, то им должен быть один из двух символов — либо male, либо female. Если бы атрибут ЯУМВО? ) был удален, то допустимым значением для слота gender были бы любая строка, целое число или число с плавающей точкой. Атрибут allowed — values можно использовать, чтобы полностью ограничить множество допустимых значений для слота заданным списком. Например, после того как конструкция de f template с именем person будет заменена следующей, в результате произойдет то, что пределы допустимых типов для слота gender ограничатся символами person (multislot name (type SYMBOL)) (slot age (type INTEGER)) (slot gender (allowed-values male female))) 9.2. Атрибуты de f template 699 Атрибут галде Атрибут range позволяет задавать минимальные и максимальные допустимые числовые значения. Атрибут range имеет общий формат ( range <1owerlimit> VARIABLE, либо числовое значение. Терм 1owerlimit> |