• Nenhum resultado encontrado

Simularea unui motor tentativ printr-un shell de motor irevocabil irevocabil

Regimul de lucru tentativ

5.1. Simularea unui motor tentativ printr-un shell de motor irevocabil irevocabil

Cu toată fragilitatea lor aparentă, shell-urile de sisteme expert ce implementează regimuri de lucru irevocabile sunt foarte răspândite (exemple sunt OPS5 [8], [13], CLIPS [16]). Din fericire, un comportament tentativ poate fi realizat pe o maşină irevocabilă pur şi simplu prin proiectarea regulilor. În acest caz, practic se construieşte un meta-sistem expert aflat deasupra sistemului expert dedicat domeniului avut în vedere. Faptele cu care lucrează meta-sistemul sunt regulile din domeniul aplicaŃiei.

În cele ce urmează vom proiecta meta-regulile unui sistem a cărui menire va fi să facă să funcŃioneze pe un motor irevocabil baza de cunoştinŃe din exemplul Ex. 2.

Vom considera următoarele tipuri generale de fapte (structuri de fapte5):

fapte care păstrează regulile domeniului (pentru că, aşa cum spuneam, regulile domeniului trebuie privite acum drept fapte ale meta-sistemului), de forma:

(regula <eticheta> <prioritate> <listaPremise>

<listaActiuni>)

în care <eticheta> identifică unic o regulă, <prioritate> este un indicator al priorităŃii regulii, iar <listaPremise> şi <listaActiuni> păstrează premisele, deci partea stângă, şi respectiv acŃiunile, adică partea dreaptă, a regulii.

Despre prioritatea regulilor, ca mijloc de a controla selecŃia, vom vorbi în mai multe rânduri în capitolele următoare.

5 Termenul englezesc: templates.

Programarea bazată pe reguli 70

O observaŃie este necesară în acest punct. Ştim deja că trebuie să împiedicăm aplicarea unei reguli, în acelaşi context, mai mult de o singură dată. Apare deci necesară memorarea faptului că o regulă a fost aplicată. Includerea în descrierea regulii a unui indicator care să avertizeze asupra utilizării ei, va rezulta, după o reflecŃie, ca fiind o alegere defectuoasă. Motivul este comportamentul în situaŃiile de reveniri, când refacerea unei stări precedente înseamnă inclusiv să uităm că au fost aprinse regulile utilizate în paşii motorului ce sunt daŃi înapoi. Lista regulilor utilizate deja este o caracteristică a contextului, la fel ca şi baza de fapte curentă sau lista regulilor ce sunt încă posibil de aprins în starea curentă. Aşadar, într-un comportament tentativ, o regulă poate fi aprinsă de mai multe ori, în contexte diferite, unde contextul înseamnă un fel de istorie a activităŃii motorului pe o cale ce marchează drumul de la starea iniŃială până la starea curentă, dacă considerăm exclusiv drumurile înainte, deci dacă ignorăm revenirile. Uneori vom numi o astfel de cale – un fir de procesare. Astfel, în Figura 13, deşi regula R a fost o dată aplicată într-un context care nu a dus la soluŃie (în gri deschis), aplicarea ei în acel context trebuie uitată pentru ca regula să poată fi aplicată din nou mai târziu, cu şansa de a participa la soluŃie (săgeată neagră îngroşată pe figură).

Figura 13: Într-o căutare tentativă o regulă este considerată aplicată numai pe calea spre soluŃie

Este uşor de observat că dinamica accesului la această memorie a contextelor este una de tip stivă. În simularea noastră vom prefera să spargem această structură de stivă care memorează contextul de lucru în mai multe secŃiuni, numindu-le pe fiecare în parte stivă, dar cu observaŃia că aceste stive trebuie să lucreze sincron, în sensul că, în orice moment, ele au acelaşi număr de intrări, iar elementele din vârf, împreună, configurează contextul curent.

stare fundătură

stare iniŃială

stare fundătură

stare finală atinsă

traseul final

revenire revenire

R

R

Regimul de lucru tentativ 71

