SISTEMA ESPERTO PER LA DIAGNOSI DELLE MALATTIE … · 1.3 Il ragionamento incerto ... È opportuno...

62
FACOLTA’ DI SCIENZE MATEMATICHE, FISICHE E NATURALI DIPARTIMENTO DI INFORMATICA CORSO DI LAUREA MAGISTRALE IN INFORMATICA ESAME DI “INTELLIGENZA ARTIFICIALE” SISTEMA ESPERTO PER LA DIAGNOSI DELLE MALATTIE DEL FEGATO E DELLE VIE BILIARI CON GESTIONE DELL’INCERTEZZA Docenti: Prof.ssa Floriana ESPOSITO Prof. Stefano FERILLI Studente: Francesco PAPARELLA Anno Accademico 2009/2010 UNIVERSITÀ DEGLI STUDI DI BARI “ALDO MORO”

Transcript of SISTEMA ESPERTO PER LA DIAGNOSI DELLE MALATTIE … · 1.3 Il ragionamento incerto ... È opportuno...

FACOLTA’ DI SCIENZE MATEMATICHE, FISICHE E NATURALI

DIPARTIMENTO DI INFORMATICA

CORSO DI LAUREA MAGISTRALE IN INFORMATICA

ESAME DI

“INTELLIGENZA ARTIFICIALE”

SISTEMA ESPERTO PER LA DIAGNOSI

DELLE MALATTIE DEL FEGATO E

DELLE VIE BILIARI CON GESTIONE

DELL’INCERTEZZA

Docenti:Prof.ssa Floriana ESPOSITOProf. Stefano FERILLI

Studente:Francesco PAPARELLA

Anno Accademico 2009/2010

UNIVERSITÀ DEGLISTUDI DI BARI“ALDO MORO”

INDICE

CAPITOLO 1.

INTRODUZIONE............................................................................................................. 1

1.1 I sistemi esperti........................................................................................................21.2 Prolog ......................................................................................................................4

1.2.1 Regole di ricerca...........................................................................................61.2.2 Rappresentare la conoscenza nei sistemi esperti..........................................7

1.3 Il ragionamento incerto............................................................................................8

CAPITOLO 2.SISTEMA ESPERTO PER LE MALATTIE DEL FEGATO EDELLE VIE BILIARI.....................................................................................................10

2.1 Introduzione.............................................................................................................112.1.1 MYCIN.......................................................................................................112.1.2 Determinazione del livello di certezza delle premesse..............................122.1.3 Combinare il livello di certezza delle premesse e delle conseguenze........12

2.2 Capacità del sistema................................................................................................132.3 Progettazione ...........................................................................................................13

2.3.1 Identificazione............................................................................................142.3.2 Concettualizzazione....................................................................................23

2.4 Formalizzazione e implementazione........................................................................312.4.1 Strumenti utilizzati.....................................................................................312.4.2 Architettura del sistema..............................................................................312.4.3 Base di conoscenza.....................................................................................322.4.4 Motore inferenziale....................................................................................362.4.5 Caratteristiche aggiunte..............................................................................442.4.6 Aggiornamento della conoscenza...............................................................47

CAPITOLO 3.

FUNZIONAMENTO DEL SISTEMA...........................................................................48

3.1 Avvio ......................................................................................................................493.2 Interfaccia utente.....................................................................................................493.3 Esempio di interazione con il sistema.....................................................................51

BIBLIOGRAFIA E SITOGRAFIA................................................................................65

CAPITOLO 1

INTRODUZIONE

Il sistema esperto realizzato permette di effettuare la diagnosi di alcune malattie del fegato e delle

vie biliari. L’utente che utilizzerà il sistema si troverà di fronte ad un vero e proprio medico che lo

aiuterà nella diagnosi della malattia.

Al termine della diagnosi è possibile ottenere ulteriori informazioni sulla malattia, ed inoltre viene

consigliata la terapia da seguire.

Lo scenario d’uso tipico del sistema esperto è il seguente: il sistema cerca di diagnosticare la

malattia sottoponendo al paziente alcune domande, effettua una descrizione della malattia e delle

relative cause e fornisce la terapia da seguire per poterla curare.

Il documento presenta una dissertazione tecnica relativa alla realizzazione di un sistema esperto in

un ambiente di programmazione logica. Il suo scopo è quello di illustrare tutte le assunzioni

effettuate in fase di progettazione ed i comportamenti che il sistema esperto esibisce in funzione

delle scelte di sviluppo.

Iniziamo con il dare la definizione di sistema esperto, di quali parti esso si compone e quali sono le

sue caratteristiche fondamentali.

1.1 SISTEMI ESPERTI

Un sistema esperto è un programma che cerca di riprodurre le prestazioni di una o più persone

esperte in un determinato campo di attività, e rappresenta una delle molteplici applicazioni

dell'intelligenza artificiale.

I sistemi esperti si differenziano da altri programmi simili, in quanto, facendo riferimento a

tecnologie elaborate in funzione dell'intelligenza artificiale, sono sempre in grado di esibire i

passaggi logici che sono alla base delle loro decisioni, cosa che non è attuabile da parte della mente

umana.

Un sistema esperto si compone di tre parti fondamentali:

1. base di conoscenza: rappresentazione in forma dichiarativa dell’esperienza del sistema. Una

regola di produzione, presente nella base di conoscenza, ha la seguente forma: se x allora y,

dove x e y sono stringhe di caratteri. Le frasi comprese fra se e allora si chiamano

antecedenti, mentre quelle che appaiono dopo si chiamano conseguenti.

Quando in una regola sono presenti più antecedenti, separati da una virgola, questi si intendono concatenati da

una "e", mentre nel caso in cui hanno lo stesso conseguente, significa che i rispettivi antecedenti sono

concatenati da una "o". Se il conseguente di una regola è uguale all'antecedente di un'altra regola, queste si

intendono concatenate da una deduzione.

Inoltre è possibile modificare una regola o aggiungerne altre senza dover conoscere le restanti, poiché le regole

sono indipendenti l’una dall'altra. Questo costituisce un enorme vantaggio, soprattutto quando il numero di

regole è elevato;

2. motore inferenziale: è un programma costituito da un interprete che decide quale regola applicare per poter

aumentare la base di conoscenza e da uno schedulatore che organizza le regole da sviluppare e il loro ordine di

esecuzione. Il compito del motore inferenziale è estrarre le regole utili alla soluzione del problema secondo un

meccanismo di riconoscimento e attivazione delle stesse. Esso esegue prima un esame delle regole presenti

nella base di conoscenza, successivamente seleziona la regola più appropriata, la esegue e registra nella

memoria di lavoro l'azione. Questo processo viene ripetuto fino a quando non si trova la possibile soluzione;

3. interfaccia utente: parte che si occupa di agevolare l’interazione tra l’utente ed il sistema.

I sistemi esperti si suddividono in due categorie principali:

2 sistemi esperti basati su regole: sono dei programmi composti da regole nella forma “IF

condizione THEN azione (se condizione allora azione)”. Dati una serie di fatti, i sistemi esperti,

grazie alle regole di cui sono composti, riescono a dedurre nuovi fatti. Ad esempio, supponiamo

di avere un problema di salute, forniamo al sistema esperto i seguenti fatti: ho mal di testa -

sono raffreddato - la temperatura corporea è di 38 °C. Il sistema esperto assume i fatti e sceglie

una regola così formata: IF ((mal di testa) AND (raffreddore) AND (temperatura = 38)) THEN

(Il suo problema è INFLUENZA);

3 sistemi esperti basati su alberi: dato un insieme di dati ed alcune deduzioni, il sistema crea un

albero che classifica i vari dati. I nuovi dati vengono analizzati dall'albero e il nodo di arrivo

rappresenta la deduzione.

È opportuno chiarire i ruoli degli attori che interagiscono con un sistema esperto:

Fig. 1 – Attori che interagiscono con il sistema esperto

a) esperto di dominio: ovvero la persona che detiene la conoscenza del dominio e che è in

grado di risolvere il problema in oggetto; b) ingegnere della conoscenza: persona addetta alla codifica della conoscenza fornita

dell’esperto di dominio in una forma comprensibile al sistema esperto;c) utente: colui che consulta il sistema esperto per ottenere consigli, come se stesse

consultando direttamente l’esperto di dominio.

1.2 PROLOG

Il Prolog (PROgramming LOGic) è stato progettato ed implementato a Marsiglia ad opera di

Colmerauer e Roussel nel 1972. Esso si basa sul principio di risoluzione di Robinson e sulla

interpretazione data da Kowalski relativa alla logica dichiarativa, che viene definita come un

insieme di istruzioni procedurali per un calcolatore.

L’idea generale alla base dei linguaggi dichiarativi è quella di descrivere una situazione. Sulla base

di questo codice, l’interprete o il compilatore calcolerà una soluzione. Nel caso del Prolog, ci dirà se

una frase sia vera oppure no, se contiene variabili e con quali valori devono essere avvalorate.

Un programma Prolog è composto da due elementi:

1. fatti;2. regole.

L’insieme di questi due elementi forma la base di conoscenza o “knowledge base”, e viene

operativamente redatta con l’utilizzo di un apposito editor di testo. Dal punto di vista della logica

dell’ordine, i fatti costituiscono le verità non dimostrabili (assiomi), mentre le regole consentono di

ottenere nuovi teoremi a partire dai teoremi preesistenti o da assiomi.

I fatti vengono descritti attraverso la seguente sintassi:

predicato(oggetto1,oggetto2,...,oggetto-n).

ad esempio nella forma:

genitore(mario, carlo).

genitore(carlo giuseppe).

figlio(Y,X) :- genitore(X,Y).

Essi vengono scritti senza la freccia di implicazione e terminano sempre con il punto. Nelle regole

la testa (parte sinistra) ed il corpo (parte destra) sono unite tramite il simbolo ":-". Un eventuale

punto e virgola (;) all'interno del corpo di una regola rappresenta la disgiunzione, mentre una

eventuale virgola (,) rappresenta la congiunzione. Anche le regole terminano sempre con il punto.

Gli obiettivi sono clausole senza testa, in cui al posto della freccia d'implicazione iniziale è presente

il simbolo "?-".

Il Prolog risponde alle domande (soddisfa gli obiettivi) tramite l’utilizzo del principio di risoluzione

e tenta di derivare la clausola vuota a partire dalle ipotesi (fatti e regole).

Infine il Prolog fornisce una risposta nel caso di refutazione, altrimenti risponde "no".

1.2.1 REGOLE DI RICERCA

Una regola di ricerca è una strategia che consente di ricercare negli alberi di deduzione i rami di

successo.

La regola di ricerca utilizzata dal Prolog, combina la selezione della chiamata procedurale più a

sinistra con la ricerca in profondità. Questa regola di ricerca viene implementata attraverso una

