Лява част (lhs, условие) на продукционно правило



Дата18.09.2016
Размер114.67 Kb.
#10218
ЛЯВА ЧАСТ (LHS, УСЛОВИЕ) НА ПРОДУКЦИОННО ПРАВИЛО

Типове елементи на условието (conditional elements, CEs):



::=


| |


| | | |

| |


Елемент на условието от тип образец


(Pattern Conditional Element)
Един елемент на условието от тип образец (pattern CE) представлява поредица (наредена или ненаредена) от ограничения върху стойностите на съответните полета от факта, които трябва да бъдат удовлетворени, за да е съпоставим този факт с разглеждания елемент на условието. Тези ограничения могат да включват:

  • литерални ограничения (константи);

  • специални символи за безусловно съпоставяне ? и $? (wildcards single- and multifield);

  • променливи (variables single- and multifield);

  • логически връзки;

  • предикати (обръщения към предикати);

  • върнати стойности (оценки на обръщения към функции).

Има два вида елементи на условието от тип образец: наредени образци и ненаредени образци (deftemplate образци).

Синтаксис на нареден образец:



( . . . )

Синтаксис на ненареден образец:



(

( )

( )

. . .

( ) )

Както беше отбелязано по-горе, понятието “ограничение” (constraint) се дефинира както следва:



::= | ? | $? |

|

|

|


|





  1. Литерални ограничения

Най-простият вид ограничения са т. нар. литерални ограничения. Тези ограничения се задават с помощта на константи. Съответното поле на факта удовлетворява едно литерално ограничение, когато то съвпада със записаната в образеца константа.

Пример:


> (deftemplate person

(slot name)

(slot age)

(multislot friends))

> (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-Bob

(person (name Bob) (age 20))

=> )

> (defrule Find-Sue

(person (age 34) (name Sue))

=> )

> (reset)

> (agenda)

0 Find-Sue: f-4

0 Find-Bob: f-2

Забележка. В първата колона на изхода (резултата от изпълнението) на командата agenda се записва приоритетът на съответното правило.




  1. Специални символи ? и $?

Специалният символ ? се съпоставя успешно със съответното (точно едно) поле на факта, а специалният символ $? се съпоставя успешно със съответната поредица от 0, 1 или повече полета на факта. При използване на повече от един специален символ ?$ в един образец е възможно съпоставянето да се извърши по няколко начина.


  1. Променливи

Името на една променлива в CLIPS се състои от символ, предшестван от въпросителен знак (?). По подразбиране променливите могат да получават атомарни стойности. За означаване на това, че една променлива ще получи в резултат на съпоставянето множествена стойност, пред името на променливата в образеца се поставя знак “$”. Следователно, синтаксисът на променливите в CLIPS е следният:

::= ?

::= $?

При първо срещане в дадено правило всяка променлива е свободна, т.е. може успешно да се съпостави със съответното поле на факта (при променлива с атомарна стойност) или със съответната поредица от 0, 1 или повече полета на факта (при променлива с множествена стойност). След първото съпоставяне с някаква стойност променливата се свързва с тази стойност (подобно на променливите в езика Пролог) и всички останали нейни включвания в правилото се смятат за еквивалентни на стойността, с която е свързана. Следователно, областта на действие на една променлива, използвана в някакъв образец в условието на дадено правило, съвпада с това правило.

Пример 1

> (clear)

> (reset)

> (assert (data 2 blue green)

(data 1 blue)

(data 1 blue red))



> (facts)

f-0 (initial-fact)

f-1 (data 2 blue green)

f-2 (data 1 blue)

f-3 (data 1 blue red)

For a total of 4 facts.