• stiva listelor de reguli deja utilizate este dată de un fapt de forma:

(stivaReguliAplicate <listaReguli>*)

unde <listaReguli> este o intrare în stivă şi reprezintă o listă a etichetelor regulilor ce au fost deja aplicate, iar steluŃa semnifică, aici ca şi mai departe, repetarea acestei structuri de zero sau mai multe ori. În această reprezentare, ca şi în cele ce urmează, vom presupune că vârful stivei este prima listă de după simbolul care dă numele stivei, iar baza stivei este lista din extremitatea dreaptă a faptului. O ipostază a acestei stive, după al treilea ciclu al motorului care funcŃionează pe exemplul de mai sus, este:

(stivaReguliAplicate (R1 R2 R5) (R1 R2) (R1))

cu semnificaŃia: la primul ciclu s-a aplicat regula R1, după al doilea erau aplicate R1 şi R2, iar după al treilea – R1, R2 şi R5.

• stiva listelor de reguli filtrate, dar neaplicate, este dată de un fapt de forma:

(stivaReguliDeAplicat <listaReguli>*)

unde <listaReguli> este o listă a etichetelor regulilor ce mai pot fi încă aplicate într-o stare dată. Pentru exemplificare, o ipostază a acestei stive, pe exemplul dat mai sus, după acelaşi al treilea ciclu al motorului, este:

(stivaReguliDeAplicat () (R7) ())

înŃelegând prin aceasta că după primul pas nu mai rămăsese de aplicat nici o regulă dintre regulile filtrate, după al doilea pas mai rămăsese ca posibil de aplicat regula R7, iar după ciclul al treilea, nici o regulă. După cum se remarcă, presupunem că funcŃionează strategia “refractabilităŃii”, ceea ce, simplificat, pentru cazul nostru, înseamnă că o regulă o dată aplicată nu mai poate fi filtrată.

• un fapt păstrează stiva configuraŃiilor bazei de fapte la momente anterioare aplicării regulilor, de forma:

(stivaBazelorDeFapte <listaFapte>*)

în care <listaFapte> este o listă a faptelor din bază înainte de derularea unui ciclu. O ipostază a acestei stive după acelaşi al treilea ciclu al motorului, pe exemplul de mai sus, este:

(stivaBazelorDeFapte (A I C B D) (A I C L B) (A I C L))

Programarea bazată pe reguli 72

În orice moment în care trebuie să aibă loc o revenire, stiva regulilor de aplicat este memoria pe baza căreia se poate decide o întoarcere înapoi prin alegerea unei alte reguli în locul celei deja selectate la un pas anterior şi care a dus motorul într-un impas. Prin urmare, dacă o intrare în această stivă este vidă, înseamnă că o întoarcere în starea corespunzătoare ei este inutilă întrucât nici o altă alegere nu mai este posibilă. Putem deci elimina intrările vide din stiva regulilor de aplicat fără a pierde nimic din coerenŃă. CondiŃia este să păstrăm sincronismul sistemului de stive, pentru că altfel revenirea asupra alegerii unei reguli s-ar face într-un alt context decât cel avut în vedere. Cum cele trei stive trebuie să fie sincrone, deci să aibă în orice moment acelaşi număr de intrări (fie el, cândva, k), datorită dispariŃiei intrărilor vide din stiva regulilor de aplicat, conform simplificării sugerate mai sus, numărul de cicluri pe care motorul le-a executat, în acest caz, va fi ≥ k. Atunci, presupunând că intrarea a i-a din stiva de reguli de aplicat corespunde ciclului j, ji, va trebui ca intrării a i-a din stiva de fapte să-i corespundă, de asemenea, configuraŃia bazei de fapte de imediat înainte de ciclul j al motorului, iar intrarea a i-a a stivei de reguli aplicate să semnifice lista regulilor aplicate în aceeaşi situaŃie. Această observaŃie avertizează deci să avem grijă ca atunci când o intrare din stiva regulilor de aplicat dispare, intrările corespunzătoare din stiva de fapte şi din cea a regulilor aplicate să dispară de asemenea.