"pila" di obiettivi.

Una pila è definita come una struttura dati i cui elementi sono sistemati uno sopra l'altro e a cui si

può accedere attraverso due operazioni:

a) push: permette di inserire un elemento in cima alla pila; b) pop: permette l’estrazione dell'elemento posto in cima alla pila.

Una istanza della pila di obiettivi rappresenta il ramo che si sta considerando ed il calcolo diventa

una sequenza di operazioni push e pop sulla pila.

Una operazione di push si ha quando la chiamata procedurale selezionata nel primo obiettivo della

pila viene unificata con successo con la testa di una clausola del programma. Il risultato

dell’operazione viene inserito all’interno della pila.

Un’operazione di pop si ha quando non ci sono più clausole nel programma la cui testa si possa

unificare con la chiamata procedurale del primo obiettivo della pila. Questo obiettivo viene rimosso

mediante un’operazione di pop e si prende in considerazione il prossimo obiettivo della pila.

La ricerca in profondità può anche essere vista come una regola che specifica l’ordine in cui devono

essere esaminate le clausole del programma. In un ambiente di programmazione logica, l'ordine

delle clausole è fisso, e questo facilita l'implementazione, ma allo stesso tempo ha lo svantaggio del

medesimo ordine di esecuzione delle clausole.

Per gli alberi infiniti si utilizza una regola di ricerca che esegue una ricerca in ampiezza, ma questa

non risulta essere compatibile con una implementazione efficiente.

1.2.2 RAPPRESENTARE LA CONOSCENZA NEI SISTEMI ESPERTI

Nella progettazione di un sistema esperto, uno dei punti principali è la rappresentazione della

conoscenza. Essa è indipendente dalle funzionalità del sistema.

Per rappresentazione della conoscenza si intende la scelta del linguaggio di rappresentazione e la

definizione di architetture in cui sia esplicita la base di conoscenza, che sarà composta da

espressioni nel linguaggio scelto. Il fatto che il sistema debba presentare un comportamento

intelligente, pone delle condizioni sulla rappresentazione della conoscenza. Infatti il luogo unico in

cui il sistema agisce è il mondo reale, ed esso implica una connessione tra la conoscenza del sistema

e il mondo reale. Rispetto a ciò troviamo due posizioni: la prima vede tale connessione come una

mappa fra il mondo reale e la rappresentazione, e di conseguenza si ipotizza che il mondo reale

ammetta una descrizione in qualsiasi linguaggio; mentre la seconda delega a chi studia la

percezione e gli organi motori la trasformazione degli stimoli provenienti dal mondo reale in

descrizioni.

Nei sistemi esperti si richiede che la conoscenza sia rappresentata in modo tale da avere una

descrizione esplicita del dominio, che consente di estendere e modificare il sistema, in modo tale

che il motore inferenziale riesca ad inferire nuove conclusioni attraverso la manipolazione della

struttura.

La conoscenza è costituita dagli oggetti e dalle proprietà che li descrivono. Essi sono descritti

tramite frasi del tipo: Bob is Jim’s child , Jim is Mark’s child e The grandchild of a person is a child

of a child of this person.

In particolare, le frasi dichiarative forniscono due tipi di conoscenze :

a) fatti: affermano l’esistenza di una relazione fra due individui;b) regole: affermano l’esistenza di una relazione fra due individui purché sussista qualche altra

relazione.

Lo scopo principale di un sistema basato su conoscenza è quello di esaminare un insieme di frasi

dichiarative e fornire delle conclusioni (nuovi fatti sul mondo).

Le frasi dichiarative, per poter essere utilizzate da un calcolatore, devono essere rappresentate

tramite una sintassi formale.

Una soluzione a tale problema è data dall’utilizzo della logica dei predicati, ed in particolare dalle

clausole di Horn.

Attraverso l’utilizzo delle clausole di Horn le frasi dichiarative riportate come esempio

precedentemente, possono essere rappresentate nel seguente modo:

• child(bob, jim);• child(jim, mark);• child(bob, jim), child(jim, mark) grandchild(bob, mark)

La rappresentazione degli eventi comprende:

a) una conoscenza specifica su come fare qualcosa; b) una conoscenza (meta-conoscenza) relativa alle caratteristiche della conoscenza e le

modalità con cui vengono svolte alcune attività.

Per passare da una visione della conoscenza come archivio, banca dati, ad una visione come base

per avere un comportamento intelligente, occorre definirne le modalità d’uso. Tali modalità possono

raggrupparsi in :

o acquisizione: apprendimento, aggiornamento, quindi capacità di mettere in relazione il

nuovo con qualcosa di già noto, classificazione della conoscenza al fine di renderne più

agevole il reperimento;o reperimento: comprende

linking: legami fra parti della conoscenza correlate tra di loro per particolari attività; lumping: raggruppamento di elementi della conoscenza che di solito vengono

utilizzati insieme;o inferenza: meccanismi per rendere esplicita la conoscenza implicita: deduzione, induzione

abduzione, uso di meta-conoscenza.

1.3 IL RAGIONAMENTO INCERTO

Uno dei limiti del Prolog è costituito dall’utilizzo di una logica a due valori (0,1): ogni fatto

rappresentato può essere vero oppure falso. In altri termini, non è possibile dichiarare con assoluta

certezza la verità di un fatto oppure la sua categorica falsità. Un fatto può essere vero, falso ma

anche incerto. La necessità di gestire l’incertezza è più o meno evidente a seconda dei contesti

d’uso del sistema.

Nel campo dei sistemi di diagnosi medica, per esempio, il suggerimento dell’esperto di dominio non

è mai definitivo, circa la relazione tra sintomi e malattia. A testimonianza di ciò si noti che un buon

medico propone sempre diverse possibili diagnosi al proprio paziente.

L’esigenza di una logica meno rigida si rese necessaria fin dai tempi di Cartesio, il quale affermò

l’esistenza di una logica che non si basasse sulla verità o falsità assoluta di una asserzione.

Attualmente la formalizzazione più convincente e famosa si deve a Lotfi Za-deh ed è nota con il

nome di logica fuzzy o sfocata.

CAPITOLO 2

SISTEMA ESPERTO PER

LA DIAGNOSI DELLE

MALATTIE DEL FEGATO

E DELLE VIE BILIARI

2.1 INTRODUZIONE

Nel sistema esperto in oggetto, l’ingegnere della conoscenza deve esprimere un valore di certezza

sia sui fatti e sia sulle regole. Questo valore di certezza è un numero che può assumere solamente

valori compresi tra 0 e 1 ed appartenenti al dominio dei numeri reali:

valore_di_certezza ∈R , 0 ≤ valore_di_certezza ≤ 1

Se abbiamo un valore di certezza pari a 0, vuol dire che l’utente è completamente incerto sulla

verità di un singolo fatto, mentre un valore di certezza pari ad 1 indica che l’utente è assolutamente

certo del fatto.

Nella base di conoscenza è possibile attribuire a ciascun fatto un valore di certezza, il quale esprime

il grado di certezza del fatto asserito dall’utente. Questo valore di certezza si può associare anche

alle regole, ed indicherà il livello di certezza attribuito, partendo da fatti completamente veri per

arrivare al fatto dedotto utilizzando la regola stessa. Ad esempio, consideriamo una regola definita

nel seguente modo:

(batteria_guasta⇐ luci_spente) # 0.5

Essa ci dice che nel caso in cui sarà verificata la condizione “ luci_spente” anche la condizione

“batteria_guasta” sarà soddisfatta ed avrà un valore di certezza pari a 0.5.

Si può affermare, che i valori di certezza non esprimono probabilità, ma forniscono un’idea

numericamente intuitiva dell’attendibilità di un fatto e/o di una regola.

2.1.1 MYCIN

MYCIN è un sistema esperto progettato per identificare i batteri che causano infezioni gravi, come

la batteriemia e la meningite, e di raccomandare gli antibiotici con la relativa dose in base al peso

corporeo del paziente. Il suo nome deriva dagli stessi antibiotici, infatti molti antibiotici hanno il

suffisso "-mycin". Il sistema MYCIN è stato utilizzato anche per la diagnosi delle malattie della

coagulazione del sangue.

Esso è in grado di interrogare l’utente con delle domande e calcolare automaticamente il valore di

certezza delle risposte. Questo calcolo è stato creato per propagare i fattori di certezza in modo che i

risultati appaiano tutto sommato corretti per un essere umano.

L’altro metodo per introdurre valori di certezza è quello di inserirli direttamente all’interno delle

regole presenti nella base di conoscenza. Questo metodo può essere utilizzato solamente

dall’ingegnere della conoscenza, il quale la formalizza all’interno del sistema.

2.1.2 DETERMINAZIONE DEL LIVELLO DI CERTEZZA DELLE

PREMESSE

Le premesse di un regola possono non essere assolutamente certe, ed è necessario determinare il

valore della certezza della premessa di una regola.Nel sistema esperto realizzato, esso è stato calcolato utilizzando la media aritmetica.Riportiamo qui di seguito un esempio (riprende l’esempio del paragrafo 2.1): sia data la seguente

regola:

(batteria_guasta⇐luci_spente#0.6, radio_spenta#0.4)#0.8

il valore di certezza è calcolato tramite la media aritmetica dei valori di certezza associati alle due

premesse della regola (0.6 + 0.4) = 1.0/2 = 0.5

2.1.3 COMBINAZIONE DEL LIVELLO DI CERTEZZA DELLE PREMESSE

E DELLE CONSEGUENZE

Un altro problema è rappresentato dal calcolo del valore di certezza della parte conseguente della

regola, ad esempio nell’esempio riportato nel paragrafo 2.1.2 il valore di certezza del fattore

“batteria_guasta”.

Il metodo utilizzato consiste nel moltiplicare tra loro i due valori di certezza. Si moltiplica il valore

di certezza globale delle premesse (indicato dall’ingegnere delle conoscenza) con il valore di

certezza delle premesse (ottenuto con la media aritmetica): certezza_batteria_guasta - 0.8 (valore

di certezza globale) ∗ 0.5 (valore di certezza ottenuto come risultato della media aritmetica) = 0.40.

2.2 CAPACITÀ DEL SISTEMA

Il sistema esperto realizzato imita il comportamento di un esperto (medico) che interroga l’utente

chiedendogli delle informazioni relative alla malattia da diagnosticare.

L’utente risponde alle domande indicando, oltre alla risposta, anche il valore di certezza.

Dopo aver sottoposto all’utente una serie di domande, il sistema è in grado di diagnosticare la

tipologia di malattia ed il relativo livello di certezza.

Infine il numero e l’ordine delle domande che vengono poste all’utente sono influenzate dalle

risposte che esso via via fornisce.

2.3 PROGETTAZIONE

Le fasi principali della progettazione di un sistema esperto sono le seguenti:

1) identificazione: è la fase di acquisizione della conoscenza e rappresenta la fase più

complessa dello sviluppo di un sistema esperto poiché si basa sullo scambio di informazioni

tra due o più persone di cultura ed esperienze diverse. Grazie a questa analisi si è arrivati a

capire quale fosse la strategia da adottare per l’acquisizione e la gestione della conoscenza;2) concettualizzazione: consiste nell’individuazione degli oggetti, dei concetti e delle relazioni

dopo aver consultato l’esperto, manuali e siti web;3) formalizzazione: consiste nell’organizzazione della conoscenza acquisita secondo i

formalismi scelti per la rappresentazione;4) realizzazione: implementazione del sistema attraverso l’utilizzo del linguaggio PROLOG; 5) test del sistema realizzato.

Tutte le fasi sono strettamente correlate tra di loro, infatti si è reso necessario un continuo processo

di revisione del sistema, di riformulazione dei concetti e di riprogettazione della conoscenza.

Di seguito verranno analizzate in dettaglio ognuna delle singole fasi.

2.3.1 IDENTIFICAZIONE

Come già accennato in precedenza, il sistema esperto in oggetto, ha il compito di diagnosticare se

un paziente è affetto o meno da una delle malattie del fegato o delle vie biliari:

o Cirrosi epatica;o Epatomegalia;o Fegato grasso;o Epatite;o Colelitiasi;o ecc..

Per poter avere informazioni utili alla realizzazione del sistema ed in modo particolare per la

realizzazione della base di conoscenza, mi sono rivolto ad un esperto del settore (medico

specializzato in malattie del fegato), il quale mi ha illustrato in modo dettagliato come avviene un

colloquio col paziente affinché si possa effettuare una prima diagnosi della malattia.

Qui di seguito riportiamo un breve esempio di colloquio tra il paziente ed il medico:

Medico: Ha notato una alterazione della cute e delle sclere?

Paziente: Si

Medico: Ha accusato nausea in questi ultimi giorni?

Paziente: No.

Medico: Ha vomito?

Paziente: Si.

Medico: Ha notato se le urine presentano un colore scuro?

Paziente: No.

Medico: Ha mai sofferto di emolisi?

Paziente: Si.

Medico: Dai sintomi riscontrati si può diagnosticare la presenza di ittero in forma lieve. Per curare

la malattia deve evitare il consumo di alcol o bere con particolare moderazione.

Inoltre l’esperto mi ha suggerito di consultare sia dei siti web e sia dei testi inerenti l’argomento in

modo da avere un quadro più completo delle malattie del fegato e delle vie biliari.

Ovviamente il mio lavoro si è soffermato soltanto sullo studio di alcune malattie riguardanti il

fegato e le vie biliari in modo da raccogliere tutte le informazioni rilevanti per la costruzione della

base di conoscenza del sistema esperto realizzato.

Qui di seguito riportiamo le descrizioni testuali relative alle malattie prese in considerazione nel

sistema esperto e che sono il frutto dell’analisi delle informazioni fornite dal medico e della

consultazione di testi e siti web (in rosso sono evidenziati i sintomi generali e specifici di ciascuna

malattia, mentre in grassetto sono evidenziati il nome della malattia generica e il nome della

malattia specifica)

PRIMA MALATTIA - Ittero: è una condizione caratterizzata dalla comparsa di un colorito giallo

visibile principalmente sulla pelle e nelle sclere (la parte bianca dell’occhio), ma anche sulle unghie

e la lingua. Il colore giallo è dovuto alla presenza nel sangue di quantità' eccessive di bilirubina, un

pigmento che si forma anche in condizioni normali come prodotto di scarto del processo di

distruzione dei globuli rossi invecchiati. Gran parte della bilirubina passa attraverso il fegato dove

subisce alcune trasformazioni, e viene poi veicolata attraverso la bile nell’intestino. Nell’intestino

la bilirubina viene in parte eliminata con le feci e in parte riassorbita nel sangue.

I sintomi sono: colorazione gialla della cute e sclere, nausea, vomito, urine scure.

Abbiamo 2 tipologie:

a) ittero lieve: è osservabile esaminando le sclere alla luce naturale, è di solito evidenziabile

quando i valori della bilirubina sierica sono compresi tra 2,5 - 3 mg/dl;Sintomi: emolisi oppure sindrome di Gilbert

b) ittero grave: è provocato dalla colestasi, ovvero da un rallentamento o addirittura da un

blocco del flusso biliare. La produzione di bilirubina avviene normalmente e si ha la sua

trasformazione in bile, ma il suo normale flusso viene ostacolato. Questa situazione provoca

una sintomatologia che si accompagna alla tipica colorazione giallastra di cute, sclere e

mucose.Sintomi: malattia epatica, ascite, alterazioni endocrine oppure malattia biliare, ascite,

alterazioni endocrine

SECONDA MALATTIA - Epatomegalia: è il gonfiore del fegato al di là delle sue dimensioni

normali. Se sia il fegato e la milza sono allargati, questa condizione è chiamata epatosplenomegalia.

Il bordo inferiore del fegato arriva normalmente appena sotto il bordo inferiore della costola

(margine costale) sul lato destro. Nel suo stato normale, il bordo del fegato è sottile e fermo, e non

si riesce a sentire premendo un dito al di sotto del bordo delle costole. Essa può essere considerata

allargata se un medico può sentirlo al semplice tatto.

I sintomi generali sono: dolori al fegato, dolori addominali, epatite A, alcool, mentre i sintomi

specifici: aumento dimensioni fegato, affaticamento, alterazione cute e occhi.

TERZA MALATTIA - Fegato grasso: definita anche come la malattia del benessere, la steatosi

epatica, più comunemente definita come fegato grasso (intossicato), ed è una patologia oggi molto

diffusa. La causa è spesso da ricercare nella cattiva alimentazione, soprattutto legata a pasti veloci e

fugaci che la vita quotidiana, sempre più frenetica, oggi ci impone, che quindi genera cattive

digestioni e quindi sangue carico di tossine (grassi, batteri, molecole tossiche, ecc.) che il fegato

non filtra né metabolizza e quindi accumula al suo interno ed al suo esterno. I sintomi sono:

diabete, dieta squilibrata, alcool.

Abbiamo2 tipologie:

a) fegato grasso non alcolico: è una malattia del fegato che spesso rimane silente ed

assomiglia molto alla cirrosi epatica, ma colpisce pazienti astemi o quasi astemi. La

caratteristica principale della steatoepatite non alcolica è l’accumulo di grasso (lipidi) nel

fegato, accompagnato da infiammazione e lesioni epatiche. La maggior parte dei pazienti

colpiti dalla steatoepatite non alcolica non presenta sintomi e quindi non sa di avere un

problema al fegato, tuttavia questa patologia può portare all’epatopatia alcolica, cioè a una

situazione in cui il fegato subisce lesioni permanenti e non è più in grado di funzionare

correttamente;Sintomi: intervento bypass oppure assunzione farmaci.

b) fegato grasso microvescicolare: il grasso si accumula sotto forma di piccole gocce

distribuite attorno al nucleo dell''epatocita localizzato centralmente. Le cause di steatosi

microvescicolare sono rappresentate da: sindrome di Reye, degenerazione, grassa acuta del

fegato in gravidanza, farmaci come tetraciclina, acido valproico, cortisonici, metotrexate,

amiodarone, estrogeni.Sintomi: vomito, nausea, ittero oppure affaticamento, ipoglicemia, coagulazione.

QUARTA MALATTIA - Epatite alcolica: comprende la degenerazione del grasso e l''insorgenza di

necrosi (un tipo particolare di morte cellulare) e di infiammazione. Le manifestazioni cliniche

possono comprendere: astenia, febbre, ittero, dolore addominale, ostruzione delle vie biliari. La

cirrosi, infine, rappresenta lo stadio terminale della malattia. Dal punto di vista dei sintomi, la

cirrosi può assumere le caratteristiche di una epatite alcolica o presentare complicanze come

l’ipertensione portale con ingrossamento del fegato oppure insorgenza di carcinoma epatico.

I sintomi generali sono: anoressia, perdita peso, febbre, dolore epigastrio, dolore ipocondrio,

mentre i sintomi specifici sono: astenia, ittero, soffio epatico oppure ascite, encefalopatia,

emorragia digestiva.

QUINTA MALATTIA - Cirrosi epatica: è una malattia cronica caratterizzata dalla degenerazione e

dall''indurimento delle cellule del fegato. La cicatrizzazione del tessuto epatico, che può derivare da

alcolismo, denutrizione, epatite virale, infiammazione cronica od ostruzione di alcuni condotti del

fegato, impedisce il corretto funzionamento epatico. La cirrosi dovuta all’alcool può essere fermata

se diagnosticata precocemente e se viene sospeso il consumo di alcool. I farmaci che possono

causare la cirrosi sono quelli usati per il trattamento dell’ipertensione, la tubercolosi, il morbo di

Parkinson e il cancro.

I sintomi generali sono: fiacca, dispepsia, gonfiore addominale, prurito, mentre i sintomi

specifici sono: ipotrofia muscolare, sanguinamento bocca, sonnolenza oppure sanguinamento

ano, feci nere, ecchimosi.

SESTA MALATTIA - Cirrosi biliare primitiva: è una malattia cronica del fegato caratterizzata da

una infiammazione e progressiva distruzione dei dotti biliari che si trovano all’interno del fegato (I

dotti biliari sono piccoli canali dove scorre la bile). La conseguenza di tali alterazioni sono la

riduzione nella produzione ed escrezione della bile e quindi l’accumulo nel fegato e nel sangue di

sostanze (acidi biliari, bilirubina, colesterolo) che sono normalmente eliminate dalla bile stessa. In

particolare l’accumulo di acidi biliari favorisce la perpetuazione dell’infiammazione che porta alla

formazione del tessuto fibroso nel fegato e, in alcuni casi, all’evoluzione in cirrosi, che rappresenta

lo stadio più avanzato della malattia.

I sintomi generali sono: stanchezza, depressione, dolore addome, prurito, mentre i sintomi

specifici sono: aumento dimensioni fegato, deformità dita oppure osteoporosi, presenza di

sangue nel vomito.

SETTIMA MALATTIA - Epatite: processo infiammatorio del fegato caratterizzato da una necrosi

diffusa o parcellare che colpisce tutti i lobuli.

I sintomi sono: anoressia, malessere, vomito, febbre.

Abbiamo 3 tipologie:

a) A: l'epatite A è detta anche epatite alimentare, perché si contrae anche con l'ingestione di

alimenti infetti. Si tratta di una delle forme benigne in quanto con la somministrazione

tempestiva di immunoglobuline si ha una guarigione completa. Inoltre il virus viene

