Определение 6.19. Синтаксис условного элемента and 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Определение 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 с.)