Aplicând această observaŃie la exemplul tratat mai sus, dacă înainte de simplificare, la momentul de dinaintea ciclului al treilea al motorului, configuraŃiile celor trei stive erau:

(stivaReguliDeAplicat () (R7) ())

(stivaReguliAplicate (R1 R2 R5) (R1 R2) (R1))

(stivaBazelorDeFapte (A I C B D) (A I C L B) (A I C L)) după simplificare, acestea trebuie să arate astfel:

(stivaReguliDeAplicat (R7)) (stivaReguliAplicate (R1 R2)) (stivaBazelorDeFapte (A I C L B))

Pe Figura 14 se constată că această simplificare, efectuată înainte de ciclul al patrulea al motorului, semnifică o revenire direct în starea 2 din starea 4, fără a mai vizita starea 3, de unde nici o altă alegere n-ar mai fi fost posibilă.

În continuare, o seamă de fapte vor Ńine starea curentă a motorului:

• lista regulilor filtrate în ciclul curent se memorează într-un fapt de forma:

(reguliFiltrate <etichetaRegula>*) unde <etichetaRegula> este un index de regulă.

Regimul de lucru tentativ 73

• baza de fapte curentă este păstrată de un fapt de forma:

(bazaDeFapteCurenta <fapt>*)

unde <fapt> este un nume de fapt. Pe această bază de fapte are loc faza de filtrare. Baza de fapte este actualizată atât în timpii de execuŃie ai motorului, cât şi în urma revenirilor.

Figura 14: Scurt-circuitarea revenirii dintr-o stare de blocare în prima stare anterioară în care mai există o alternativă neexplorată

• lista regulilor deja aplicate la momentul curent este păstrată într-un fapt de forma:

(reguliAplicate <etichetaRegula>*)

• scopul căutat îl vom păstra într-un fapt de forma:

(scop <fapt>)

A

L C I

B C I

D A

B C I

H A

L revenire

B C I

D A

J

A

L C I

B

Programarea bazată pe reguli 74

• mai avem nevoie de un fapt care precizează faza în derularea unui ciclu, de forma:

(faza <numeFaza>)

ConfiguraŃia iniŃială într-o rulare a motorului tentativ este dată de:

- o mulŃime de fapte (regula …), - un fapt (stivaReguliDeAplicat), - un fapt (stivaReguliAplicate), - un fapt (stivaBazelorDeFapte), - un fapt (reguliFiltrate), - un fapt (reguliAplicate),

- un fapt (bazaDeFapteCurenta <bazaDeFapteInitiala>), unde <bazaDeFapteInitiala> reprezintă baza de fapte de plecare,

- un fapt (scop <faptDeDemostrat>), unde

<faptDeDemostrat> este faptul de demonstrat,

- un fapt (faza filtrare), semnificând faptul că prima fază a motorului este filtrarea.

Descriem mai departe meta-regulile motorului tentativ. Vom începe prin a defini regulile responsabile cu terminarea procesului. Terminarea se poate face cu succes dacă în baza de fapte curentă se regăseşte faptul definit drept scop, sau cu eşec dacă, la sfârşitul fazei de filtrare, nici o regulă nu a fost selectată iar stiva de reguli de aplicat e goală:

MT0: “Terminare cu succes, dacă în baza de date curentă se află faptul scop”

dacă (faza filtrare) şi (scop UN-FAPT) şi

(bazaDeFapteCurenta NISTE-FAPTE) şi UN-FAPT ∈ NISTE-FAPTE

atunci elimină (faza filtrare) anunŃă succes

CondiŃia de terminare este căutată imediat după execuŃie, deci după actualizarea bazei de date curente, adică în faza de filtrare. Terminarea se produce prin retragerea faptului (faza ...) care este referit de oricare meta-regulă.

Prioritatea meta-regulii MT0 trebuie să fie cea mai mare din faza de filtrare pentru ca terminarea cu succes să se realizeze imediat după ce faptul scop a fost găsit în faza anterioară de execuŃie.

MT1: “Terminare cu eşec, dacă nici o regulă nu mai poate fi selectată şi stiva de reguli rămase de aplicat e epuizată”