inattivato dalla bollitura in acqua, dall'immersione in formalina per tempi prolungati e dai

raggi ultravioletti. Esiste anche il vaccino rivelatosi molto efficace.Sintomi: astenia, indisposizione generale, dolore fianco oppure ittero, prurito, urine

scure.

b) B: l’epatite B è la più diffusa al mondo e la sua evoluzione può portare alla guarigione o

alla cronicizzazione, con conseguente danno irreversibile al fegato (cirrosi). Il virus

dell'epatite B è reso inattivo dal calore, dalla candeggina e dalla formaldeide. È presente nei

liquidi corporei (sangue, saliva, sperma e secrezioni vaginali. Il contagio avviene attraverso

il sangue infetto (siringhe, strumenti chirurgici, tatuaggi, piercing, ecc.).

Sintomi: alterazione cute, affaticamento, dolore ipocondrio oppure prurito, feci chiare,

urine scure oppure transaminasi, bilirubina.

c) C: l’epatite C è spesso asintomatica, in quanto l''ammalato può lamentare solo stanchezza e

un calo di peso (per questo è detta epatite silenziosa). A differenza dell''epatite B, il

contagio tramite rapporti sessuali è meno probabile, ma evolve più facilmente verso la forma

cronica. 'Il virus è inattivato dal calore e da alcuni solventi chimici.Sintomi: dolori articolazioni, dolori muscoli, dolore fegato oppure mancanza appetito,

ittero, stanchezza.

OTTAVA MALATTIA - Colelitiasi: formazione o presenza di calcoli nella colicisti.

I sintomi sono: dolore addome, dispepsia, dolore spalla.

Abbiamo 2 tipologie:

a) colica biliare: è un forte dolore localizzato nella porzione superiore destra dell’addome,

spesso esteso anche alla base dello sterno, alla scapola ed alla spalla destra. Generalmente,

una colica biliare è accompagnata da nausea, vomito e presenza di grosse quantità di gas

nello stomaco e nell''intestino (flatulenza). Può aversi anche aumento della temperatura

corporea. La colica biliare può essere associata ad una colangite (che è una infiammazione

delle vie biliari di origine batterica dovuta a calcoli o tumori delle vie biliari), ad una

coledocolitiasi (che è la presenza di calcoli nel coledoco, il canale che porta la bile

all''intestino) o ad una pancreatite (infiammazione del pancreas). In ogni caso, si ha un

blocco del dotto cistico (il canale che va dalla colecisti al coledoco), al quale l''organismo

reagisce con la contrazione della colecisti.Sintomi: dolore progressivo che si riduce, dura diverse ore e si riduce a nausea e

vomito.

b) colica colecistica: la calcolosi colecistica può rimanere silente per molti anni o provocare

sintomi aspecifici come difficoltà digestive, specie per i cibi piccanti e i fritti, cefalea,

nausea, vaghi disturbi intestinali. Sintomi: Il sintomo principale è invece rappresentato dalla colica biliare che compare

d’improvviso, generalmente dopo un pasto abbondante e ricco di grassi, ed è a volte

accompagnata da nausea, vomito, febbre, colorazione scura delle urine. Il dolore,

violentissimo, è localizzato il più delle volte al di sotto dello sterno e da qui si irradia verso

il fianco e la spalla di destra o, più raramente, verso la schiena; può durare da 30 minuti a 12

ore. Un sintomo particolare è l’ittero, cioè la colorazione gialla della cute e delle sclere, che

si manifesta quando la bile non può defluire e si accumula nel fegato, da cui viene

riassorbita passando in grande quantità nella circolazione del sangue.

NONA MALATTIA - Colecistite acuta: è una infiammazione della cistifellea, di solito provocata da

un calcolo biliare che ostruisce il dotto cistico; quest’ultimo è' un canale che unisce la cistifellea con

il coledoco, tra i pasti la bile prodotta dal fegato lo attraversa per venire raccolta nella cistifellea,

mentre nel momento in cui inizia la digestione di alimenti contenenti grassi la bile viene

nuovamente rilasciata. L’infiammazione della cistifellea normalmente è provocata da un calcolo che

impedisce il passaggio della bile; tipicamente i pazienti lamentano un mal di pancia che dura per più

di sei ore, febbre e nausea.

Sintomi: dolore epigastrio, dolore addome, nausea, vomito.

Abbiamo 2 tipologie:

a) colecistite acuta: si manifesta all’improvviso, causando un dolore forte e continuo nella

parte alta dell''addome. Almeno il 95% dei pazienti affetti da colecistite acuta probabilmente

ha dei calcoli. L’infiammazione inizia quasi sempre senza infezione, ma questa può

presentarsi nelle fasi successive. Essa può far sì che la cistifellea si riempia di liquidi e le sue

pareti si ispessiscano;Sintomi: dolore spalla, febbre alta oppure digiuno, carenze immunitarie, nutrizione con

flebo.b) colecistite cronica: è una infiammazione della cistifellea che si protrae per molto tempo ed

è quasi sempre causata dai calcoli biliari. È caratterizzata da attacchi ripetuti e dolorosi

(coliche biliari) Nella colecistite cronica la cistifellea è danneggiata dagli attacchi ripetuti di

infiammazione acuta, di solito dovuti ai calcoli, e può rimpicciolirsi, subire lesioni o

presentare un ispessimento delle pareti.Sintomi: distensione addome, dolore ipocondrio, epigastralgia oppure colica,

spossatezza.

DECIMA MALATTIA – Coledocolitiasi: è una patologia provocata dalla presenza di calcoli

all''interno della colecisti (colelitiasi) o del coledoco (coledocolitiasi), il dotto in cui la bile scorre

dal fegato al duodeno. Nella colecisti viene immagazzinata la bile secreta dal fegato; la bile è

composta da colesterolo, acidi biliari e lecitine. Se la concentrazione del colesterolo aumenta

oppure diminuisce quella degli acidi biliari, il colesterolo precipita formando cristalli, che a loro

volta costituiscono il primo nucleo per la formazione dei calcoli. Questa patologia colpisce più

frequentemente soggetti di sesso femminile, in sovrappeso, che consumano molti grassi.

I sintomi generali sono: dolore addome, febbre, mancanza appetito, mentre i sintomi specifici:

ittero, pancreatite oppure dolore persistente, colica oppure ingiallimento pelle, nausea, vomito.

UNDICESIMA MALATTIA - Colangite sclerosante primitiva: colpisce più frequentemente gli

uomini ed è una malattia a causa sconosciuta nel corso della quale i dotti biliari (i canalicoli che

portano la bile al di fuori del fegato) si infiammano e si riducono così di calibro. Questa riduzione

provoca un accumulo di bile nel fegato, danneggiando le cellule epatiche. Sembra che fattori

genetici e immunologici abbiano un ruolo importante nella genesi di questa malattia. La malattia

può presentarsi associata ad altre patologie, come l’infiammazione all’intestino (soprattutto colite

ulcerosa). Non è prevedibile, ma di solito progredisce lentamente. Il paziente può essere affetto

dalla malattia per anni prima di mostrarne i sintomi, che possono rimanere stabili, essere

intermittenti o progredire gradualmente. L’insufficienza epatica può sopravvenire dopo 7-15 anni.

Circa il 10% dei pazienti che soffrono di questa malattia, possono sviluppare tumore dei dotti

biliari, detto colangiocarcinoma.

I sintomi generali sono: ittero, prurito, dolori addominali, mentre i sintomi specifici sono:

perdita peso, anoressia, sanguinamento narici.

DODICESIMA MALATTIA - Tumori della via biliare: hanno origine dai dotti preposti al trasporto

della bile dal fegato all’intestino. Si tratta di malattie rare che colpiscono prevalentemente soggetti

di età compresa tra i 50 e i 80 anni. Talvolta questi tumori determinano una ostruzione al deflusso

della bile che si rende responsabile di una serie di sintomi tra cui la tipica colorazione gialla della

pelle e degli occhi (ittero), la presenza di feci chiare e urine scure, il prurito, la perdita di appetito e

di peso, la febbre e i dolori addominali. In molti casi questi tumori vengono diagnosticati in fase

avanzata.

I principali fattori di rischio per questa patologia sono:

• età: si tratta di un tumore che insorge soprattutto dopo i 65 anni;• malattie croniche delle vie biliari come la colangite sclerosante primitiva, la presenza di

calcoli nei dotti biliari e nella cistifellea, le cisti del coledoco;• malattie infiammatorie croniche dell’intestino;• obesità;• cirrosi ed epatiti croniche da virus B e C;• fumo;• vari agenti ambientali tra cui diossina, nitrosamine, radon e asbesto.

I sintomi generali sono: ittero, dolori addominali, anoressia, mentre i sintomi specifici sono:

perdita peso, prurito, colecisti.

TREDICESIMA MALATTIA - Tumori del fegato: detto anche epatocarcinoma, è una neoplasia il

cui numero di decessi correlati alla malattia è in continuo aumento, nella maggior parte dei casi è

dovuta all’evoluzione delle epatiti virali croniche B e C. Il fegato è uno degli organi più grandi del

corpo, è situato nella parte destra dell''addome ed è diviso in due lobi, uno destro, più grande, e uno

sinistro.

Il fegato svolge numerose funzioni molto importanti: filtra le sostanze nocive dal sangue, produce la

bile, utile per digerire i grassi contenuti nel cibo, immagazzina il glicogeno, uno zucchero che il

corpo utilizza per produrre energia.

Esistono due tipi di tumori del fegato: il cancro del fegato primitivo, una neoplasia che si origina nei

tessuti del fegato, e il cancro del fegato metastatico, un tumore che si origine in altri organi dai quali

si diffonde al fegato.

Il cancro del fegato primitivo può insorgere sia in età adulta sia in età pediatrica, è provocato dalla

proliferazione incontrollata di cellule all''interno dell’organo.

I sintomi generali sono: dimagrimento, mancanza appetito, nausea, vomito, mentre i sintomi

specifici sono: ittero, aumento fegato oppure difficoltà digestione, ascite.

QUATTORDICESIMA MALATTIA - Sindrome di Gilbert: è un disordine ereditario del

metabolismo della bilirubina, un pigmento giallo-arancione derivato dal catabolismo dei globuli

rossi invecchiati o danneggiati. Essa è caratterizzata da una difettosa clearance della bilirubina;

diminuisce, in pratica, la capacità del fegato di metabolizzare questa sostanza, che di riflesso

aumenta le proprie concentrazioni in circolo. Nelle persone che soffrono di sindrome di Gilbert si

registra pertanto una lieve iperbilirubinemia indiretta.

I sintomi generali sono: stanchezza, dolori addominali, debolezza, mentre i sintomi specifici

