Переменные, связанные с простыми и составными полями 


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



ЗНАЕТЕ ЛИ ВЫ?

Переменные, связанные с простыми и составными полями



 

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

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

 

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

 

<ограничение>::=                     <символьное-ограничение > |

? │

$? │

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

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

<переменная-простого-поля> ::=?<имя-переменной>

<переменная-составного-поля>::= $?<имя-переменной>

 

Имя переменной должно быть значением типа symbol и обязательно начи­наться с буквы. В имени переменной не разрешается использовать кавычки, т. е. строка не может использоваться как имя переменной или ее часть.

 

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

Связанные переменные могут быть использованы во внешних функциях. Символ $ имеет особое значение в левой части правил — этот оператор ото­бражает, что некоторая, возможно пустая, последовательность полей требует сопоставления. В правой части правила символ $ ставится перед перемен­ной для обозначения того, что перед использованием переменной в качест­ве аргумента функции необходимо раскрыть последовательность полей, со­держащихся в переменной. Таким образом, при использовании переменных в качестве параметров функций (как в левой, так и правой части правил) перед именем переменной, содержащей значение составного поля, не дол­жен стоять символ $ (за исключением случаев, когда требуется раскрыть последовательность полей). При использовании переменной, содержащей значение составного поля, в других случаях, перед ее именем должен стоять символ $. Нельзя применять переменную составного поля при операциях с простым полем образца шаблона или объекта.

В качестве примера введите в среду CLIPS следующее правило:

Пример 6.14. Правило Find-data

 

(defrule    Find-data

(data? blue?x $?y) =>

(printout  t "Found  data  (data  ?  blue "?x " "?y ")" crlf))

 

Выполните команды reset и run. Если правило было введено в систему без ошибок, то на экране появится следующий результат:

 

Пример 6.15. Результат работы правила Find- data

 

Found  data (data?  blue  red   (6.9))

Found  data (data?  blue  RED ())

Found  data (data?  blue  red   ()}

Found  data (data?  blue  red   ()}

 

Образцу, заданному в правиле, удовлетворяют четыре факта с индексами 1, 3, 4, 5. В результате активации правило выводит на экран свойства фактов, активировавших правило. Значение переменной, содержащей значение из составного поля, выводится в скобках. Кроме первого случая (факта с индексом 5), переменная содержит пустое значение. Переменную составного поля не обязательно использовать в качестве последнего ограничения. Рас­смотрим следующее правило:

Пример 6.16. Модифицированное правило Find- data

 

(defrule Find-data

(data?x $?y?z) =>

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

Заданному образцу удовлетворяют все факты data, но обратите внимание, каким образом связываются значения с переменной у в разных случаях:

 

Пример 6.17. Результат работы модифицированного правила Find- data

 

х=1.0         y=(blue)                 z=red

х=1            у=()                        z=blue

х=1            y=(blue)                 z=red

х=1            y=(blue)                 z=RED

х=1            y=(blue red)           z=6.9

 

После того как произошло связывание переменной со значением, все ссыл­ки на эту переменную возвращают значение, с которым переменная была связана. Это действительно как для переменных, связанных с составными полями, так и для переменных, связанных с простыми полями. Кроме того, допустимы ссылки между образцами в одном правиле.

Пример 6.18. Правило Find-2-Coeval-Person

 

(defrule    Find-2-Coeval-Person

(person (name?x) (age?z))

(person (name?y) (age &z))

=>

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

 

Приведенное выше правило Find-2-Coevai-person выведет на экран всевоз­можные пары имен людей (все перестановки) одинакового возраста. Как научить это правило не выводить эквивалентные по смыслу или бессмыс­ленные пары одинаковых имен (Bob-Bob), мы увидим в следующих разделах.

 

Связывающие ограничения

 

CLIPS предоставляет 3 связывающих ограничения, предназначенных для объединения отдельных ограничений и переменных в единое целое: & (логическое И), | (логическое ИЛИ) и ~ (логическое НЕ). Ограничение & удов­летворяется, если два соседних ограничения удовлетворяются. Ограничение | удовлетворяется, если любое из двух соседних ограничений удовлетворяется. Ограничение ~ удовлетворяется, если следующее за ним ограничение не удовлетворяется. Связывающие ограничения могут комбинироваться почти произвольным образом и в любом количестве. Ограничение ~ имеет наи­высший приоритет, далее следуют & и |. В случае одинакового приоритета ограничение вычисляется слева направо. Существует одно исключение из правил приоритета, которое применяется при связывании переменных. Ес­ли первое ограничение — это переменная и за ней следует &, то переменная является отдельным ограничением. Ограничение?x&red|blue вычисляется как?х& (red|blue), в то время как по правилам приоритета оно должно было вычисляться как (?x&red) (blue.

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

 



Поделиться:


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

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