Определение 6.11. Синтаксис предикатного ограничения 


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



ЗНАЕТЕ ЛИ ВЫ?

Определение 6.11. Синтаксис предикатного ограничения



 

:<вызов-функции>

 

Таким образом, определение понятия "элемент", приведенное в предыдущем разделе, можно расширить следующим образом:

Определение 6.12. Синтаксис понятия "элемент"

 

<элемент> ::= <константа>│

<простая-переменная>|

<составная-переменная>|

:<вызов-функции>

 

CLIPS предоставляет несколько готовых предикатных функций (см. гл. 15). Кроме этого, пользователь также может создавать свои собственные преди­катные функции.

Пример 6.20. Еще один вариант правила Find- data

 

(defrule Find-data

(data?x&: (floatp?x)&:{>?x 0) $?y?z&:(stringp?z))

=>

(printout t "x="?x " y="?y " z="?z crlf))

 

Выше приведен еще один вариант правила Find-data. В данном случае ищется факт неявно созданного шаблона data, первое поле которого — вещественное число больше нуля, а последнее — строка. В нашем спис­ке фактов такому правилу удовлетворяет только факт с индексом 1 —

(data 1.0 blue "red").

Ограничения, возвращающие значения

 

В ограничениях возможно использование значений, возвращенных некото­рыми функциями (в том числе и внешними). Вызов функции записывается с помощью знака = и указанной за ним функцией.

 

Замечание

Функция сравнения также использует знак =. Разница между ними может быть определена по контексту.

 

Возвращаемое значение должно быть одним из простых типов данных CLIPS. Это значение, возвращенное функцией, объединяется с образцом так, как если бы оно было символьным ограничением. Заметьте, что функ­ция вычисляется при каждом сопоставлении образцов, а не один раз при определении правила.

Ограничения, возвращающие значения, имеют следующий синтаксис:

Определение 6.13. Синтаксис ограничения, возвращающего значение

 

=<вызов-функции>

 

Определения понятия "элемент", приведенные в предыдущем разделе, при­мут такой вид:

Определение 6.14. Синтаксис понятия "элемент"

 

<элемент> ::= <константа>│

<простая-переменная>|

<составная-переменная>|

:<вызов-функции>

=<вызов-функции>

 

Правило из примера 6.21 выводит на экран такие факты data, в которых значение второго поля в два раза больше, чем значение первого. В нашем случае это факты (data 1 2) И (data 2 4).

Пример 6.21. Использование ограничения, возвращающего значение

 

(assert (data I 2)

(data 2 3)

(data 24))

(defrule Find-data

(data?x?y&=(* 2?x))

=>

(printout t "x="?x " y="?y crlf))

6.5.3. Условный элемент or

Условный элемент or позволяет активировать правило любым из несколь­ких заданных условных элементов. Если какой-нибудь из условных элемен­тов, объединенных с помощью or, удовлетворен, то и все выражение or считается удовлетворенным. В этом случае, если все остальные условные элементы, входящие в левую часть правила (но не входящие в or), также удовлетворены, правило будет активировано. Условный элемент or может объединять любое количество элементов.

Замечание

Правило будет активировано для каждого выражения в условном элементе or, которое было удовлетворено. Таким образом, условный элемент or произво­дит эффект, идентичный написанию нескольких правил с похожими посылками и следствиями.

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

<условный-элемент-ог >::= (or <условный-элемент>+)

Пример 6.25. Применение условного элемента or                             

(defrule system-fault

(error-status unknown) (or (temp high)

(valve broken)

(pump off))

 =>

(printout t "The system has a fault." crlf))

Данное правило сообщит о поломке системы, если в списке фактов будет присутствовать факт error-status unknown и один из фактов temp high, valve broken или pump off. В случае если будут присутствовать два из этих трех фактов, например temp high и pump off, то сообщение будет выведено два раза. Заметьте, что приведенный пример — точный эквивалент следующих трех отдельных правил:

Пример 6.26. Эквивалент правилу system-fault

 

(defrule system-fault-1

(error-status unknown)

(pump off)

=>

(printout t "The system has a fault." crlf))

(defrule system-fault-2

(error-status unknown) (valve broken)

=>

(printout t "The system has a fault." crlf))

(defrule system-fault-3

(error-status unknown) (temp high)

=>

(printout t "The system has a fault." crlf))

6.5.4. Условный элемент and

Все условные элементы в левой части правил CLIPS объединены неявным условным элементом and. Это означает, что все условные элементы, задан­ные в левой части, должны удовлетвориться, для того чтобы правило было активировано. С помощью явного применения условного элемента and можно смешивать различные условия and и or и группировать элементы так, как этого требует логика правил. Условие and удовлетворяется, только если все условия внутри явного and удовлетворены. В случае, если остальные условия в левой части правила также истинны, правило будет активировано. Элемент and может объединять любое число условных элементов.



Поделиться:


Последнее изменение этой страницы: 2021-03-10; просмотров: 80; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.55.14 (0.006 с.)