sono: dispepsia, colorazione cute e sclere oppure anoressia, riduzione vita eritrocitoria.

QUINDICESIMA MALATTA – Epatite fulminante: si tratta dell’evento più grave che possa

occorrere al fegato, soprattutto in termini di rapidità con cui evolve la situazione. Una epatite

fulminante determina una necrosi massiva delle cellule del fegato, gli epatociti, che supera la

cosiddetta minima "massa critica" di epatociti in grado di conservare la funzionalità dell’organo.

Gli agenti in grado di dare questo genere di problema sono diversi:

• virus epatici;• abuso acuto di alcol;• sostanze tossiche, comprese le droghe ricreative come l''ecstasy e la cocaina;• alcuni farmaci specialmente in caso di abuso: è il caso del comune paracetamolo, che in

dosaggi particolarmente elevati può causare questa situazione.

Purtroppo una epatite fulminante ha un altissimo tasso di mortalità e pochi trattamenti terapeutici

efficaci. Il trattamento di scelta è attualmente il trapianto di fegato.

I sintomi generali sono: mancanza appetito, gonfiore addominale, mentre i sintomi specifici

sono: difficoltà respiratoria. debolezza muscolare.

ItteroSintomi generali: colorazione gialla della cute e sclere AND nausea AND vomito AND urine scure

Ittero lieve: emolisi OR sindrome di Gilbert

Ittero grave: malattia epatica AND ascite AND alterazioni endocrine OR malattia biliare AND ascite AND alterazioni endocrine

SEDICESIMA MALATTIA - Ascite: è la complicazione più frequente e consiste nell’accumulo di

liquido nell’addome. L’addome è, infatti, come una scatola, al cui interno troviamo stomaco, fegato,

milza, piccolo intestino e colon. Tra questi organi c’è normalmente un sottilissimo strato liquido,

mentre nel cirrotico con ascite, si accumulano litri e litri di liquido: l’addome aumenta di volume,

talora in modo esagerato, e spesso compare un’ernia a livello dell’ombelico.

I sintomi generali sono: indebolimento organismo, sanguinamento, mentre i sintomi specifici

sono: ascite, atrofia muscolare, alterazioni neurologiche.

Come si può notare dalla descrizione, ogni malattia contiene la relativa definizione, i sintomi

generali e le tipologie che si possono avere, e per ognuna delle tipologie la relativa definizione e i

sintomi ad essa associati.

2.3.2 CONCETTUALIZZAZIONE

L’obiettivo di questa fase è identificare ed esplicitare i concetti principali, le relazioni tra gli

elementi del dominio individuati nella fase precedente ed i meccanismi di controllo necessari per

l’implementazione del processo di risoluzione. Inoltre in questa fase si cerca di esplicitare

formalmente la conoscenza relativa al dominio tramite la logica classica.

Qui di seguito viene riportato l’albero di derivazione relativo alle malattie trattate dal sistema

esperto, ed accanto ad ogni malattia vengono riportati i relativi sintomi e tipologie:

MALATTIE DELFEGATO E DELLE

VIE BILIARI

EpatomegaliaSintomi generali: dolori al fegato AND dolori addominali AND epatite A AND alcool

Sintomi specifici: aumento dimensioni fegato AND affaticamento AND alterazione cute e occhi

Fegato grasso Sintomi generali: diabete AND dieta squilibrata AND alcool

Fegato grasso non alcolico: intervento bypass OR assunzione farmaci

Fegato grasso miccrovescicolare: vomito AND nausea AND ittero OR (affaticamento AND ipoglicemia AND coagulazione)

Epatite alcolicaSintomi generali: anoressia AND perdita peso AND febbre AND dolore epigastrio AND dolore ipocondrio

Sintomi specifici: astenia AND ittero AND soffio epatico OR (ascite AND encefalopatia AND emorragia digestiva)

Cirrosi epatica Sintomi generali: fiacca AND dispepsia AND gonfiore addominale AND prurito

Sintomi specifici: ipotrofia muscolare AND sanguinamento bocca AND sonnolenza OR (sanguinamento ano AND feci nere AND ecchimosi)

Cirrosi biliare primitivaSintomi generali: stanchezza AND depressione AND dolore addome AND prurito

Sintomi specifici: aumento dimensioni fegato AND deformità dita OR (osteoporosi AND presenza di sangue nel vomito)

B: alterazione cute AND affaticamento AND dolore ipocondrio OR (prurito AND feci chiare AND urine scure) OR (transaminasi AND bilirubina)

C: dolori articolazioni AND dolori muscoli AND dolore fegato OR (mancanza appetito AND ittero AND stanchezza)

Epatite Sintomi generali: anoressia AND malessere AND vomito AND febbre

A: astenia AND indisposizione generale AND dolore fianco OR (ittero AND prurito AND urine scure)

Colelitiasi Sintomi generali: dolore addome AND dispepsia AND dolore spalla

Colica biliare: dolore progressivo

Colica colecistica: dolore epigastrio OR dolore scapolaColecistite Sintomi generali: dolore epigastrio AND dolore addome AND nausea AND vomito

Acuta: dolore spalla AND febbre alta OR (digiuno AND carenze immunitarie AND nutrizione con flebo)

Cronica: distensione addome AND dolore ipocondrio AND epigastralgia OR (colica AND spossatezza)

Coledocolitasi Sintomi generali: dolore addome AND febbre AND mancanza appetito

Sintomi specifici: ittero AND pancreatite OR (dolore persistente AND colica) OR (ingiallimento pelle AND nausea AND vomito)

Colangite sclerosante primitiva Sintomi generali: ittero AND prurito AND dolori addominali

Sintomi specifici: perdita peso AND anoressia AND sanguinamento narici

Tumore del fegatoSintomi generali: dimagrimento AND mancanza appetito AND nausea AND vomito

Sintomi specifici: ittero AND aumento fegato OR (difficoltà digestione AND ascite)

Tumore delle vie biliari Sintomi generali: ittero AND dolori addominali AND anoressia

Sintomi specifici: perdita peso AND prurito AND colecisti

Sindrome di Gilbert Sintomi generali: stanchezza AND dolori addominali AND deboelzza

Sintomi specifici: dispepsia AND colorazione cute e sclere OR (anoressia AND riduzione vita eritrocitoria)

Ascite Sintomi generali: indebolimento organismo AND sanguinamento

Sintomi specifici: ascite AND atrofia muscolare AND alterazioni neurologiche

Epatite fulminante Sintomi generali: mancanza appetito AND gonfiore addominale

Sintomi specifici: difficoltà respiratoria AND debolezza muscolare

Epatite fulminante Sintomi generali: mancanza appetito AND gonfiore addominale

Sintomi specifici: difficoltà respiratoria AND debolezza muscolare

Per ogni malattia quindi sono stati individuati i seguenti concetti:

o sintomi generali;o nome della malattia generica diagnostica al termine della prima fase di diagnosi;o tipologie in cui si scompone la malattia con relativi sintomi (specifici);o nome della malattia diagnosticata al termine della diagnosi.

In riferimento a tali concetti si è proceduti alla trasformazione in logica del primo ordine attraverso

l’utilizzo dei predicati:

malattia_generica(X): esprime la presenza della malattia generica X, dove

X ∈ {ittero, epatomegalia, fegato grasso, cirrosi epatica, epatite, ………}

malattia_specifica(X): esprime la presenza della malattia specifica X, dove

X ∈ {ittero lieve, fegato grasso microvescicolare, colica biliare, epatite A, epatite B,

………}

sintomo_generale(X): indica la presenza di un particolare sintomo generale della malattia

X, dove

X ∈ {colorazione gialla della cute e sclere, nausea, vomito, dolori al fegato, doloriaddominali, alcool, ………}

sintomo_specifico(Y): indica la presenza di un particolare sintomo specifico relativo alla

tipologia della malattia generica X, dove

Y ∈ {dolore epigastrio, dolore scapola, perdita peso, prurito, colecisti ………}

Riportiamo un esempio di trasformazione in logica del primo ordine di una delle malattie analizzate

e prendiamo in considerazione la malattia “ittero”:

• I sintomi generali individuati sono: − colorazione gialla della cute e sclere, − nausea, − vomito, − urine scure.

• Le tipologie in cui la malattia si suddivide sono:

1. ittero lieve: i cui sintomi sono emolisi oppure sindrome di Gilbert;2. ittero grave: i cui sintomi: malattia epatica, ascite, alterazioni endocrine oppure

malattia biliare, ascite, alterazioni endocrine.

Esprimendo il tutto tramite la logica in forma di clausole mediante regole di inferenza otteniamo:

malattia_generica(ittero);

ittero :- sintomo_generale(colorazione gialla della cute e sclere),

sintomo_generale(nausea),

sintomo_generale(vomito),

sintomo_generale(urine scure).

malattia_specifica(ittero lieve);

ittero_lieve :- sintomo_specifico(emolisi).

Prima fase:Verificare la presenza di tutti i sintomi generali previsti dalla malattia

Seconda fase:Diagnosi iniziale della malattia

Terza fase:Verificare la presenza di tutti i sintomi previsti dalle tipologie in cui si suddivide la malattia

Quarta fase:Diagnosi finale della malattia

ittero_lieve :- sintomo_specifico(sindrome di Gilbert).

malattia_specifica(ittero grave);

ittero_grave :- sintomo_specifico(malattia epatica),sintomo_specifico(ascite),sintomo_specifico(alterazioni endocrine).

ittero_grave :- sintomo_specifico(malattia biliare),sintomo_specifico(ascite),sintomo_specifico(alterazioni endocrine).

Affinché sia diagnostica la malattia generica “ittero” devono essere verificati contemporaneamente i

quattro sintomi generali. Una volta diagnosticata la malattia generica, si passa a verificare la

presenza dei sintomi specifici in modo da fornire all’utente una diagnosi accurata. Affinché sia

diagnosticata la malattia specifica “ittero lieve” o “ittero grave” devono essere soddisfatte una delle

due regole ad esso associate. Se viene verificata la regola associata ad “ittero lieve”

automaticamente viene esclusa la presenza dell’ittero grave.

In modo analogo è stata effettuata la trasformazione in logica del primo ordine per le altre malattie

rimanenti.

Qui di seguito riportiamo uno schema che riassume quanto detto:

Per la diagnosi della malattia, il sistema utilizza i fatti riguardanti la malattia, ed inoltre sottopone

all’utente una serie di domande utili alla diagnosi.

A tali domande, l’utente potrà rispondere “si” oppure “no”. Esse servono a verificare la presenza o

l’assenza di determinati sintomi, altrimenti nessuna malattia potrà essere diagnosticata. Si è pensato

quindi di porre delle domande generali in modo da capire la tipologia di malattia e successivamente

delle domande specifiche che consentono di diagnosticare esattamente la malattia da cui il paziente

