;******************************************************************************** ;* Funzioni di supporto * ;******************************************************************************** (deffunction Domanda (?testo ?spiegazione $?valori_ammessi) (format t ?testo) (if (neq ?spiegazione "") then (format t "(%s perche)" (implode$ ?valori_ammessi)) else (format t "(%s)" (implode$ ?valori_ammessi))) (format t "? ") (bind ?risposta (read)) (if (lexemep ?risposta) ; Se si e' inserita una stringa then (bind ?risposta (lowcase ?risposta))) ; converte in lettere minuscole (if (eq ?risposta perche) then (format t (str-cat "%n" ?spiegazione "%n") )) (while (not (member$ ?risposta ?valori_ammessi)) do (format t ?testo) (if (neq ?spiegazione "") then (format t "(%s perche)" (implode$ ?valori_ammessi)) else (format t "(%s)" (implode$ ?valori_ammessi))) (format t "? ") (bind ?risposta (read)) (if (lexemep ?risposta) then (bind ?risposta (lowcase ?risposta)))) ?risposta ; Valore restituito dalla funzione Domanda ) (defglobal ?*spiegazione* = "") (deffunction Spiega (?testo) (bind ?*spiegazione* (str-cat ?*spiegazione* ?testo)) ) ;******************************************************************************** ;* Funzioni generali * ;******************************************************************************** (defrule Presentazione (declare (salience 100)) => (printout t crlf crlf) (printout t " ITTERO " crlf) (printout t "Sistema Esperto per la diagnosi di malattie" crlf) (printout t "hardware di un Personal Computer" crlf crlf) ) ;******************************************************************************** ;* Regole di Visualizzazione FINALE!!!!!!!!!! * ;******************************************************************************** (defrule Visualizza_Malattia (diagnosi ?malattia) => (format t "%n%n%n%nLa malattia e':%s" ?malattia) ) ;******************************************************************************** ;* Modulo di spiegazione!!!!! * ;******************************************************************************** (defrule Visualizza_spiegazione (declare (salience -2000)) => (bind ?risposta (Domanda "%n%nVuoi sapere come sono arrivato a questa malattia?%n " "" si no)) (if (eq ?risposta si) then (format t ?*spiegazione*)) ) ;******************************************************************************** ;* Regole ;******************************************************************************** (defrule Sindrome_di_Gilbert (sintomo ittero_sclerale si) (sintomo febbre no) (or (sintomo stress si) (sintomo digiuno si)) => (assert (diagnosi "Sindrome di Gilbert")) (Spiega "L'ittero sclerale e l'assenza di febbre fanno pensare che si tratti di Sindrome di Gilbert") ) (defrule Domanda_Febbre (declare (salience -100)) (not (sintomo febbre ?)) => (bind ?risposta (Domanda "Il paziente ha febbre?" "" si no)) (assert (sintomo febbre ?risposta)) ) (defrule Epatite_Acuta_Virale (sintomo ittero_franco si) (sintomo febbre si) (paziente giovane si) (sintomo stanchezza si) (sintomo dispepsia si) (sintomo aumento_fegato si) => (assert (diagnosi "Epatite_Acuta_Virale")) (Spiega "L'ittero franco, la febbre, la stanchezza, la dispepsia, l'aumento delle dimensioni fegato e la giovane eta' del paziente fanno pensare che si tratti di Epatite acuta virale") ) (defrule Colecistite (sintomo ittero_franco si) (sintomo febbre si) (paziente giovane no) (sintomo dolori_ricorrenti si) (sintomo dolore_coleciste si) => (assert (diagnosi "Colecistite")) (Spiega "L'ittero franco, la febbre, i dolori ricorrenti e quelli della coleciste, insieme alla eta' media-avanzata del paziente fanno pensare che si tratti di Sindrome di Colecistite") ) (defrule Cirrosi_Alcolica (sintomo ittero_franco si) (sintomo febbre no) (paziente giovane no) (uso alcool si) (sintomo aumento_fegato si) (sintomo aumento_milza si) => (assert (diagnosi "Cirrosi Alcolica")) (Spiega "L'ittero franco, l'assenza di febbre, l'uso di alcool, l'eta' giovane del paziente, l'aumento di dimensioni del fegato e della milza fanno pensare che si tratti di Cirrosi Alcolica") ) (defrule Ignota (declare (salience -1000)) (not (diagnosi ?)) => (assert (diagnosi "Malattia ignota")) (Spiega "Non ci sono abbastanza elementi per effetuare una diagnosi")) (defrule Sintomo_Ittero_Franco (occhi_gialli si) (colorito_giallo si) => (assert (sintomo ittero_franco si)) (Spiega "Gli occhi gialli ed il colorito giallo indicano ittero franco")) (defrule Sintomo_Ittero_Sclerale (occhi_gialli si) (colorito_giallo no) => (assert (sintomo ittero_sclerale si)) (Spiega "Gli occhi gialli ed il colorito normale indicano ittero franco")) (defrule Domanda_Occhi_Gialli (declare (salience -100)) (not (diagnosi ?)) (not (occhi_gialli ?)) => (bind ?risposta (Domanda "Il paziente ha gli occhi gialli?" "Serve per verificare la presenza di ittero" si no)) (assert (occhi_gialli ?risposta)) ) (defrule Domanda_Colorito_Giallo (declare (salience -100)) (not (diagnosi ?)) (not (colorito_giallo ?)) => (bind ?risposta (Domanda "Il paziente ha il colorito giallo?" "Serve per distinguere l'ittero sclerale da quello franco" si no)) (assert (colorito_giallo ?risposta)) ) (defrule Domanda_Sintomo_Stress (declare (salience -100)) (not (diagnosi ?)) (not (sintomo stress ?)) => (bind ?risposta (Domanda "Il paziente e' stressato?" "La presenza di stress o digiuno fa propendere per la Sindrome di Gilbert" si no)) (assert (sintomo stress ?risposta)) ) (defrule Domanda_Sintomo_Digiuno (declare (salience -100)) (not (diagnosi ?)) (not (sintomo digiuno ?)) => (bind ?risposta (Domanda "Il paziente digiuna?" "La presenza di stress o digiuno fa propendere per la Sindrome di Gilbert" si no)) (assert (sintomo digiuno ?risposta)) ) (defrule Domanda_Paziente_Giovane (declare (salience -100)) (not (diagnosi ?)) (not (paziente giovane ?)) => (bind ?risposta (Domanda "Il paziente e' giovane?" "" si no)) (assert (paziente giovane ?risposta)) ) (defrule Domanda_Sintomo_Stanchezza (declare (salience -100)) (not (diagnosi ?)) (not (sintomo stanchezza ?)) => (bind ?risposta (Domanda "Il paziente e' stanco?" "E' indice di epatite acuta virale" si no)) (assert (sintomo stanchezza ?risposta)) ) (defrule Domanda_Sintomo_Dispepsia (declare (salience -100)) (not (diagnosi ?)) (not (sintomo dispepsia ?)) => (bind ?risposta (Domanda "Il paziente ha dispepsia?" "Potrebbe essere indice di epatite acuta virale" si no)) (assert (sintomo dispepsia ?risposta)) ) (defrule Domanda_Sintomo_Aumento_Fegato (declare (salience -100)) (not (diagnosi ?)) (not (sintomo aumento_fegato ?)) => (bind ?risposta (Domanda "Il paziente ha aumento del fegato?" "Aiuta a distinguere epatite e cirrosi da altre malattie" si no)) (assert (sintomo aumento_fegato ?risposta)) ) (defrule Domanda_Sintomo_Dolori_Ricorrenti (declare (salience -100)) (not (diagnosi ?)) (not (sintomo dolori_ricorrenti ?)) => (bind ?risposta (Domanda "Il paziente ha dolori ricorrenti?" "Potrebbe servire per confermare la colecistite" si no)) (assert (sintomo dolori_ricorrenti ?risposta)) ) (defrule Domanda_Sintomo_Dolore_Coleciste (declare (salience -100)) (not (diagnosi ?)) (not (sintomo dolore_coleciste ?)) => (bind ?risposta (Domanda "Il paziente ha dolore coleciste?" "Conforme la colecistite" si no)) (assert (sintomo dolore_coleciste ?risposta)) ) (defrule Domanda_Uso_Alcool (declare (salience -100)) (not (diagnosi ?)) (not (uso alcool ?)) => (bind ?risposta (Domanda "Il paziente fa uso di alcool?" "Farebbe pensare alla cirrosi" si no)) (assert (uso alcool ?risposta)) ) (defrule Domanda_Aumento_Milza (declare (salience -100)) (not (diagnosi ?)) (not (sintomo aumento_milza ?)) => (bind ?risposta (Domanda "Il paziente ha aumento milza?" "E' un sintomo tipico di cirrosi" si no)) (assert (sintomo aumento_milza ?risposta)) )