> (defrule find-data-1

(data ?x ?y ?z)

=>

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

> (run)

1 : blue : red

2 : blue : green

>

Пример 2


> (reset)

> (assert (data 1 blue)

(data 1 blue red)

(data 1 blue red 6.9))



> (facts)

f-0 (initial-fact)

f-1 (data 1 blue)

f-2 (data 1 blue red)

f-3 (data 1 blue red 6.9)

For a total of 4 facts.

> (defrule find-data-1

(data ?x $?y ?z)

=>

(printout t "?x = " ?x crlf

"?y = " ?y crlf

"?z = " ?z crlf

"--------" crlf))

> (run)

?x = 1

?y = (blue red)

?z = 6.9

--------

?x = 1

?y = (blue)

?z = red

--------

?x = 1

?y = ()

?z = blue

--------

>

Забележка. Командата printout има следния синтаксис:



(printout *)

Тук <logical-name> трябва да е t, ако извеждането ще се извършва на стандартното изходно устройство (терминала). Сред поредицата изрази <expression>* може да се среща символът crlf, който предизвиква преминаване на нов ред.

Пример 3

> (reset)

> (assert (data 2 blue green)

(data 1 blue)

(data 2 blue red))



> (defrule find-data

(data $?x $?y)

=>

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

> (run)

() : (2 blue red)

(2) : (blue red)

(2 blue) : (red)

(2 blue red) : ()

() : (1 blue)

(1) : (blue)

(1 blue) : ()

() : (2 blue green)

(2) : (blue green)

(2 blue) : (green)

(2 blue green) : ()

>


  1. Логически връзки (connective constraints)

За конструиране на съставни ограничения чрез комбиниране на отделни по-прости ограничения и променливи се използват логическите връзки & (конюнкция), | (дизюнкция) и ~ (отрицание).

Синтаксис:



& & . . . &

| | . . . |

~

Тук може да бъде променлива, константа, обръщение към предикат или ограничение от тип логическа връзка.

Ако първият терм от едно ограничение от тип логическа връзка представлява първо включване на дадена променлива в правилото, тогава тази променлива в момента е свободна и за съответното поле от факта са в сила само ограниченията, породени от останалите термове. В такъв случай при успешно съпоставяне променливата се свързва със стойността на съответното поле от факта. Ако съответната променлива е свързана, нейната стойност се интерпретира като допълнително ограничение върху стойността на съответното поле от факта (заедно с ограниченията, породени от останалите термове).


  1. Предикати

Ограничението от този тип представлява обръщение към функция – предикат. Ако оценката на обръщението към предиката е различна от FALSE, то ограничението е удовлетворено.

Синтаксис:



:

Пример:


> (clear)

> (defrule example-1

(data ?x&:(numberp ?x))

=> )

> (assert (data 1) (data 2) (data red))



> (agenda)

0 example-1 : f-1

0 example-1 : f-0

For a total of 2 activations.

>


  1. Върнати стойности

Ограничението от този тип има следния синтаксис:

=

Оценката на обръщението към посочената функция трябва да бъде от някакъв примитивен (атомарен) тип. Тази оценка се включва директно на съответната позиция в образеца и съпоставянето се извършва по същия начин, както ако в образеца беше включена константа, съвпадаща с въпросната оценка. Обръщението към функцията се оценява всеки път, когато се прави опит за съпоставяне с образеца.




Елемент на условието от тип присвоен образец


(Assigned Pattern Conditional Element)
Елементите на условието от този тип имат следния синтаксис:

::= ? <-

Семантика. Посочената променлива се свързва с адреса на намерения факт, съпоставим с образеца


.


Елемент на условието от тип тест


(Test Conditional Element)
Елементите на условието от този тип имат следния синтаксис:

(test )

Семантика. Този елемент на условието се удовлетворява, когато оценката на обръщението към посочената функция е различна от FALSE. В противен случай елементът на условието от тип тест не се удовлетворява.

Пример:

> (clear)

> (defrule example-1

(data ?x)

(value ?y)

(test (>= (abs (- ?y ?x)) 3))

=> )

> (assert (data 6) (value 9))



> (agenda)

0 example-1 : f-0, f-1

For a total of 1 activation.

>

Елементи на условието от тип дизюнкция, конюнкция, отрицание

(Or, And, Not Conditional Element)
Синтаксис:

(or +)

(and +)

(not )

Семантика: традиционната за съответните логически функции. Съпоставянето с елемент на условието от тип дизюнкция (конюнкция) е успешно, когато съответният факт удовлетворява поне един от елементите (всички елементи) на дизюнкцията (конюнкцията). Съпоставянето с отрицателен елемент на условието е успешно, когато не съществува факт, съпоставим с аргумента на not. Употребата на отрицателен елемент на условието (not CE) предизвиква добавяне в лявата страна на правилото на елемент от вида (initial-fact) или (initial-object), което означава, че за да се осигури съпоставянето при наличие на отрицателен елемент на условието, трябва предварително да се изпълни команда reset.



Елемент на условието от тип exists

(Exists Conditional Element)
Елементът на условието от тип exists служи за определяне на това, дали дадена група от елементи на условието се удовлетворява от поне едно множество от факти (обекти).

Синтаксис:



(exists +)

Семантика. Елементът на условието от тип exists се реализира чрез отрицание на съответен отрицателен елемент на условието.

Например, правилото

(defrule example

(exists (a ?x) (b ?x))

=> )

е еквивалентно на следното правило:



(defrule example

(not (not (and (a ?x) (b ?x))))

=> )

Елемент на условието от тип forall

(Forall Conditional Element)
Елементът на условието от тип forall служи за проверка дали винаги когато се удовлетвори даден елемент на условието, се удовлетворява също и група други елементи на условието.

Синтаксис:



(forall

+)

Семантика. Елементът на условието от тип forall се реализира чрез комбинация от съответни not и and елементи на условието.

Например, правилото

(defrule example

(forall (a ?x) (b ?x) (c ?x))

=> )

е еквивалентно на следното правило:



(defrule example

(not (and (a ?x)

(not (and (b ?x) (c ?x)))))

=> )

Пример. Следното правило определя изискването всеки ученик да е преминал успешно предметите reading, writing и arithmetic.



> (clear)

> (defrule all-students-passed

(forall (student ?name)

(reading ?name)

(writing ?name)

(arithmetic ?name))

=>

(printout t "All students passed." crlf))

> (reset)

> (agenda)

0 all-students-passed : f-0, ; запетаята тук означава, че в LHS

For a total of 1 activation. ; на правилото има и not CE

> (assert (student Bob))



> (agenda)

>

> (assert (reading Bob) (writing Bob))



> (agenda)

>

> (assert (arithmetic Bob))



> (agenda)

0 all-students-passed : f-0,

For a total of 1 activation.

> (assert (student John))



> (agenda)

>

Забележка. Елементите на условието от тип exists и forall се реализират с помощта на отрицателни елементи на условието. Тъй като употребата на отрицателен елемент на условието предизвиква добавяне в лявата страна на правилото на елемент от вида (initial-fact) или (initial-object), за успешното съпоставяне на елементите на условието от тип exists и forall е необходимо предварително да се изпълни команда reset.



Логически елемент на условието

(Logical Conditional Element)
Логическите елементи на условието предоставят възможност за поддържане на истинността на факти или обекти от работната памет. Един факт или обект, който се създава в резултат на изпълнението на дясната страна на дадено правило, може да бъде поставен в логическа зависимост от фактите или обектите, които са съпоставени с образците, включени в логическите елементи на условието на същото правило.

Фактите и обектите, които се съпоставят с логическите елементи на условието на едно правило, осигуряват логическа поддръжка на фактите и обектите, които се създават в дясната страна на това правило. Един факт или обект може да бъде поддържан логически от повече от една група факти или обекти в рамките на няколко правила. Ако един факт/обект се поддържа логически от група факти/обекти и някой от поддържащите факти/обекти бъде изтрит (и няма други групи поддържащи факти/обекти), тогава този факт/обект се изтрива от работната памет.

Ако даден факт/обект е създаден без логическа поддръжка, тогава той има безусловна поддръжка. Наличието на безусловна поддръжка на един факт/обект премахва логическата му поддръжка (зависимост), установена чрез използване на логически елементи на условието.

Синтаксис:



::= (logical +)

Логическите елементи трябва да са записани плътно един след друг и да предшестват останалите елементи на условието на правилото.

Пример

> (clear)

> (defrule rule1

(logical (a))

(logical (b))

(c)

=>

(assert (g) (h)))

> (defrule rule2

(logical (d))

(logical (e))

(f)

=>

(assert (g) (h)))

> (watch facts)

> (watch activations)

> (watch rules)

> (assert (a) (b) (c) (d) (e) (f))

==> f-0 (a)

==> f-1 (b)

==> f-2 (c)

==> Activation 0 rule1: f-0,f-1,f-2

==> f-3 (d)

==> f-4 (e)

==> f-5 (f)

==> Activation 0 rule2: f-3,f-4,f-5



> (run)

FIRE 1 rule2: f-3,f-4,f-5 ; едно правило установява логическа

==> f-6 (g) ; поддръжка

==> f-7 (h)

FIRE 2 rule1: f-0,f-1,f-2 ; второ правило установява логическа

> (retract 1) ; поддръжка

<== f-1 (b) ; премахва се първата поддръжка за (g) и (h)

> (assert (h)) ; (h) получава безусловна поддръжка

FALSE

> (retract 3)

<== f-3 (d) ; премахва се втората поддръжка за (g)

<== f-6 (g) ; (g) няма поддръжка

> (unwatch all)


Използване на правило без елементи на условието в лявата страна

Ако дадено правило е дефинирано така, че лявата му страна не съдържа никакви елементи на условието, автоматично в лявата му страна се включва елемент от вида (initial-fact) (или (initial-object), ако при конфигурирането на CLIPS е изключена възможността за работа с факти).

Например, правилото

(defrule example-1

=> )

се трансформира по следния начин:



(defrule example-1

(initial-fact)

=> )

Следователно, за да се осигури съпоставянето при наличие на правило от този вид, трябва предварително да се изпълни командата reset.


Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница