3.6 Funzioni principali di CLIPS
3.6.3 Rules
Veniamo dunque alle regole. Se i fatti, strutturati o meno, sono le parti fondamentali che costituiscono la Working Memory, allora le regole hanno la stessa valenza all’interno della Knowledge Base. Sono gli elementi essenziali della conoscenza del Sistema Esperto, che non per niente si definisce basato su un motore di regole. I procedimenti logici con cui il sistema è capace di sviluppare un processo decisionale sono stabiliti dalle regole che lo compongono. E’ comprensibile che sia assolutamente inutile consegnare a un Sistema Cognitivo una grandissima quantità di informazioni riguardo al mondo circostante se poi questo sistema non ha i mezzi, ovvero le regole, utili a elaborare queste informazioni. Sarebbe come immaginare l’esistenza di un organismo con della capacità sensoriali supersviluppate ma privo di una mente in grado di elaborarle. Non si potrebbe certo definire un organismo intelligente.
Le regole scritte in CLIPS rispettano un paradigma invariabile, sono tutte scritte in questo modo: c’è una parte, definita Left Hand Side (LHS) e un’altra denominata Right Hand Side (RHS). Nel LHS vengono elencate tutte le condizioni necessarie ad attivare la regola, quelle che precedentemente abbiamo definito anche come
antecedenti o patterns, mentre nel RHS si trovano le azioni che, esclusivamente nel
caso siano soddisfatte tutte le condizioni del LHS, verranno eseguite a tempo di esecuzione, rigorosamente nell’ordine in cui sono state scritte all’interno della regola.
La macrostruttura di una regola è dunque “if - [LHS] - then - [RHS]”.
Il comando per definire una regola è (defrule), un esempio di definizione di regole è riportato nel codice 3.8.
Le tipiche condizioni che fanno scattare una regola possono essere la presenza di un fatto, l’assenza di un fatto, ma anche una o più condizioni riguardo a uno o più fatti. Chiaramente quando si parla di “fatto” questo può trattarsi sia di un semplice
Fact, come (gradi_temperatura 21) del codice 3.2, sia di uno slot appartenente a
un Template, come (cilindrata 1600) nell’esempio del codice 3.6.
Quando il fatto in questione comprende dei valori numerici le condizioni possono essere di tipo matematico. Ad esempio la regola controlla se il numero d’interesse è maggiore, inferiore, uguale o diverso a un determinato numero, oppure compreso
3.6. FUNZIONI PRINCIPALI DI CLIPS 51
in un certo intervallo; ma l’aspetto più interessante è che, utilizzando un linguaggio naturale, oltre a calcoli matematici si possono costruire delle inferenze logiche, con la possibilità di sfruttare i tipici operatori della logica booleana.
Per quanto riguarda le azioni scritte nel Right Hand Side, queste possono consistere nell’asserzione di nuovi fatti o nella retrazione di alcuni fatti preesistenti, si può decidere di stampare una stringa o dei valori all’interno di un file o sul display, si possono caricare dei file o dei moduli di regole. Nel nostro caso sarà di particolare utilità far partire da CLIPS delle funzioni definite in C# che riescono a intervenire direttamente sui servizi di attuazione, queste azioni saranno da qui in avanti definite
CLIPS Actions e verranno trattate nel prossimo capitolo.
Si riporta un esempio in sintassi di una parte di codice in cui vengono definite alcune semplici regole:
Codice 3.8: Definire le regole.
( d e f r u l e o m b r e l l o " una r e g o l a che s t a b i l i s c e q u a n d o p o r t a r s i l ’ o m b r e l l o " ( o g g i e ’ una ? c o m e g i o r n a t a ) ( p r o b _ p i o g g i a ? p ) ( t e s t ( and ( neq ? c o m e b e l l a ) ( > ? p 0 . 7 ) ) ) = > ( a s s e r t ( p o r t a r e o m b r e l l o )) ) ( d e f r u l e s t a m p a _ m e s s a g g i o ( p o r t a r e o m b r e l l o ) = > ( p r i n t o u t t " Tra p o c o piovera ’ , p o r t i con se ’ un o m b r e l l o " c r l f ) )
Ricordando il paradigma “if - [LHS] - then - [RHS]” si può notare la corrispondenza del simbolo “=>” con il “then” della struttura. LHS è tutto ciò che viene prima di quel simbolo, mentre RHS è tutto ciò che viene dopo. Si può vedere anche che, per verificare la presenza di un fatto basta riportarlo in una linea del LHS, e che nel farlo è possibile catturare alcuni campi di quel fatto su cui si vogliono produrre delle inferenze logiche. Nell’esempio il ragionamento elementare che viene fatto è il seguente: se la giornata non è bella, e la probabilità che piova è superiore al 70%,
52 CAPITOLO 3. CLIPS: IL MOTORE DEL SISTEMA COGNITIVO
allora asserire il fatto “portare ombrello”. Nella seconda regola si scopre la sintassi
necessaria per stampare un messaggio in display (serve a questo il suffisso t, mentre crlf è semplicemente il comando per andare a capo in una nuova linea).
Salience. Abbiamo già parlato del funzionamento dell’Agenda e sottolineato l’im- portanza della distizione tra attivazione ed esecuzione di una regola (vedi 3.5.2). Una regola si attiva una volta che tutte le condizioni dell’LHS sono simultaneamente soddisfatte, viene allora posta in agenda in base alla sua priorità, e le azioni conte- nute nell’RHS vengono eseguite esclusivamente nel momento in cui viene ordinata l’esecuzione del programma (tramite il comando (run)). In quel momento le regole poste in agenda saranno lanciate esattamente nell’ordine in cui sono disposte. Quello che però non è stato ancora detto è che questa priorità può essere forzata dichiarandola esplicitamente all’interno del codice della regola. In CLIPS il valore che determina la priorità di una regola si chiama Salience e viene così dichiarata:
Codice 3.9: Dichiarare la Salience.
( d e f r u l e s t a m p a _ m e s s a g g i o ( d e c l a r e ( s a l i e n c e 1 0 0 ) ) ( p o r t a r e o m b r e l l o ) = > ( p r i n t o u t t " Tra p o c o piovera ’ , p o r t i con se ’ un o m b r e l l o " c r l f ) )
La Salience può assumere valori interi compresi tra -10000 e 10000, se non dichiarata assume valore 0. Con questa imposizione si interviene manualmente sulla disposizione delle regole all’interno dell’Agenda.
Ora, questo modo di operare potrebbe risultare assai controproducente e soprat- tutto scorretto da un punto di vista concettuale. Definire forzatamente una sequenza di esecuzione delle regole riporterebbe infatti il sistema ad una struttura prettamente procedurale, il che renderebbe piuttosto insensata l’idea iniziale di sviluppare il sistema attraverso un motore di regole, poiché sarebbe imprigionato in una sequenza che lo spoglierebbe di tutta la flessibilità di cui dispone.
Un classico esempio di cattiva programmazione è proprio quello riportato nel codice 3.9. Infatti, imponendo una priorità 100 alla regola di stampa del messaggio, il sistema si troverebbe a interrogarsi sulla presenza del fatto (portare ombrello)
3.7. CONFLICT RESOLUTION STRATEGY 53
prima ancora di produrre il ragionamento logico che ha il compito di asserire il fatto stesso.
Invece, un utilizzo interessante della Salience è quello finalizzato alla creazione di strati di regole a pari priorità. Questo è realizzabile dichiarando lo stesso valore della Salience nella definizione di un certo numero di regole, al fine di costruire degli strati costituiti da insiemi di regole a pari salienza. Il sistema così eseguirà prima un blocco di regole per passare poi a quello successivo, caratterizzato da priorità inferiore, ma saranno sfruttate in ogni strato tutte le potenzialità dell’Inference
Engine e la potente gestione dei conflitti che contraddistiguono il software che stiamo
utilizzando.