è affetto.

Tale scelta di progettazione è stata validata dall’esperto, in quanto consente al sistema stesso di

diagnosticare in modo efficiente una determinata malattia.

2.4 FORMALIZZAZIONE E IMPLEMENTAZIONE

2.4.1 STRUMENTI UTILIZZATI

Per la realizzazione del sistema esperto è stato utilizzato il linguaggio PROLOG e come ambiente di

sviluppo si è scelto “YAP versione 5.1.3”. Il tutto è stato sviluppato e testato utilizzando i seguenti

sistemi operativi:

Windows 7 Professional 64 bit; Windows Xp Professional 32 bit.

2.4.2 ARCHITETTURA DEL SISTEMA

UTENTE INTERFACCIA UTENTE BASE DI CONOSCENZA MOTORE INFERENZIALE

Il sistema esperto realizzato, ha una architettura di tipo modulare:

2.4.3 BASE DI CONOSCENZA

Terminata la fase di identificazione della conoscenza, i concetti individuati vengono espressi

attraverso l’utilizzo del formalismo dei predicati Prolog:

1. goal(void): utilizzato per definire lo stato attuale del problema; 2. sintomo_generale(X, EV): indica la presenza di uno dei sintomi generali X con grado di

certezza EV;3. sintomo_specifico(Y, EV): indica la presenza di uno dei sintomi specifici Y con grado di

certezza EV;4. malattia_generica(X, EV): indica la malattia generica diagnosticata al termine della diagnosi

iniziale, ovvero dopo che l’utente ha risposto alle domande relative ai sintomi generali, ed

inserendo per ognuno di essi il relativo grado di certezza EV;5. malattia_specifica(X, EV): indica la malattia specifica ottenuta come risultato del processo

di diagnosi, ovvero dopo che l’utente ha risposto alle domande relative ai sintomi specifici,

ed inserendo per ognuno di essi il relativo grado di certezza EV;6. diagnosi(X, EV): indica la diagnosi con grado di certezza EV ottenuta alla fine del processo

di diagnosi.

Affinché il motore inferenziale possa presentare all’utente le domande relative ai sintomi (generali e

specifici) di ciascuna malattia, sono stati creati due predicati:

a) codifica_generale(X, testo_della_domanda): permette di visualizzare il testo delle domande

relative ai sintomi generali, ad esempio:

codifica_generale(colorazione_cute_sclere, 'Il paziente ha notato una alterazione del colore

della cute e delle sclere');

b) codifica_specifica(Y, testo_della_domanda): permette di visualizzare il testo delle domande

relative ai sintomi specifici, ad esempio:

codifica_generale(colorazione_cute_sclere, Il paziente ha sofferto in passato di emolisi').

Passiamo all’analisi delle regole che compongono la base di conoscenza del sistema esperto. Le

regole di produzione hanno la seguente forma:

left hand side (LHS) ==> right hand side (RHS).

dove:

o LHS (parte sinistra della regola): è una lista di condizioni da confrontare con la working

memory per poter eseguire la parte destra della regola; o RHS (parte destra della regola): è formata da una lista di azioni, che vengono eseguite

soltanto se sono soddisfatte tutte le condizioni presenti nella parte sinistra.

La sintassi delle regole definite in Prolog è la seguente:

rule < id>: [<condition>, ...] ==> [<action>,...].

dove:

a) id: è l’identificatore (numerico) univoco della regola;b) condition: è un pattern da confrontare attraverso il matching con il contenuto della working

memory;c) action: azione/i da eseguire se sono soddisfatte la/e condizione/i.

Nella parte destra di ciascuna regola sono supportate le seguenti azioni:

o assert(X): permette di aggiungere il termine X alla working memory;o retract(X): permette di rimuove il termine X dalla working memory;o write(X): permette di visualizzare il contenuto del termine X;o valuta([EV1|EV2], CE, EV): utilizzata per valutare il grado di certezza (CE) della

conclusione sulla base del grado di certezza delle premesse (EV1, EV2) e della regola.

L’unificazione fornisce un semplice meccanismo di pattern matching con la working memory

(rappresentata attraverso il database del Prolog), mentre la ricerca backtracking permette una facile

selezione delle regole.

Qui di seguito vengono riportati alcuni esempi di regole estratte dalla base di conoscenza del

sistema esperto realizzato:

regola 1: sottopone all’utente una serie di domande relative ai sintomi generali dell’ittero, se

la parte sinistra della regola è soddisfatta viene asserita la malattia generica:

rule 1:

[goal(void),

nl, nl, write(' COLLOQUIO CON IL PAZIENTE'), nl, nl, nl, nl,

write(' PRIMA MALATTIA'), nl, nl, nl,

write(' DOMANDE DI CARATTERE GENERALE'), nl, nl, nl,

sintomo_generale(colorazione_cute_sclere, EV1),

sintomo_generale(nausea, EV2),

sintomo_generale(vomito, EV3),

sintomo_generale(urine_scure, EV4)]

==>