Regimul de lucru tentativ 75

dacă (faza filtrare) şi (reguliFiltrate) şi

(stivaReguliDeAplicat) şi

nici una din regulile fazei de filtrare, MT0 sau MT2, nu pot fi aplicate atunci elimină (faza filtrare)

anunŃă eşec

La fel ca mai sus, terminarea se produce datorită retragerii faptului (faza ...) care este referit de oricare meta-regulă. Prioritatea meta-regulii MT1 trebuie să fie cea mai mică între regulile ce pot fi aplicate în faza de filtrare, pentru ca ea să fie luate în considerare doar după încheierea filtrării şi înainte de tranziŃia în faza de selecŃie.

Următoarea meta-regulă descrie faza de filtrare: dintre faptele (regula ...) se selectează toate regulile aplicabile şi care nu au mai fost aplicate, adică nu se regăsesc printre regulile menŃionate în lista de reguli aplicate (reguliAplicate ...). CondiŃia de aplicabilitate a unei reguli este ca faptele din partea de condiŃii a regulii să se regăsească între cele ale bazei de fapte (bazaDeFapteCurenta ...):

MT2: “Faza de filtrare”

dacă (faza filtrare) şi

(reguliFiltrate NISTE-REGULI-FILTRATE) şi (bazaDeFapteCurenta NISTE-FAPTE) şi

(reguliAplicate NISTE-REGULI-APLICATE) şi (regula R PRI PREMISE ACTIUNI) şi

R ∉ NISTE-REGULI-FILTRATE şi R ∉ NISTE-REGULI-APLICATE şi PREMISE ⊆ NISTE-FAPTE şi MT0 nu poate fi aplicată

atunci elimină (reguliFiltrate NISTE-REGULI-FILTRATE) şi adaugă (reguliFiltrate R NISTE-REGULI-FILTRATE)

Regula MT2 se aplică de atâtea ori câte reguli pot fi filtrate. La terminarea filtrării, motorul trece în faza de selecŃie:

MT3: “TranziŃia în faza de selecŃie”

dacă (faza filtrare) şi

nici una din regulile MT0, MT1, sau MT2 nu (mai) poate fi aplicată atunci elimină (faza filtrare) şi

adaugă (faza selecŃie)

Meta-regula care urmează descrie un proces elementar de selecŃie, şi anume unul bazat exclusiv pe prioritatea declarată a regulilor. În cazul mai multor reguli

Programarea bazată pe reguli 76

de prioritate maximă, ultima filtrată este cea selectată. Meta-regula MT4, în esenŃă, procedează la o ordonare a etichetelor de reguli filtrate în ordine descrescătoare:

MT4: “Faza de selecŃie”

dacă (faza selecŃie) şi

(reguliFiltrate ... R1 R2 ...) şi (regula R1 PRI1 ...) şi

(regula R2 PRI2 ...) şi PRI2 > PRI1

atunci elimină (reguliFiltrate ... R1 R2 ...) şi adaugă (reguliFiltrate ... R2 R1 ...)

Dacă în urma filtrării rezultă cel puŃin o regulă, când ordonarea lor ia sfârşit se trece în faza de execuŃie:

MT5: “TranziŃia normală în faza de execuŃie”

dacă (faza selecŃie) şi

regulile MT4 şi MT6 nu (mai) pot fi aplicate atunci elimină (faza selecŃie) şi

adaugă (faza execuŃie)

Meta-regula următoare descrie revenirea (backtracking). Ea se aplică când lista filtrată e vidă dar stiva regulilor de aplicat indică încă alte posibilităŃi. Figura 15 arată schematic operaŃiile de efectuat în acest caz.

MT6: “Revenire cu tranziŃie în faza de execuŃie, dacă nici o regulă nu a putut fi selectată”

dacă (faza selecŃie) şi (reguliFiltrate) şi

(reguliAplicate NISTE-REGULI) şi

(bazaDeFapteCurenta NISTE-FAPTE-CURENTE) şi

