1.4. fejezet, Szabály alapú fejlesztés


A lehúzó húzó-lent állapotba kerülése a harangot nyitva állapotba helyezi. A harang nyitott állapota a víztartó szintjének víz-üres értékre történő változását eredményezi, ezután pedig a lehúzó és a harang állapota alapértéket vesz fel. Az úszó követi a víztartó szintváltozását. Az úszó szintjének víz-üres állapotba kerülésekor a csap kinyílik. A víz bezúdul a víztartóba, és szintje víz-tele értéket vesz fel. Az úszó szintje követi a víztartó szintjét. Az úszó szintjének víz-tele állapotba kerülésekor a csap zár, és a folyamat vége. Fontos hogy lehetőség legyen több wc külön-külön történő működésének szimulálására. Erre használható a for ... any kulcsszó páros (pl.: LH is csatlakozik any harang HR), és az objektumok közti viszonyt is mi nevezhetjük meg (pl.: csatlakozik).

Szabályt létrehozni egy workspace new-rule menüpontjával lehet. Szabályok kiértékelését esemény bekövetkezése (forward), belső időzítő lejárása (scanning) vagy adathiány (backward) indíthatja. Amennyiben a feltétel teljesül, a következmény részben leírtak végrehajtásra kerülnek. A következmény részben hivatkozott objektumokon párhuzamosan - ill. az "in order" kulcsszó esetén sorban - hajtódnak végre az események.

Feltétel rész

Események közül az egyik legalapvetőbb egy workspace aktiválása. Ekkor elsőként az "initially…" szabályok értékelődnek ki, amik a kiindulási környezet meghatározására használhatók. Feltétel nélküli végrehajtást az "unconditionally…" szabályok tesznek lehetővé. Ezek kiértékelése eljárásokból vagy szabályokból indítható az invoke kulcsszó használatával. Egyéb események lekezelésére az if, when és whenever szabályok használhatók. Általános szabályok a "For…" kulcsszóval definiálhatók. Például: Minden lámpára L (for any lampa L), ha a státusza az L-nek 'bekapcsolva'(if (the statusz of L) = bekapcsolva), akkor… Szabályokban használt lokális változó segítségével - mint az L, ami az aktuális lámpa objektumra mutat - igen összetett szabályok hozhatóak létre, amint az a később bemutatásra kerülő "A WC működése" című szabály alapú fejlesztési példában látható. Ezek a változók nem csak generikus, hanem specifikus szabálytípusban is alkalmazhatóak, mint az "if… then…" és a "when… then…" Az "if… then…" a "when… then…" feltétellel közel egyenértékű. Az előző kiértékelése forward és backward módon indulhat, míg az utóbbié csak invokálással és objektumra történő fókuszálással indul. A "whenever… then…" szabályok bármilyen esemény általános lekezelésére szolgálnak. Így például egy objektum megadott attribútumának akármilyen értékre történő változása ilyen szabályszerkezetekben érzékelhetők.

A szabályok Options attribútumban határozható meg kiértékelési feltételük, illetve a következmény részben okozott lehetséges eseményeik: Forward chaining Egy esemény bekövetkezte - például egy változó értékének megváltozása - okozhatja-e az adott szabály kiértékelésének indítását, (invocable via forward chaining), illetve a szabály következményrésze tartalmaz-e újabb forward kiértékelésindítást okozó - újabb értékadás - eseményt (may cause forward chaining). Ha egy szabály feltételrészében hivatkozik egy adott objektumra - például egy változóra -, és a szabály kiértékelése indítható forward módon (pl.: értékváltozással), valamint az objektum okozhat forward módon kiértékelésindítást, akkor az objektumon történt esemény következtében a szabály kiértékelése megtörténik. Amennyiben a feltétel igaz, a következményrész végrehajtódik.

Az előbbiek alapján a kiértékelésindítás nem csak szabályoknál, hanem változóknál és paraméter objektumoknál is állítható. Így például a szimbolikus ill. logikai változók és paraméterek alapértelmezés szerint indíthatnak kiértékelést (do forward chaining), a szöveg és szám jellegűek viszont nem (do not forward chaining). Ez azt jelenti, hogy míg egy szimbolikus változó értékváltozása után a rá vonatkozó szabályok kiértékelődnek, addig egy text típusú változó értékváltozásánál nem. Mindazonáltal ez is - mint sok más - újrakonfigurálható. Fontos megjegyezni, hogy az előzővel megegyező érték újra megadása a változóobjektumoknál nem indít forward kiértékelés. Backward chaining Ha egy szabály olyan változónak az értékére hivatkozik, aminek nincs meghatározott értéke - például az érvényessége a legutóbbi értéknek lejárt -, akkor amíg értéket nem kap a változó, a rá következmény részében vonatkozó backward chaining módon hívható szabályok kiértékelésre kerülnek. Egy változó depth-first backward chaining deklarációval párhuzamos szabálykiértékelés kezdeményezésére is beállítható. Ennek következtében addig értékelődnek ki párhuzamosa ezek a szabályok, amíg valamelyikük értéket nem szolgáltat a változónak.

Néhány lehetséges következmény

Conclude - változók és paraméterek, tömbök, listák, attribútumok értékének megváltoztatására szolgál. Példa: Conclude that the quantity that is an attribut of Armoure1 named by gas-tank-level = 250

Change - objektum nevének, ikon méretének és színének, szöveges attribútum értékének megváltoztatásához. Példa: Change the border-color of warning-message to red

Create - objektum és objektum-definíció létrehozására és klónozására. Példa: Create an Automobile

Focus - objektumra vagy objektumosztályra vonatkozó szabályokra történő fókuszálás Példa: Whenever maximum-value receives a value and maximum-value > 200 then focus on capacity Invoke - szabályra, szabályhalmazokra fókuszálás.

Míg a focus közvetett, az invoke direkt kiértékelésindítást eredményez. Példa: Invoke safety rules Inform - Üzenetküldés az operátornak ill. egy objektumnak. Példa: Inform the operator that "Hello operator!" Start - eljárások indítása. Példa: Start random-color(new-obj)

Egyéb lényeges attribútumok

Scan interval: A kiértékelés időzítésére szolgál. Segítségével megadott időközönként kiértékelésre kerül a szabály. Legkisebb értéke egyenlő a rendszerben beállítható minimum scheduling interval értékével, ill. 0.05 másodperccel.

Focal classes and objects: A tudásbázisban az invoke szabályra fókuszálás mellett a "focus on…" paranccsal megadott objektumokra vonatkozó szabályokra irányítható a kiértékelési folyamat. Ennek a két attribútumnak adható meg, hogy mely objektumokra és objektumosztályokra történő fókuszálás során értékelődjön ki az adott szabály.

Categories: A szabályok kategóriákba sorolhatók. Egy szabály több kategóriahalmazba is tartozhat, amelyek kiértékelése az invoke kulcsszóval kezdeményezhető.

Rule priority: Az azonos objektumokra hivatkozó szabályok között kiértékelési sorrend állítható fel segítségével. Értéke 1 és 10 közé eshet, és a kisebb érték nagyobb prioritást jelenti.