[valuta([EV1,EV2,EV3,EV4], 0.7, EV5),

retract(goal(void)),

assert(malattia_generica(ittero, EV5)),

write(' DIAGNOSI INIZIALE'), nl, nl, nl,

write(' Da una prima diagnosi e'' possibile riscontrare la seguente malattia: ittero'), nl, nl,

write(' Le verranno sottoposte altre domande in modo da poter effettuare una diagnosi

piu'' acccurata della'), nl, nl,

write(' malattia riscontrata'), nl, nl].

regole 2 e 3: la regola 2 viene attivata soltanto se è soddisfatta la regola 1 e sottopone

all’utente delle domande relative ai sintomi specifici dell’ittero in modo da avere una

diagnosi più accurata della malattia:

rule 2:

[malattia_generica(ittero, EV1),

nl, nl, write(' DOMANDE DI CARATTERE SPECIFICO'), nl, nl, nl,

sintomo_specifico(emolisi, EV2)]

==>

[valuta([EV1, EV2], 0.7, EV3),

retract(malattia_generica(ittero, EV1)),

assert(generica(ittero)),

assert(diagnosi(lieve, EV3))].

rule 3:

[malattia_generica(ittero, EV1),

sintomo_specifico(sindrome_gilbert, EV2)]

==>

[valuta([EV1, EV2], 0.7, EV3),

retract(malattia_generica(ittero, EV1)),

assert(generica(ittero)),

assert(diagnosi(lieve, EV3))].

Le regole 2 e 3 sono reciprocamente esclusive (rappresenta l’or), ovvero l’esecuzione di una

regola esclude automaticamente l’esecuzione dell’altra. Questo avviene perché la parte

condizione è identica in entrambe le regole, ed in questo caso si riferisce alla malattia

generica (ittero).

rule 4:

[diagnosi(lieve, EV1)]

==>

[valuta([EV1], 0.7, EV2),

retract(diagnosi(lieve, EV1)),

assert(malattia_specifica(ittero_lieve, EV2))].

rule 5:

[malattia_specifica(ittero_lieve, EV1)]

==>

[valuta([EV1], 0.7, EV2),

retract(malattia_specifica(ittero_lieve, EV1)),

assert(scopo(ittero_lieve, EV2)),

assert(goal(end))].

Infine le regole 4 e 5 sono utilizzate per la diagnosi della malattia e per il calcolo del relativo

grado di certezza.

2.4.4 MOTORE INFERENZIALE

Il motore inferenziale del sistema esperto realizzato utilizza la strategia di ragionamento “Forward

Chaining (Concatenamento in avanti)”.

Questa strategia detta anche controllo guidato dai dati (data-driven), utilizza come punto di partenza

i fatti iniziali e applicando in avanti le regole di produzione (ovvero nell’ordine in cui si presentano)

si giunge alla soluzione. L’inferenza è condotta dall’antecedente in quanto la ricerca delle regole da

applicare si basa sul confronto (matching) tra l’antecedente della regola e i fatti contenuti nella

working memory. Il conseguente della regola contiene le azioni di aggiunta o rimozione dei fatti,

che consentono di dedurre nuovi fatti da quelli contenuti nell’antecedente della regola. Il motore inferenziale utilizzato è stato estrapolato dal sistema esperto “Oops”, ed adattato alle

esigenze del sistema esperto realizzato.

Fig. 2 – Schema del motore inferenziale di

“Oops”

L’immagine riportata in precedenza mostra i predicati utilizzati dal motore inferenziale di Oops.Il ciclo di esecuzione delle regole (recognize - act) è formato dai seguenti passi:

4 selezione della regola: si considera la parte sinistra (LHS) della regola che corrisponde allo stato

corrente del sistema registrato nella working memory;5 esecuzione della parte destra della regola: si considera la parte destra della regola presa in

considerazione nel punto 1, ed in questo modo viene modificato lo stato corrente della working

memory;

match process

checkmatch take process

solve

rule try solve

go

6 si ripetono i passi 1 e 2 fino a quando ci sono regole da applicare.

L’algoritmo di funzionamento in pseudocodice del motore inferenziale presente nel sistema esperto

realizzato è il seguente:

repeat

if parte_LHS_prima_regola = stato_working_memory

then

esegui_parte_RHS_regola

else

passa_regola_successiva

end

until per_tutte_le_regole_presenti

I predicati utilizzati dal motore inferenziale sono i seguenti:

Qui di seguito riportiamo il codice Prolog relativo ai predicati realizzati con relativa descrizione

delle funzionalità da loro svolte:

o predicato “solve”: contiene il ciclo recognize–act per l’avvio del processo di inferenza

solve :- nl, nl, goal(end), scopo(X, CE), tab(45), write('DIAGNOSI FINALE'), nl, nl, nl,

tab(3), write('Da una attenta analisi dei sintomi riscontrati durante il colloquio, si puo''

diagnosticare la seguente'), nl, nl, tab(3), write('malattia: '), trasforma(X, X_modificato),

write(X_modificato), tab(1), write('con certezza: '), Certezza is round(CE*100),

write(Certezza), write('%.'), nl, nl, nl, nl, !.

solve :- call(rule ID: LHS ==> RHS) try(ID, LHS, RHS), prendi_regole(ID), !, solve.

solve :- nl, nl, tab(3), write('Non e'' stato possibile diagnosticare alcuna malattia!!!'), nl, nl,

nl, !, go.

Esso cerca la prima regola che corrisponde allo stato attuale della working memory, la

esegue e ripete il processo fino a quando ci sono regole da applicare. Terminato il processo

di inferenza, il sistema riporta il raggiungimento (diagnosi della malattia) o il fallimento

dell’obiettivo (nessun malattia diagnosticata). La condizione di terminazione è esplicitata

attraverso il termine goal(end) e il predicato scopo(X, CE), il quale fornisce il nome della

malattia diagnosticata ed il relativo grado di certezza.

Il predicato “trasforma” è utilizzato per visualizzare in modo corretto (ovvero senza _) il

nome della malattia o del sintomo:

trasforma(ittero_lieve, 'ittero lieve') :- !.

o predicato “go”: permette il riavvio del processo di inferenza nel caso in cui non è stata

diagnosticata alcuna malattia:

go :- nl, nl, nl, tab(2), write('Vuoi effettuare una nuova diagnosi?'), nl, nl, nl, tab(2),

write('Digitare "si." per effettuare una nuova diagnosi oppure "no." per uscire dal sistema:

'), read(B), verifica_risposta(B), nl.

Il predicato “verifica_risposta” contenuto all’interno del predicato “go” esegue un controllo

sulla risposta inserita dall’utente ed esegue l’azione corrispondente:

− se la risposta è “si.” viene riavviato il processo di inferenza;− mentre se la risposta è “no.” viene visualizzato un messaggio all’utente.

verifica_risposta(B) :- B == 'si', solve.

verifica_risposta(B) :- B == 'no', nl, nl, tab(2), write('Ti ringraziamo per aver utilizzato il

sistema!!!. Arrivederci.'), nl, nl, !.

verifica_risposta(B) :- B \== 'no', nl, nl, tab(2), write('COMANDO NON VALIDO!!!

Inserire "si." oppure "no.".'), nl, go.

o predicato “try”: consente l’esecuzione della regola, solamente nel caso in cui è verificata la

sua parte sinistra:

try(ID, LHS, RHS) :- match(LHS), process(ID, RHS), !.

Nel caso di fallimento del predicato match, il predicato solve effettua un backtracking e

trova la regola successiva da eseguire;

o predicato “match”: effettua una analisi ricorsiva della lista di condizioni e anche il matching

con la working memory, in caso contrario chiede la risposta all’utente:

match([]) :- !.

match([Prem|Rest]) :- check(Prem), match(Rest).

o predicato “process”: viene richiamato automaticamente quando il predicato match ha

successo, ed esegue le azioni presenti nella parte destra della regola:

process(ID, []) :- !.

process(ID, [Action|Rest]) :- take(ID, Action), !, process(ID, Rest).

o predicato “check”: pone la domanda all’utente per verificare la presenza o l’assenza di un

sintomo (generale e specifico) e permette all’utente di inserire il grado di certezza della sua

affermazione. Entrambe le risposte sono memorizzate nella working memory:

check(P) :- P, !.

check(sintomo_generale(Q, EV)) :- chiedi_generale(sintomo_generale(Q, EV)), !.

check(sintomo_specifico(Q, EV)) :- chiedi_specifico(sintomo_specifico(Q, EV)), !.

Come si può bene vedere, abbiamo un check per i sintomi generali ed uno per i sintomi

specifici.

Il predicato check contiene al suo interno il predicato chiedi, la cui funzione è quella di

recuperare il testo della domanda da sottoporre all’utente se non è già stata sottoposta

attraverso il predicato domanda_generale. Come per il predicato check, anche in questo

caso abbiamo due predicati chiedi.

chiedi_generale(sintomo_generale(Q, EV)) :- domanda_generale(Q, A),

risposta_positiva(Q, A), tab(3), write('Inserire il valore del grado di certezza (Esempio:

0.50): '), read(EV), controllo_incertezza(EV), nl, nl.

domanda_generale(Q_generale, A) :- codifica_generale(Q_generale, Q), write(Q),

write('?'), read(C), risposta_generale(Q_generale, Q, A, C), nl, nl.

risposta_generale(Q_generale, Q, A, C) :- C == 'si', verifica_generale(Q, Q_generale, C,

A).

risposta_generale(Q_generale, Q, A, C) :- C == 'no', verifica_generale(Q, Q_generale, C,

A).

risposta_generale(Q_generale, Q, A, C) :- C \== 'no', nl, nl, nl, tab(2),

write('ATTENZIONE!!! Inserire una tra le seguenti risposte: si. - no.'), nl, nl, nl,

domanda_generale(Q_generale, A).

verifica_generale(Q, Q_generale, A, A) :- A == 'si', assert(sintomo_generale(Q_generale,

EV)).

verifica_generale(Q, Q_generale, A, A) :- A == 'no', nl, nl, tab(3), write('DIAGNOSI NON

ESEGUITA: il paziente non presenta tutti i sintomi previsti dalla malattia!!!'), nl, nl, nl,

retract(sintomo_generale(X, EV)).

Il predicato “domanda_generale” effettua anche un controllo sulla risposta che l’utente

inserisce, attraverso il predicato “verifica_generale”. Se la risposta inserita è uguale a “si.” il

sistema asserisce il sintomo generale con il relativo grado di certezza, mentre se la risposta è

uguale a “no.” mostra un messaggio all’utente e rimuove dalla memoria i sintomi

memorizzati in precedenza. Infine se il testo della risposta è diverso da “si.” e “no.”, viene

riproposta la domanda a cui l’utente ha risposto in modo errato.

Tutto ciò viene ripetuto per i sintomi specifici, e quindi abbiamo i seguenti predicati:

domanda_specifica, risposta_specifica e verifica_specifica.

Inoltre viene effettuato un controllo sul valore di certezza inserito dall’utente, in modo da

verificare se esso è compreso fra 0.00 e 1.00. Se il valore inserito è maggiore di 1.00, viene

chiesto all’utente di inserire un nuovo valore.

controllo_incertezza(X) :- float(X), X =< 1.00, X >= 0.00, !.

controllo_incertezza(X) :- nl, nl, tab(3), write('ATTENZIONE!!! Il valore del grado di

certezza inserito non e'' valido!!!'), nl, nl, nl, tab(3), write('Inserire un valore compreso tra

0.0 e 1.0'), nl, nl, nl, richiedi_incertezza(EV).

richiedi_incertezza(EV) :- tab(3), write('Inserire il valore del grado di certezza (Esempio:

0.50): '), read(EV), controllo_incertezza(EV), nl.

o predicato “take”: esegue una tra le seguenti azioni, ed esse devono essere specificate dal

suo argomento

− aggiunta o rimozione di un fatto;− valutazione del grado di certezza;− comunicazione all’utente dello stato del sistema.

Ognuno dei predicati take ha una sua funzione specifica:

permette di aggiungere un fatto alla working memory:

take(ID, assert(X)) :- assert(X), !.

take(ID, assert(goal(X))):- assert(goal(X)),!.

take(ID, assert(cod(ID))):- assert(cod(ID)),!.

permette di rimuovere un fatto dalla working memory:

take(ID, retract(X)) :- retract(X), !.

take(ID, retract(goal(X))):- retract(goal(X)),!.

permette di aggiungere i sintomi generali alla working memory:

take(ID, assert(sintomo_generale(X, EV))) :- assert(sintomo_generale(X, EV)), !.

take(ID, retract(sintomo_generale(X, EV))) :- retract(sintomo_generale(X, EV)), !.

take(ID, assert(sint_gen(X, EV))):- assert(sint_gen(X, EV)), nl, !.

take(ID, retract(sint_gen(X, EV))):- retract(sint_gen(X, EV)), nl, !.

permette di aggiungere i sintomi specifici alla working memory:

take(ID, assert(sintomo_specifico(Y, EV))) :- assert(sintomo_specifico(Y, EV)), ! .

take(ID, retract(sintomo_specifico(Y, EV))) :- retract(sintomo_specifico(Y, EV)), !.

take(ID, assert(sint_spec(Y, EV))) :- assert(sint_spec(Y, EV)), ! .

take(ID, retract(sint_spec(Y, EV))) :- retract(sint_spec(Y, EV)), !.

permette di aggiungere la diagnosi inziale alla working memory:

take(ID, assert(diagnosi(X, EV))):- assert(diagnosi(X, EV)), nl, !.

take(ID, retract(diagnosi(X, EV))):- retract(diagnosi(X, EV)), nl, !.

take(ID, retract(generica(X))):- retract(generica(X)),!.

take(ID, assert(generica(X))):- assert(generica(X)),!.

permette di aggiungere la diagnosi inziale alla working memory:

take(ID, assert(malattia_generica(X, EV))):- assert(malattia_generica(X, EV)), !.

take(ID, retract(malattia_generica(X, EV))):- retract(malattia_generica(X, EV)), !.

permette di aggiungere la diagnosi finale alla working memory:

take(ID, assert(malattia_specifica(X, EV))) :- assert(malattia_specifica(X, EV)), !.

permette di valutare il grado di certezza relativo ad un sintomo:

take(ID, valuta(EV_N, X, EV)) :- valuta(EV_N, X, EV), !.

utility:

take(ID, X) :- X, !.

take(ID, Y) :- Y, !.

take(ID, write(X)) :- write(X), !.

take(ID, read(X)) :- read(X), !.

take(nl) :- nl, !.

take(ID, retract(N), LHS) :- (N == all; integer(N)), retr(N,LHS), !.

Infine sono stati definiti i seguenti operatori:

3 op(800, xfx, ==>): utilizzato per separare la parte sinistra dalla parte destra della regola;

4 op(500 ,xfy , :): utilizzato per separare attributi e valori;5 op(810 , fx, rule): utilizzato per la definizione delle regole;

6 op(1100, xfy, ;): definisce l’operatore or;

7 op(700, xfx, ==): definisce l’operatore uguaglianza;

8 op(700, xfx, \==): definisce l’operatore disuguaglianza.

2.4.5 CARATTERISTICHE AGGIUNTE

Le caratteristiche aggiunte al motore inferenziale, sono le seguenti:

1. come: permette all’utente di capire come il sistema esperto è arrivato ad una conclusione;2. perché: permette all’utente di capire perché il sistema pone una determinata domanda

durante il processo di diagnosi;3. gestione dell’incertezza: permette di calcolare il grado di certezza della malattia

diagnosticata.

Analizziamo in dettaglio le singole caratteristiche:

1. come: si compone di più predicati, i quali permettono di visualizzare dapprima le regole che

il sistema ha utilizzato per la diagnosi, e successivamente viene spiegato l’uso di ogni regola

utilizzata nel processo di inferenza.

how :- nl, nl, nl, tab(3), write('Le regole utilizzate per la diagnosi della malattia sono le

seguenti: '), cod(ID), tab(2), write(ID), fail.

how.

how_1 :- nl, nl, nl, tab(3), write('La prima regola e'' stata utilizzata per verificare se il

paziente presentasse i seguenti sintomi'), nl, nl, tab(3), write('generali: '), nl, nl, nl,

sintomo_generale(X, EV), trasforma(X, X_modificato), tab(4), write('- '),

write(X_modificato), nl, nl, nl, fail.

how_1.

how_2 :- tab(3), write('e che hanno portato ad affermare come diagnosi iniziale la seguente

malattia: '), nl, nl, generica(X), trasforma(X, X_modificato), tab(3), write(X_modificato),

nl, nl, nl.

how_2.

how_3 :- tab(3), write('La seconda regola e'' stata utilizzata per una diagnosi piu''

approfondita della malattia, permettenodci'), nl, nl, tab(3), write('di rilevare i seguenti

sintomi specifici: '), nl, nl, nl, sintomo_specifico(Y, EV), trasforma(Y, Y_modificato), tab(4),

write('- '), write(Y_modificato), nl, nl, nl, fail.

how_3.

how_4 :- tab(3), write('La terza e quarta regola sono state utilizzate per la diagnosi finale

della malattia.'), nl, nl, nl, nl.

how_4.

2. perché: anche in questo caso sono stati utilizzati più predicati per la realizzazione di questa

funzionalità. I due predicati riportati qui di seguito, permettono al sistema di recuperare il testo delle

domande poste all’utente durante il processo di diagnosi, sia per i sintomi generali e sia per

quelli specifici:

why_generale:- nl, nl, nl, tab(3), sint_gen(X, EV), write('Ti e'' stata formulata la seguente

domanda in quanto il sintomo "'), trasforma(X, X_modificato), write(X_modificato),

write('"'), nl, nl, nl, tab(3), codifica(X), nl, nl, retract(sint_gen(X, EV)), nl, nl, nl.

why_specifico :- nl, nl, nl, tab(3), sint_spec(Y, EV), write('Ti e'' stata formulata la seguente

domanda in quanto il sintomo "'), trasforma(Y, Y_modificato), write(Y_modificato),

write('"'), nl, nl, nl, tab(3), codifica(Y), nl, nl, retract(sint_spec(Y, EV)), nl, nl, nl.

Dopo aver risposto ad una domanda viene chiesto all’utente se vuole conoscere il perché gli

è stata posta quella determinata domanda. Se l’utente digita “si.”, viene visualizzata la

risposta, altrimenti digitando “no.” il sistema prosegue il processo di diagnosi.

3. gestione dell’incertezza: le funzioni implementate per la sua realizzazione sono le seguenti:

funzione per la valutazione della certezza massima:

certezza_max([], max) :- max is 0.

certezza_max(L, max) :- max_list(L, max1), max is max1.

funzione per la valutazione della certezza sia dell'antecedente che del conseguente di

ogni regola:

valuta(EV_N, X, EV) :- valuta_ant(EV_N, EV_ANT), valuta_cons(EV_ANT, X, EV).

valuta_cons(EV_ANT, X, EV) :- EV is EV_ANT * X.

valuta_ant(EV_N, EV_ANT) :- media(EV_N, EV_ANT).

funzione per il calcolo della media degli elementi numerici presenti in una lista:

media(LISTA, MEDIA) :- somma(LISTA, SOMMA), conta(LISTA, CONTEGGIO),

MEDIA is SOMMA/CONTEGGIO.

funzione per il conteggio degli elementi di una lista:

conta([],0).

conta([T|C], CONTEGGIO) :- conta(C, CONTEGGIO_PARZIALE), CONTEGGIO

is 1 + CONTEGGIO_PARZIALE.

funzione per la somma degli elementi contenuti in una lista:

somma([], 0).

somma([T|C], TOTALE_SOMMA) :- somma(C, SOMMA_CODA),

TOTALE_SOMMA is T + SOMMA_CODA.

2.4.6 AGGIORNAMENTO DELLA CONOSCENZA

Il sistema esperto, tiene traccia dei fatti asseriti per quanto riguarda i pazienti se hanno un

determinato sintomo e/o malattia. I fatti memorizzati sono temporanei e quando il sistema viene

riavviato i fatti precedentemente asseriti vengono persi.

CAPITOLO 3

FUNZIONAMENTO

DEL

SISTEMA

6.1 AVVIO DEL SISTEMA

Il sistema esperto realizzato si compone di tre file:

1. launch.pl: contiene al suo interno i comandi per richiamare i file relativi al motore

inferenziale, alla base di conoscenza e all’interfaccia utente;2. inference_mechansim.pl: comprende il motore inferenziale e le caratteristiche aggiunte

(incertezza, come e perché);3. disease.pl: contiene la base di conoscenza relativa alle malattie del fegato e delle vie biliari.

Per l’avvio del sistema esperto, è necessario copiare i tre file elencati in precedenza all’interno della

cartella “bin” di YAP, ed una volta avviato il programma, bisogna digitare il seguente comando:

[launch].

Terminata questa operazione, il sistema esperto viene caricato in memoria, e verrà visualizzata

l’interfaccia utente.

Il sistema esperto realizzato è di tipo “question driven”, ovvero guidato da domande che il sistema

presenta all’utente in modo da poter raccogliere le informazioni utili per la diagnosi.

6.2 INTERFACCIA UTENTE

L’interfaccia utente del sistema esperto realizzato è la seguente:

Fig. 3 – Interfaccia utente

In rosso è evidenziato il comando utilizzato per l’avvio del sistema.

Come si può ben notare dal menù, il sistema presenta sette comandi:

1. carica: grazie all’utilizzo di questo comando è possibile caricare il file relativo alla base di

conoscenza che dovrà essere utilizzata dal sistema; 2. risolvi: permette l’avvio del processo di diagnosi soltanto dopo aver caricato la base di

conoscenza;3. dettagli: una volta terminata l’inferenza e quindi aver diagnosticato la malattia, grazie al

seguente comando, è possibile ottenere ulteriori dettagli relativi alla malattia;4. fatti: permette all’utente di visualizzare i fatti asseriti dal sistema esperto al termine del

processo di diagnosi;5. come: consente all’utente di visualizzare il modo in cui è stata dedotta la malattia

diagnosticata;6. aiuto: fornisce maggiori informazioni sui comandi riconosciuti dal sistema;7. chiudi: permette all’utente di uscire dal sistema.

6.3 ESEMPIO DI INTERAZIONE CON IL SISTEMA

Dopo aver avviato il sistema esperto, attraverso l’utilizzo del comando “carica.” (evidenziato in

rosso), si potrà caricare il file relativo alla base di conoscenza, che nel nostro caso si chiama

“disease.pl”.

Fig. 4 – Caricamento della base di conoscenza

Terminato il caricamento del file, il sistema ci restituisce un messaggio, in cui viene riportato l’esito

del caricamento (parte evidenziata in giallo).

Successivamente digitare il comando “risolvi.” per poter avviare il processo di diagnosi della

malattia:

Fig. 5 – Avvio della procedura di inferenza

Osservando la figura 4 si può notare in giallo il comando utilizzato, e al di sotto la prima domanda

di carattere generale, a cui l’utente può rispondere “si.” oppure “no.”. Se l’utente risponde “si.”, gli

viene richiesto di inserire il valore del grado di certezza relativa al sintomo proposto nella domanda.

Questo valore deve essere compreso tra 0.00 e 1.00.

Fig. 6 – Domande di carattere generale con relativa richiesta di inserimento del valore di certezza

In nero sono evidenziate la risposta alla domanda e il relativo valore del grado di certezza.

Dopo aver inserito il valore di certezza verrà chiesto all’utente se vuole conoscere il perché gli è

stata posta quella domanda. Se l’utente risponde “si.”, verrà visualizzata la risposta, mentre in caso

contrario verrà presentata la domanda successiva.

Fig. 7 – Domanda relativa alla malattia successiva

Se l’utente risponde “no.” ad una delle domande relative alla prima malattia (affinché sia

diagnosticata la prima malattia i sintomi generali devono essere tutti presenti, e quindi l’utente deve

rispondere in modo affermativo a tutte le domande), il sistema passerà alle domande di carattere

generale relative alle malattie successive (contenute sempre nella base di conoscenza).

Fig. 8 – Domanda relativa alla malattia successiva

Nel caso in cui l’utente risponde “no.” a tutte le domande, il sistema non potrà diagnosticare alcuna

malattia, ed inoltre chiederà all’utente se vuole effettuare una nuova diagnosi.

Fig. 9 – Il sistema non ha diagnosticato alcuna malattia

Se si inserisce una riposta errata, il sistema visualizza un messaggio d’errore e ripropone la

domanda in modo che l’utente possa rispondere in modo corretto.

Fig. 10 – Risposta errata

Terminata la fase relativa alle domande di carattere generale, il sistema visualizza un messaggio, in

cui riporta un prima diagnosi della malattia (parte evidenziata in giallo),

Fig. 11 – Diagnosi inziale della malattia

ed in questo modo l’utente ha già una idea circa la malattia che gli verrà diagnosticata.

Successivamente gli vengono proposte delle domande più specifiche in modo da poter giungere alla

diagnosi finale. Anche per questa tipologia di domande, gli verrà chiesto di inserire il relativo grado

di certezza.

Una volta conclusa questa fase, il sistema visualizzerà la malattia diagnosticata (evidenziata in

giallo) ed il relativo valore di certezza.

Fig. 12 – Diagnosi finale della malattia

Al termine della diagnosi della malattia, se l’utente vuole conoscere ulteriori informazioni sulla

malattia, può digitare il comando “dettagli.”, ed il sistema proporrà ulteriori informazioni sulla

malattia, tra cui la terapia consigliata.

Fig. 13 – Dettagli sulla malattia diagnosticata

Digitando il comando “fatti.”, verranno visualizzati i fatti asseriti dal sistema, ovvero i sintomi

generali e specifici della malattia diagnosticata.

Fig. 14 – Visualizzazione dei fatti asseriti

Mentre digitando il comando “come.”, verranno visualizzate le regole utilizzate ed inoltre come

sono state utilizzate.

Fig. 15 – Funzionalità “come”

Digitando il comando “aiuto”, sarà possibile visualizzare una breve guida relativa ai comandi del

sistema.

Fig. 16 –

Visualizzazione della guida del sistema

Infine, se l’utente inserisce un comando non valido, verrà visualizzato un messaggio d’errore

(evidenziato in rosso), e gli verrà riproposta la domanda per l’inserimento di un nuovo comando.

Fig. 17 – Inserimento di un comando non valido

BIBLIOGRAFIA E SITOGRAFIA

[01] P. Mello L. Console, E. Lamma - Programmazione Logica e Prolog, UTET Libreria, 1991;

[02] Stuart J. Russell, Peter Norvig – Intelligenza Artificiale: Un Approccio Moderno, UTET

Libreria, 2007;

[03] D. Merritt - Building Expert System in Prolog, Amzi! Inc, 2000;

Sitografia:

http://www.dcc.fc.up.pt/~vsc/Yap/ http://www.msd-italia.it/altre/manuale/sez04/index.html http://www.chirurgiadelfegato.it/sintomi.html http://www.hackerart.org/corsi/aba01/bascherini/mainframesistemiesperti.htm