Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Определение 6.19. Синтаксис условного элемента and
<ycлoвный-элeмeнт-and>::= (and <условный-элемент>+) Пример 6.27. Применение условного элемента and
(defrule system-flow (error-status confirmed) (or (and (temp high) (valve closed)) (and (temp low) (valve open))) => (printout t "The system is having a flow problem. " crlf)) Если условный элемент and содержит условные элементы test или not в качестве первого элемента, то перед ними автоматически добавляется образец initial-fact или initial-object. Помните, что левая часть любого правила содержит неявный элемент and, поэтому приведенное в примере 6.28 правило будет автоматически преобразовано (см. пример 6.29). Пример 6.28. Правило nothing-to-schedule
(defrule nothing-to-schedule (not (schedule?)) => (printout t "Nothing to schedule." crlf)) Пример 6.29. Преобразованное правило nothing- to- schedule
(defrule nothing-to-schedule (and (initial-fact) (not (schedule?))) => (printout t "Nothing to schedule." crlf)) 6.5.5. Условный элемент not Иногда важнее отсутствие информации, а не ее присутствие, т. е. возникают ситуации, когда необходимо запустить правило, если образец или другой условный элемент не удовлетворяется (например, факт не существует). Условный элемент not предоставляет эту возможность. Элемент not удовлетворяется, только если условный элемент, который он содержит, не удовлетворяется. Определение 6.20. Синтаксис условного элемента not <условный-элемент-not>::= (not <условный-элемент>) Условный элемент not может отрицать только одно выражение. Несколько условных элементов нужно отрицать с помощью нескольких элементов not. Тщательно следите за комбинациями not с or или and; результат не всегда очевиден! Пример 6.30. Применение условного элемента not
(defrule high-flow-rate (temp high) (valve open) (not (error-status confirmed)) => (printout t "Recommend closing of valve due to high temp" crlf)) В логическом элементе not можно использовать связанные переменные, так же как и в других условных элементах: Пример 6.31. Правило check-value
(defrule check-valve (check-status?valve) (not (valve-broken?valve)) => (printout t "Device "?valve " is OK" crlf)) С помощью условного элемента not можно, наконец, довести до совершенства наше правило Find-2-coeval-Person, последняя версия которого была приведена в разд. 6.5.1. Если вы помните, это правило выводит всевозможные пары персон одинакового возраста. Чтобы данное правило не выводило эквивалентные по смыслу пары имен (например, Bob-Sue и Sue-Bob), преобразуем нашу программу следующим образом:
Пример 6.32. Улучшенное правило Find-2- coeval- Person (deftemplate person (slot name) (slot age)) (deftemplate person-pair (slot namel) (slot name2) (slot age)) (deffacts people (person (name Joe) (age 20)) (person (name Bob) (age 20)) (person (name Joe) (age 34)) (person (name Sue) (age 34)) (person (name Sue) (age 20))) (defrule Find-2-Coeval-Person (person (name?x) (age?z)) (person (name?ys~?x) (age?z)) (not (person-pair (namel?x) (name2?y) (age?z))) (not (person-pair (namel?y) (name2?x) (age?z))) => (printout t "name="?x " name="?y " age="?z crlf) (assert (person-pair (namel?x) (name2?y) (age?z)))) Обратите внимание на произведенные изменения. Во-первых, с помощью конструктора deftemplate был Добавлен дополнительный шаблон person-pair. В фактах, соответствующих данному шаблону, будет храниться информация об уже найденных парах ровесников. Кроме того, было сильно изменено и само правило. В его левой части было добавлено два условия:
(not (person-pair (namel?x) (name2?y) (age?z))) (not (person-pair (namel?y) (name2?x) (age?z))) Эти условные элементы проверяют наличие фактов типа person-pair и, тем самым отслеживают, была ли уже обработана данная пара или ее перестановка. Если эти факты отсутствуют, то это означает, что обработка еще не была выполнена. В этом случае правило активируется, и выполняются действия, описанные в правой части правила. А именно выводится на экран сообщение о найденной паре ровесников и добавляется соответствующий факт person-pair, утверждающий, что данная пара уже была обработана. Для запуска программы выполните команды reset и run. Программа выведет на экран следующую информацию: Пример 6.33. Результат работы правила Find-2- Coeval- Person
name=Sue name=Bob age=20 name=Sue name=Joe age=20 name=Sue name=Joe age=34 name=Bob name=Joe age=20 Если вы внимательно посмотрите на полученный результат и исходные данные, то обнаружите, что это именно то, что нам было нужно. Это список всевозможных ровесников без повторений и с исключением того факта, что все люди являются ровесниками сами себе. Теперь наше правило достигло полного совершенства! Обратите внимание на тот факт, что если вы повторно попробуете выполнить команду run, то ничего не увидите. Это происходит потому, что в списке фактов содержится информация обо всех обработанных парах, оставшаяся после первого запуска. Для того чтобы повторно запускать данный пример, выполняйте команду reset перед каждой командой run.
ГЛАВА 8. Функции Как уже отмечалось, CLIPS поддерживает не только эвристическую парадигму представления знаний (в виде правил), но и процедурную парадигму, используемую в большинстве языков программирования, таких, например, как Pascal или С. Функции в CLIPS являются последовательностью действий с заданным именем, возвращающей некоторое значение или выполняющей различные полезные действия (например, вывод информации на экран). Как уже упоминалось в гл. 4, в CLIPS существуют внутренние и внешние функции. Внутренние функции реализованы средой CLIPS, поэтому их можно использовать в любой момент. Описание внутренних функций приведено в гл. 15. Внешние функции — это функции, написанные пользователем. Внешние функции можно создавать как с помощью среды CLIPS, так и на любых других языках программирования, а затем подключать готовые, откомпилированные исполнимые модули к CLIPS. Однако эта тема выходит за рамки данной книги. Подробную информацию о создании внешних функций можно найти в книге " CLIPS Reference Manual, Volume II, Advanced Programming Guide". Для создания новых функций в CLIPS используется конструктор deffunction, описанный далее в этой главе. 8.1. Конструктор deffunction и способы работы с внешними функциями Конструктор deffunction позволяет пользователю создавать новые функции непосредственно в среде CLIPS. Способ вызова функций, определенных пользователем, эквивалентен способу вызова внутренних функций CLIPS. Вызов функции осуществляется по имени, заданному пользователю. За именем функции следует список необходимых аргументов, отделенный одним или большим числом пробелов. Вызов функции вместе со списком аргументов должен заключаться в скобки. Последовательность действий определенной с помощью конструктора deffunction функции исполняется интерпретатором CLIPS (в отличие от функций, созданных на других языках программирования, которые должны иметь уже готовый исполнимый код). Синтаксис конструктора deffunction включает в себя 5 элементов: Ø имя функции; Ø необязательные комментарии; Ø список из нуля или более параметров; Ø необязательный символ групповых параметров для указания того, что функция может иметь переменное число аргументов; Ø последовательность действий или выражений, которые будут выполнены (вычислены) по порядку в момент вызова функции.
|
||||||
Последнее изменение этой страницы: 2021-03-10; просмотров: 48; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.119.199 (0.014 с.) |