Академический Документы
Профессиональный Документы
Культура Документы
Monografia su
SISTEMI ESPERTI
IN
PROLOG
SISTEMI ESPERTI
Utente
Interfaccia
Utente
Motore
Inferenziale
Shell
Base di
Conoscenza
Motore inferenziale
- Definire il comportamento voluto
- Delineare il processo di ragionamento
- Rispondere a domande di tipo perch
- Rispondere a domande di tipo come
Implementazione
- Gestore (main):
expert
- Procedure principali:
explore (Goal, Trace, Answer)
useranswer (Goal, Trace, Answer)
present (Answer)
PROCESSO DI RAGIONAMENTO
Per trovare una risposta R ad una domanda D (che per semplicit supponiamo
ammettere come risposte Vero o Falso), usare il primo dei seguenti principi che risulti
applicabile:
Il sistema deve interagire con l'utente sia per chiedere informazioni che non siano
5
ottenibili dalla base di conoscenza, sia per fornirgli spiegazioni sul proprio operato.
Richiesta di informazioni
Le richieste di informazioni dovrebbero essere fatte in modo tale da prevedere come
risposta un semplice si o no.
Esse dovrebbero anche essere strutturate in maniera che una risposta si faccia
continuare il sistema ad esaminare l'ipotesi corrente, mentre una risposta no causi
l'esplorazione di strade alternative.
E' possibile, all'inizio (ma non solo), presentare all'utente un questionario/menu
contenente un gruppo di domande di base o strettamente correlate fra loro, che possano
gi indirizzare il sistema verso un insieme di ipotesi piuttosto che verso un altro.
molto generiche quando una stessa domanda potrebbe essere fatta in momenti (e, quindi,
con scopi) diversi.
Una possibilit pi raffinata tenere traccia di tutto il processo di ragionamento che lega
la domanda attuale all'obiettivo originale, in modo da presentarlo come spiegazione
all'utente.
In tal caso, il sistema deve farsi carico di mantenere memoria di tutti i singoli passi di
ragionamento man mano che li esegue.
INCERTEZZA
Il Prolog ha una natura categorica, nel senso che ogni elemento del ragionamento per
lui vero o falso, senza altra possibilit.
Ci sono, per, ambiti in cui non sempre possibile fare affermazioni categoriche, ma si
pu soltanto assegnare un certo grado di probabilit ad ogni fatto o regola che sia noto.
Tale concetto di probabilit, molto spesso, non va inteso nel senso matematico del
termine, ma piuttosto, in maniera intuitiva, come "fiducia soggettiva" che si ha nella
verit di un'affermazione o nel fatto che una regola di inferenza si riveli applicabile.
Per questo, nei sistemi esperti che trattano l'incertezza, non detto che il modello
implementato sia proprio quello matematico, ed anzi ancora oggetto di disputa il fatto
che sia pi opportuno usare la teoria delle probabilit "rigorosa" o una sua versione pi
informale e semplificata.
La teoria matematica ha dalla sua una maggiore fondatezza teorica, mentre i metodi
intuitivi poggiano sulla maggiore semplicit implementativa e computazionale oltre che
sulla somiglianza a quelli effettivamente usati dall'uomo.
Per quanto riguarda i fatti, la relativa probabilit pu essere memorizzata sotto forma di
argomento aggiuntivo, mentre nelle regole si pu pensare di sfruttare un predicato
apposito, avente tale valore come argomento.
La probabilit degli elementi di conoscenza pu essere espressa tramite un numero finito
di descrittori, oppure numericamente entro una intervallo di valori prefissato, che pu
anche coincidere con il classico [0, 1].
Per quanto riguarda i meccanismi di combinazione delle probabilit fra fatti e regole, un
meccanismo molto semplice ma efficace potrebbe essere il seguente.
Denotiamo con c(X) la probabilit di una proposizione X, e supponiamo che sia un
numero reale compreso fra 0 e 1.
- Se P1 e P2 sono due fatti, con probabilit (rispettivamente) C1 e C2, allora:
c(P1 e P2) = min(c(P1),c(P2))
(significato intuitivo: se devono essere veri entrambi i fatti, allora la probabilit del risultato risentir
del pi debole)
Esiste un altro metodo per trattare l'incertezza, che, data un'ipotesi da verificare H e
dell'evidenza E raccolta per confermarla, modella la possibilit che E modifichi la
speranza in H tramite due parametri (invece che con un singolo valore di probabilit):
N = Fattore di Necessit
S = Fattore di Sufficienza
S ci dice quanto E sia sufficiente per H. Se E vero, tanto maggiore S tanto pi
probabile sar H.
N ci dice quanto E sia necessario per H. Se E falso, tanto pi basso N tanto meno
probabile sar H.
Se la probabilit di E a met strada fra la certezza e l'impossibilit, la probabilit di H
sar determinata per interpolazione fra i seguenti casi estremi:
11
- si sa che E falso
- si sa che E vero
- non si sa nulla di E.
Ogni evento H avr una probabilit a priori, che verr modificata man mano che nuova
conoscenza verr acquisita.
CICLO IBRIDO
12
Un primo tipo di controllo quello del ciclo di regole ibrido di backward e forward
chaining, pi semplice da implementare del forward puro.
Esso si ottiene trasformando ogni regola del programma nel seguente modo:
- aggiungere alla fine del corpo un letterale asserta() avente per argomento la
testa della regola stessa;
- aggiungere all'inizio del corpo un letterale not() con lo stesso argomento;
- sostituire la testa della regola con un nuovo predicato fittizio che non sia gi
stato usato dal programma (ad es., dummy).
Esempio.
Le regole
a :- b.
c :- d, e, f.
diventano, rispettivamente,
dummy :- not(a), b, asserta(a).
Poich tali regole non si richiamano mai a vicenda (nonostante l'esistenza di predicati
intermedi), necessario un main che le valuti tutte in sequenza, e ripeta tale operazione
fino al raggiungimento di una prefissata condizione di terminazione (tipicamente, la
soluzione del problema).
FORWARD CHAINING
Poich esso lavora cercando ed eliminando progressivamente i letterali dei lati sinistri
delle regole che risultino veri come fatti della base di conoscenza, opportuno
trasformare testa e corpo di ogni regola in argomenti di un predicato fittizio rule (il
corpo, ovviamente, sar tradotto in una lista), ed esprimere ogni fatto sotto forma di
argomento di un predicato fittizio fact.
Questo consente di sfruttare le procedure Prolog member e delete.
Esempio.
Le regole
a :- b,c.
diventano, rispettivamente,
rule(a, [b, c]).
Il main dovr quindi, ciclicamente: leggere un fatto, cancellarlo dal corpo di tutte le
regole che lo contengono e:
- qualora tutti i letterali del corpo siano stati cancellati
sostituire la regola con un nuovo fatto uguale alla sua testa
- o, altrimenti,
sostituire la nuova regola cos ottenuta alla precedente
fino a quando ci sia possibile.
Per evitare che un fatto usato venga ripreso in considerazione, verr eliminato non
appena usato e riasserito tramite un predicato fittizio usedfact.
Alla fine, tutte le conclusioni ottenute dalla base di conoscenze saranno sotto forma di
facts o di usedfacts.
14
EFFICIENZA
Un punto importante per il successo del sistema potrebbe rivelarsi l'efficienza, che pu
essere valutata da vari punti di vista, in corrispondenza dei quali richiede vari tipi di
soluzioni per essere raggiunta.
Meta-regole
Il Prolog usa le regole candidate in ordine di presentazione da parte del programmatore;
a volte, tuttavia, pi opportuno, sebbene ci comporti maggior perdita di tempo,
scegliere l'ordine con cui prendere in considerazione le regole in maniera pi ragionata.
Tale effetto pu essere ottenuto tramite un predicato prefer con quattro argomenti (la
15
COMMENTI E SVILUPPI
UN ESEMPIO
Vediamo l'esecuzione di un sistema esperto che cerca di capire la specie cui appartiene
un animale.
16
18
UN SISTEMA ESPERTO
PER LA DIAGNOSI DI MALATTIE DA ITTERO
Ittero presente
si
Paziente giovane?
(1)
Ittero franco
Ittero Sclerale
Febbre?
Febbre?
no
Paziente giovane?
no
Stress o digiuno
nell'ultimo periodo?
no
si
Storia di abuso
di alcool?
si
Aumento di volume
del fegato?
si
Aumento di volume
della milza?
si
Cirrosi alcolica
19
Sindrome di Gibert
Paziente giovane?
(1)
si
no
Stanchezza(Astenia)?
si
si
Disturbi dispeptici?
Dolore a livello
della coleciste?
si
si
Aumento di volume
del fegato?
Colecistite
(Colangite)
si
Epatite acuta virale
20
ittero_sclerale :- chiedi_se(occhi_gialli),
chiedi_se_non(colorito_giallo).
stress_digiuno :- chiedi_se(stress).
stress_digiuno :- chiedi_se(digiuno).
eta_medio_avanzata :- chiedi_se_non(giovane).
21
/* Motore inferenziale */
risposta_positiva(Q,A) :- affermativa(A).
risposta_positiva(Qcode,A) :- not(negativa(A)), not(affermativa(A)),
write('Rispondere si o no.'), read(A2),
retract(gia_chiesto(Qcode,A)),
asserta(gia_chiesto(Qcode,A2)), affermativa(A2).
chiedi_se_non(Q) :- not(chiedi_se(Q)).
domanda(Qcode,A) :- gia_chiesto(Qcode,A).
domanda(Qcode,A) :- not(gia_chiesto(Qcode,A)), cod_domanda(Qcode,Q),
write(Q), write('? '), read(A2),
domanda2(Q,Qcode,A2,A).
affermativa(si).
affermativa(s).
affermativa(giusto).
affermativa(ok).
affermativa(certo).
negativa(no).
negativa(n).
negativa(non).
negativa(mai).
negativa(impossibile).
24
UN SISTEMA ESPERTO
PER LA DIAGNOSI DEI GUASTI
DI UN DISPOSITIVO ELETTRICO
/* Top-level diagnosis rules */
power_problem :- askif(device_dead).
power_problem :- askif(has('knobs or switches')), askifnot(knobs_do_something).
power_problem :- askif(smell_smoke), not(heating_element).
klutz_user :- askifnot(handyperson).
klutz_user :- askifnot(familiar_appliance).
heating_element :- askif(heats).
heating_element :- askif(powerful).
25
/* Question decoding */
/* Inferential engine */
positive_answer(Q,A) :- affirmative(A).
positive_answer(Qcode,A) :- not(negative(A)), not(affirmative(A)), write('Please
answer yes or no.'), read(A2), retract(asked(Qcode,A)),
asserta(asked(Qcode,A2)), affirmative(A2).
askifnot(Q) :- not(askif(Q)).
ask(Qcode,A) :- asked(Qcode,A).
ask(Qcode,A) :- not(asked(Qcode,A)), questioncode(Qcode,Q), write(Q), write('?'),
read(A2), ask2(Q,Qcode,A2,A).
affirmative(yes).
affirmative(y).
affirmative(ye).
affirmative(right).
affirmative(ok).
affirmative(uhhuh).
negative(no).
negative(n).
negative(not).
negative(never).
negative(impossible).
negative(haha).
27