(stivaReguliDeAplicat O-LISTA-DE-APL REST-STIVA-DE-APL) şi (stivaReguliAplicate O-LISTA-APL REST-STIVA-APL) şi

(stivaBazelorDeFapte NISTE-FAPTE REST-BAZE-DE-FAPTE) atunci elimină (faza selecŃie)

elimină (reguliFiltrate) şi

elimină (reguliAplicate NISTE-REGULI) şi

elimină (bazaDeFapteCurenta NISTE-FAPTE-CURENTE) şi elimină (stivaReguliDeAplicat O-LISTA-DE-APL REST-STIVA- DE-APL) şi

elimină (stivaReguliAplicate O-LISTA-APL REST-STIVA-APL) şi

elimină (stivaBazelorDeFapte NISTE-FAPTE REST-BAZE-DE- FAPTE) şi

Regimul de lucru tentativ 77

adaugă (faza execuŃie) şi

adaugă (reguliFiltrate O-LISTA-DE-APL) şi adaugă (reguliAplicate O-LISTA-APL) şi adaugă (bazaDeFapteCurenta NISTE-FAPTE) şi

adaugă (stivaReguliDeAplicat REST-STIVA-DE-APL) şi adaugă (stivaReguliAplicate REST-STIVA-APL) şi adaugă (stivaBazelorDeFapte REST-BAZE-DE-FAPTE)

Meta-regula MT6 descrie maniera în care se actualizează memoriile ce păstrează starea curentă a sistemului, respectiv regulile filtrate vor fi date de lista din vârful stivei regulilor de aplicat, regulile aplicate vor fi luate din vârful stivei regulilor aplicate, iar baza de fapte curentă – din vârful stivei bazelor de fapte.

Toate stivele sunt simultan decrementate.

Figura 15: OperaŃiile în revenire (backtracking)

În faza de execuŃie, cea mai bine plasată regulă dintre cele filtrate este executată:

reguliFiltrate

reguliAplicate

bazaDeFapteCurenta

stivaReguliDeAplica t

stivaBazelorDeFapte stivaReguliAplicate

( )

( )

( )

( )

( ) ( )

( )

( ) ( ) înainte de aplicarea regulii după aplicarea regulii

...

...

...

... ... ...

... ...

...

... ...

( )

Programarea bazată pe reguli 78

MT7: “Faza de execuŃie”

Dacă (faza execuŃie) şi

(reguliFiltrate R REST-FILTRATE) şi (regula R PRI PREMISE ACTIUNI) şi (reguliAplicate O-LISTA-REG-APL) şi (bazaDeFapteCurenta NISTE-FAPTE)

(stivaReguliDeAplicat LISTE-REG-DE-APL) şi (stivaReguliAplicate LISTE-REG-APL) şi (stivaBazelorDeFapte LISTE-DE-FAPTE) şi

atunci execută ACTIUNI în contextul NISTE-FAPTE ce, la rândul lor, sunt transformate în

NOILE-FAPTE şi

elimină (faza selecŃie) şi

elimină (reguliFiltrate R REST-FILTRATE) şi elimină (reguliAplicate O-LISTA-REG-APL) şi elimină (bazaDeFapteCurenta NISTE-FAPTE) şi

elimină (stivaReguliDeAplicat LISTE-REG-DE-APL) şi elimină (stivaReguliAplicate LISTE-REG-APL) şi elimină (stivaBazelorDeFapte LISTE-DE-FAPTE) şi adaugă (faza filtrare) şi

adaugă (reguliFiltrate) şi

adaugă (reguliAplicate R O-LISTA-REG-APL) şi adaugă (bazaDeFapteCurenta NOILE-FAPTE) şi

adaugă (stivaReguliDeAplicat REST-FILTRATE LISTE-REG-DE- APL) şi

adaugă (stivaReguliAplicate O-LISTA-REG-APL LISTE-REG- APL) şi

