(deftemplate grup-boli (slot nume) (slot ID) (multislot simptome) (multislot descendenti) ) (deftemplate simptom-pb (slot nume) (slot ID) (multislot intrebare) (slot tip) (multislot interval) (multislot valoare) (slot certificare) (slot invalidare) (slot relevanta) ) (deftemplate cost-simptom (slot nume-smp) (slot cost) ) (deftemplate pacient (slot nume) (slot sex) (multislot fisa) (multislot ID-diag) ) (deftemplate diagnostic (slot ID) (slot scor) (multislot nume) ) (deftemplate simptom-pacient (slot nume) (slot ID) (slot valoare) (slot incredere) ) (deffacts bucatarie (faza input-date-pacient) (grupe-boli-posibile icter) (grupe-de-verificat icterID1) ; (simptome-selectate) ) ;; ;; ;; Un profil de grupa de boli ;; ;; (deffacts profil-icter (grup-boli (nume icter) (ID icterID1) (simptome col01 col02 col03 temp01) (descendenti icter2 icter3)) (grup-boli (nume icter-hemato-biliar) (ID icter2) (simptome col04 scau01 pru01 card01) (descendenti)) (grup-boli (nume icter-hemolitic) (ID icter3) (simptome col05 scau02 pru02 card02) (descendenti)) (simptom-pb (nume coloratie-tegument) (ID col01) (tip val) (valoare galben-icteric) (certificare 0) (invalidare 0) (relevanta 50) (intrebare ce coloratie are tegumentul?)) (simptom-pb (nume coloratie-sclerotice) (ID col02) (tip val) (valoare galben) (certificare 0) (invalidare 0) (relevanta 50) (intrebare ce coloratie sclerotica)) (simptom-pb (nume coloratie-fren-limba) (ID col03) (tip val) (valoare galben) (certificare 0) (invalidare 0) (relevanta 50) (intrebare ce coloratie are frenul limbii?)) (simptom-pb (nume coloratie-piele) (ID col04) (tip val) (valoare galben-rubiniu-roscat galben-verzui) (certificare 0) (invalidare 0) (relevanta 50) (intrebare ce coloratie are pielea?)) (simptom-pb (nume coloratie-piele) (ID col05) (tip val) (valoare galben-franc) (certificare 0) (invalidare 0) (relevanta 50) (intrebare ce coloratie are pielea?)) (simptom-pb (nume coloratie-scaun) (ID scau01) (tip val) (valoare decolorat) (certificare 0) (invalidare 0) (relevanta 80) (intrebare ce coloratie are scaunul?)) (simptom-pb (nume coloratie-scaun) (ID scau02) (tip val) (valoare brun-intens) (certificare 0) (invalidare 0) (relevanta 50) (intrebare ce coloratie are scaunul?)) (simptom-pb (nume prurit) (ID pru01) (valoare da) (tip val) (certificare 0) (invalidare 0) (relevanta 80) (intrebare ai mincarimi?)) (simptom-pb (nume prurit) (ID pru02) (valoare nu) (tip val) (certificare 0) (invalidare 0) (relevanta 80) (intrebare ai mincarimi?)) (simptom-pb (nume bradicardie) (ID card01) (tip val) (valoare da) (certificare 0) (invalidare 0) (relevanta 30) (intrebare ai un puls bradicardic?)) (simptom-pb (nume bradicardie) (ID card02) (tip val) (valoare nu) (certificare 0) (invalidare 0) (relevanta 80) (intrebare ai un puls bradicardic?)) (simptom-pb (nume temperatura-mare) (ID temp01) (tip int) (interval 38 42) (certificare 0) (invalidare 0) (relevanta 80) (intrebare ce temperatura ai?)) ) ;; Preluari date de la pacient (defrule cere-date-de-la-pacient ?f <- (faza input-date-pacient) => (printout t "Numele? ") (bind ?np (read)) (printout t "Sexul? ") (bind ?sp (read)) (printout t "Virsta? ") (bind ?vp (read)) (bind ?ID-simptom (gensym)) (assert (simptom-pacient (nume virsta) (ID ?ID-simptom) (valoare ?vp) (incredere 100)) (pacient (nume ?np) (sex ?sp) (fisa ?ID-simptom)) (faza input-simptome-pacient)) (retract ?f) ) (defrule cere-simptom-de-la-pacient ?f <- (faza input-simptome-pacient) ?p <- (pacient (nume ?np) (fisa $?IDuri)) => (printout t "De ce tip e suferinta? ") (bind ?ns (read)) (if (eq ?ns NIL) then (retract ?f) (assert (faza selectare-simptome-de-interogat)) else (printout t "Da-mi o valoare pentru ea? ") (bind ?vs (read)) (printout t "Pe o scara de la 0 la 100 spune-mi cit de sigur esti de aceasta valoare? ") (bind ?vi (read)) (bind ?IDs (gensym)) (assert (simptom-pacient (nume ?ns) (ID ?IDs) (valoare ?vs) (incredere ?vi))) (modify ?p (fisa $?IDuri ?IDs)) )) (defrule selectie-simptome-pt-o-grupa ?f <- (faza selectare-simptome-de-interogat) (pacient (nume ?np) (fisa $?sp)) (grupe-de-verificat ?g $?gs) (grup-boli (nume ?gb) (ID ?g) (simptome $?ts)) => (retract ?f) (assert (faza verifica-simptome) (simptome-de-verificat $?ts)) ) (defrule verifica-simptom-interval (faza verifica-simptome) ?a <- (simptome-de-verificat $?ts1 ?s $?ts2) (simptom-pb (nume ?n) (ID ?s) (tip int) (interval ?min ?max) (relevanta ?r)) (simptom-pacient (nume ?n) (valoare ?vp&:(and (>= ?vp ?min) (<= ?vp ?max))) (incredere ?ip)) ; (pacient (nume ?np) (fisa $?s-fisa)) => (retract ?a) (assert (simptome-de-verificat $?ts1 $?ts2)) ) (defrule verifica-simptom-valoare (faza verifica-simptome) ?a <- (simptome-de-verificat $?ts1 ?s $?ts2) (simptom-pb (nume ?n) (ID ?s) (tip val) (valoare $?vals) (relevanta ?r)) (simptom-pacient (nume ?n) (valoare ?vp&:(member$ ?vp $?vals)) (incredere ?ip)) ; (pacient (nume ?np) (fisa $?s-fisa)) => (retract ?a) (assert (simptome-de-verificat $?ts1 $?ts2)) ) (defrule nu-se-verifica-simptom-interval (faza verifica-simptome) ?a <- (simptome-de-verificat $?ts1 ?s $?ts2) (simptom-pb (nume ?n) (ID ?s) (tip int) (interval ?min ?max) (relevanta ?r)) (simptom-pacient (nume ?n) (valoare ?vp&:(or (< ?vp ?min) (> ?vp ?max))) (incredere ?ip)) ?b <- (grupe-de-verificat ?g $?gs) ; (pacient (nume ?np) (fisa $?s-fisa)) => (retract ?a ?b) (assert (grupe-de-verificat $?gs) (faza selectare-simptome-de-interogat)) ) (defrule nu-se-verifica-simptom-valoare (faza verifica-simptome) ?a <- (simptome-de-verificat $?ts1 ?s $?ts2) (simptom-pb (nume ?n) (ID ?s) (tip val) (valoare $?vals) (relevanta ?r)) (simptom-pacient (nume ?n) (valoare ?vp&:(not(member$ ?vp $?vals))) (incredere ?ip)) ?b <- (grupe-de-verificat ?g $?gs) ; (pacient (nume ?np) (fisa $?s-fisa)) => (retract ?a ?b) (assert (grupe-de-verificat $?gs) (faza selectare-simptome-de-interogat)) ) (defrule solicita-informatii-despre-un-simptom-nou-si-verific-valoare (declare (salience -10)) (faza verifica-simptome) ?a <- (simptome-de-verificat ?s $?ts) (simptom-pb (nume ?n) (ID ?s) (tip val) (valoare $?vals) (relevanta ?r) (intrebare $?intreb)) ?b <- (pacient (nume ?np) (fisa $?s-fisa)) ?c <- (grupe-de-verificat ?g $?gs) => (retract ?a) (printout t $?intreb ) (bind ?rasp (read)) (if (member$ ?rasp $?vals) then (printout t "Pe o scara de la 0 la 100 spune-mi cit de sigur esti de aceasta valoare? ") (bind ?vi (read)) (bind ?sim (gensym)) (assert (simptom-pacient (nume ?n) (ID ?sim) (valoare ?rasp) (incredere ?vi)) (simptome-de-verificat $?ts)) (modify ?b (fisa $?s-fisa ?sim)) else (retract ?c) (assert (grupe-de-verificat $?gs) (faza selectare-simptome-de-interogat)) ) ) (defrule solicita-informatii-despre-un-simptom-nou-si-verific-interval (declare (salience -10)) (faza verifica-simptome) ?a <- (simptome-de-verificat ?s $?ts) (simptom-pb (nume ?n) (ID ?s) (tip int) (interval ?min ?max) (relevanta ?r) (intrebare $?intreb)) ?b <- (pacient (nume ?np) (fisa $?s-fisa)) ?c <- (grupe-de-verificat ?g $?gs) => (retract ?a) (printout t $?intreb ) (bind ?rasp (read)) (if (and (>= ?rasp ?min) (<= ?rasp ?max)) then (printout t "Pe o scara de la 0 la 100 spune-mi cit de sigur esti de aceasta valoare? ") (bind ?vi (read)) (bind ?sim (gensym)) (assert (simptom-pacient (nume ?n) (ID ?sim) (valoare ?rasp) (incredere ?vi)) (simptome-de-verificat $?ts)) (modify ?b (fisa $?s-fisa ?sim)) else (retract ?c) (assert (grupe-de-verificat $?gs) (faza selectare-simptome-de-interogat)) ) ) (defrule selecteaza-o-grupa-descendent ?f <- (faza verifica-simptome) ?a <- (simptome-de-verificat) ?c <- (grupe-de-verificat ?g $?gs) (grup-boli (nume ?ng) (ID ?g) (descendenti $?desc)) => (retract ?a ?f ?c) (assert (grupe-de-verificat $?desc $?gs) (faza selectare-simptome-de-interogat)) ) (defrule afiseaza-un-diagnostic ?f <- (faza verifica-simptome) ?a <- (simptome-de-verificat) ?c <- (grupe-de-verificat ?g $?gs) (grup-boli (nume ?ng) (ID ?g) (descendenti)) => (retract ?a ?f ?c) (printout t "Ai boala " ?ng "!!!!" crlf) (assert (grupe-de-verificat $?gs) (faza selectare-simptome-de-interogat)) )