adaugă (stivaBazelorDeFapte NISTE-FAPTE LISTE-DE-FAPTE) Figura 16 descrie operaŃiile necesare actualizării memoriilor de lucru şi a stivelor ce păstrează configuraŃia curentă, pentru cazul în care regula ce se execută nu este singura în lista de reguli filtrate. R, regula cea mai prioritară, aşadar cea aflată pe prima poziŃie în lista regulilor filtrate (reguliFiltrate R REST- FILTRATE), se aplică asupra faptelor din baza de fapte curente, NISTE-FAPTE, producând noua bază de fapte, NOILE-FAPTE, ce vor fi utilizate în faza următoare de filtrare. În plus, lista faptelor filtrate este resetată, pentru a pregăti această nouă fază de filtrare, iar regula R este adăugată listei regulilor aplicate în firul curent de procesare O-LISTA-REG-APL. Simultan, restul regulilor filtrate REST-FILTRATE, ce nu vor mai fi folosite pe firul curent de procesare, sunt

“împinse” în stiva de reguli de aplicat, care va deveni acum (stivaReguliDeAplicat REST-FILTRATE LISTE-REG-DE-APL).

Regimul de lucru tentativ 79

Figura 16: Faza de execuŃie în cazul mai multor reguli filtrate

După cum ştim, cele trei stive trebuie să funcŃioneze sincron în privinŃa numărului de intrări.Stiva regulilor de aplicat, a celor aplicate, ca şi stiva bazelor de fapte trebuie să facă posibilă revenirea în starea în care se găsea sistemul înainte de executarea regulii curente R, dacă, la un moment ulterior, o reluare a procesării din acest loc este necesară, simultan cu încercarea unei alte reguli din cele filtrate dar ignorate pentru moment. Ca urmare, la stiva regulilor aplicate, ce Ńine “istoria”

regulilor aplicate în firul curent de procesare, se adaugă lista regulilor aplicate înainte de execuŃia lui R, adică O-LISTA-REG-APL, iar la stiva bazelor de fapte se adaugă baza de fapte de dinaintea aplicării regulii R, respectiv NISTE-FAPTE.

Dacă R este, însă, singura regulă filtrată, atunci nici una din stive nu este incrementată. Meta-regula MT8 şi Figura 17 descriu operaŃiile corespunzătoare acestei situaŃii.

MT8: “Faza de execuŃie când stivele rămân neschimbate”

Dacă (faza execuŃie) şi (reguliFiltrate R) şi

(regula R PRI PREMISE ACTIUNI) şi

( ) R ...

( ) ...

( R ) ...

( ) ... ( ) ... ...

( ) ...

( ) ... ( ) ...

( ) ... ...

reguliFiltrate

reguliAplicate

bazaDeFapteCurenta

stivaReguliDeAplicat

stivaBazelorDeFapte stivaReguliAplicate

înainte de aplicarea regulii după aplicarea regulii

Programarea bazată pe reguli 80

(reguliAplicate O-LISTA-REG-APL) şi (bazaDeFapteCurenta NISTE-FAPTE)

(stivaReguliDeAplicat LISTE-REG-DE-APL) şi (stivaReguliAplicate LISTE-REG-APL) şi (stivaBazelorDeFapte LISTE-DE-FAPTE) şi

atunci execută ACTIUNI în contextul NISTE-FAPTE ce, la rândul lor, sunt transformate în

NOILE-FAPTE şi

elimină (faza selecŃie) şi elimină (reguliFiltrate R) şi

elimină (reguliAplicate O-LISTA-REG-APL) şi elimină (bazaDeFapteCurenta NISTE-FAPTE) şi adaugă (faza filtrare) şi

adaugă (reguliFiltrate) şi

adaugă (reguliAplicate R O-LISTA-REG-APL) şi adaugă (bazaDeFapteCurenta NOILE-FAPTE)

Figura 17: ExecuŃia în cazul unei singure reguli filtrate ( R )

( ) ...

( ) R ...

( ) ...

( ) ...

( ) ... ( ) ...

( ) ...

( ) ...

reguliFiltrate

reguliAplicate

bazaDeFapteCurenta

stivaReguliDeAplicat

stivaBazelorDeFapte stivaReguliAplicate

înainte de aplicarea regulii după aplicarea regulii

Capitolul 6

Confruntarea rapid ă de