Well, the title says it all I'm a student and I was sent to make an expert system in CLIPS with 100 questions. So I decided to do 10 main questions (let's call them A, B, C, D, E, F, G, H, I, J) and each one is broken down (A1, B1, C1, D1, E1, F1, G1, H1 , I1, J1) then if A1 is true must come A2 and then A3 and so, but I do not know how to do it if I start it right. First A if I say B does not come and if I say if B1 comes but if in B1 I say whether or not it jumps to C and loses the order. Here I leave a photo and all the code. I wait for your help :c
(sorry if my English is bad)
;;;==============================================================
;;; Sistema Experto de Triaje
;;;
;;; CLIPS Version 6.3 Example
;;;==============================================================
;;*************************
;;*DEFINICION DE FUNCIONES*
;;*************************
(deffunction preguntas (?pregunta $?valor)
(printout t ?pregunta)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta)))
(while (not (member ?respuesta ?valor)) do
(printout t ?pregunta)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta))))
?respuesta)
(deffunction si-o-no-p (?pregunta)
(bind ?responde (preguntas ?pregunta si no s n))
(if (or (eq ?responde si) (eq ?responde s))
then si
else no))
;;;********************
;;;*REGLAS DE CONSULTA*
;;;********************
(defrule determina-emergencia ""
(not (usuario-emergencia ?))
(not (color ?))
=>
(assert (usuario-emergencia (si-o-no-p "¿Posee el paciente emergencia alguna? (Si/No)"))))
(defrule determina-signos ""
(usuario-emergencia si)
(not (usuario-vivo ?))
(not (color ?))
=>
(assert (usuario-vivo (si-o-no-p "¿Posee el paciente signos vitales? (Si/No)"))))
(defrule determina-sangre ""
(usuario-vivo si)
(not (color ?))
=>
(assert (usuario-sangre (si-o-no-p "¿Tiene el paciente insiciones o hemorragias? (Si/No)"))))
(defrule determina-combulsion ""
(usuario-vivo si)
(usuario-sangre no)
(not (color ?))
=>
(assert (usuario-combulsion (si-o-no-p "¿Tiene el paciente estado de combulsion alguno? (Si/No)"))))
(defrule determina-conciencia ""
(usuario-vivo si)
(usuario-sangre no)
(usuario-combulsion no)
(not (color ?))
=>
(assert (usuario-conciente (si-o-no-p "¿Esta el paciente en estado conciente? (Si/No)"))))
(defrule determina-quemadura ""
(usuario-vivo si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(not (color ?))
=>
(assert (usuario-quemadura (si-o-no-p "¿Tiene el paciente quemaduras? (Si/No)"))))
(defrule determina-dolor ""
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(not (color ?))
=>
(assert (usuario-dolor (si-o-no-p "¿Posee el paciente dolor alguno? (Si/No)"))))
(defrule determina-toxico ""
(usuario-vivo si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor no)
(not (color ?))
=>
(assert (usuario-toxico (si-o-no-p "¿Ha ingerido el paciente alguna sustancia toxica? (Si/No)"))))
(defrule determina-vomito ""
(usuario-vivo si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor no)
(usuario-toxico no)
(not (color ?))
=>
(assert (usuario-vomito (si-o-no-p "¿Posee el paciente vomitos severos y persistentes? (Si/No)"))))
(defrule determina-respiracion ""
(usuario-vivo si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor no)
(usuario-toxico no)
(usuario-vomito no)
(not (color ?))
=>
(assert (usuario-respiracion (si-o-no-p "¿Tiene el paciente dificultad al respirar en estado de reposo?(Si/No)"))))
(defrule determina-enfermedad ""
(usuario-vivo si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor no)
(usuario-toxico no)
(usuario-vomito no)
(usuario-respiracion no)
(not (color ?))
=>
(assert (usuario-enfermedad (si-o-no-p "¿Considera que el paciente esta enfermo? (Si/No)"))))
;;============
;;=Emorragias=
;;============
(defrule determina-tipo-sangre ""
(usuario-sangre si)
(not (color ?))
=>
(assert (usuario-tipo-sangre (preguntas "¿Puede definir el tipo de hemorragia? Externa(Heridas)/Exteriorizada(sangre que sale por los orificios del cuerpo)" externa exteriorizada))))
(defrule determina-zona-sangre ""
(usuario-sangre si)
(usuario-sangre-tipo exteriorizada)
(not (color ?))
=>
(assert (usuario-zona-sangre (preguntas "¿Puede expecificar por donde emerge la hemorragia? Boca/Nariz/Recto/Vagina/uretra/Oido/Ojo" boca nariz recto vagina uretra oido ojo))))
(defrule determina-boca-sangre ""
(usuario-sangre si)
(usuario-sangre-tipo exteriorizada)
(usuario-zona-sangre boca)
(not (color ?))
=>
(assert (usuario-boca-sangre (preguntas "¿De que manera expulsa sangre por la boca? Tosiendo/Vomitando" tosiendo vomitando))))
(defrule determina-sangre-externa ""
(usuario-sangre si)
(usuario-sangre-tipo externa)
(not (color ?))
=>
(assert (usuario-sangre-externa (preguntas "¿De que manera se ha producido la herida? Vehicular/Caida/Agresion" vehicular caida agresion))))
;;============
;;=Combulsion=
;;============
(defrule determina-tiempo-combulsion ""
(usuario-vivo si)
(usuario-combulsion si)
(not (color ?))
=>
(assert (usuario-tiempo-combulsion (preguntas "¿Hace cuanto fue la ultima combulsion? Recientemente/1h/4h/8h/Ayer" recientemente 1h 4h 8h ayer))))
;;============
;;=Quemaduras=
;;============
(defrule determina-tipo-quemadura ""
(usuario-vivo si)
(usuario-quemadura si)
(not (color ?))
=>
(assert (usuario-tipo-quemadura (preguntas "¿Puede definir el grado de la quemadura? Primera/Segunda/Tercera" primera segundo tercera))))
;;=======
;;=Dolor=
;;=======
(defrule determina-tipo-dolor ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(not (color ?))
=>
(assert (usuario-tipo-dolor (preguntas "¿Que tipo de dolor padece? Muscular/Oseo/Cefalico/Visceral" muscular oseo cefalico visceral))))
;;========
;;=DolorM=
;;========
(defrule determina-sintoma-dolor-m ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor muscular)
(not (color ?))
=>
(assert (usuario-sintoma-M (preguntas "¿Posee sintomas como Hinchazon/Enrojecimiento/Erupcion/Entumecimiento?" hinchazon enrojecimiento erupcion entumecimiento))))
(defrule determina-esguince ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor muscular)
(usuario-sintoma enrojecimiento)
(usuario-sintoma entumecimiento)
(not (color ?))
=>
(assert (usuario-esguince (si-o-no-p "¿Considera usted que posee un esguince ?(Si/No)"))))
;;========
;;=DolorO=
;;========
(defrule determina-cancer ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor oseo)
(not (color ?))
=>
(assert (usuario-cancer (si-o-no-p "¿Tiene usted cancer en los huesos o posee antecedentes familiares?(Si/No)"))))
(defrule determina-columna ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor oseo)
(not (color ?))
=>
(assert (usuario-columna (si-o-no-p "¿Su dolor radica en la columna?(Si/No)"))))
(defrule determina-sintoma-dolor-o ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor oseo)
(usuario-cancer no)
(usuario-columna si)
(usuario-columna no)
(not (color ?))
=>
(assert (usuario-sintoma-o (preguntas "¿cual considera que es su caso Fractura/Gangrena(falta de sangre)/Infeccion/Dislocacion?" fractura gangrena infeccion dislocacion))))
(defrule determina-zona-fractura ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor oseo)
(usuario-cancer no)
(usuario-columna no)
(not (color ?))
=>
(assert (usuario-zona-fractura (preguntas "¿En que region se encuentra la fractura? Brazos/Piernas/Torso/Espalda/Cabeza" brazos piernas torso espalda cabeza ))))
(defrule determina-fractura ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor oseo)
(usuario-sintoma-o fractura)
(usuario-zona-fractura brazo)
(usuario-zona-fractura piernas)
(not (color ?))
=>
(assert (usuario-fractura (si-o-no-p "¿El hueso emerge del cuerpo?(Si/No)"))))
;;==========
;;=Visceral=
;;==========
(defrule determina-sintoma-dolor-v ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor visceral)
(not (color ?))
=>
(assert (usuario-sintoma-dolor-v (preguntas "¿En que region posee el dolor Toracica/Abdominal/Genital?" Toracica Abdominal Genital))))
(defrule determina-dolor-abdomen ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor visceral)
(usuario-sintoma-dolor-v abdominal)
(not (color ?))
=>
(assert (usuario-abdomen (preguntas "¿En que region se intencifica el dolor Superior/Inferior/Derecha/Izquierda?" superior inferior derecha izquierda ))))
(defrule determina-organo ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor visceral)
(usuario-sintoma-dolor-v toracica)
(not (color ?))
=>
(assert (usuario-organo (preguntas "¿Considera que su dolor se relaciona con los pulmones o con el corazon?" corazon pulmones ))))
(defrule determina-dificultad ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor visceral)
(usuario-sintoma-o fractura)
(usuario-sintoma-dolor-v toracica)
(not (color ?))
=>
(assert (usuario-dificultad (si-o-no-p "¿Tiene dificultad al respirar?(Si/No)"))))
(defrule determina-caida ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor visceral)
(usuario-sintoma-o fractura)
(usuario-sintoma-dolor-v toracica)
(usuario-respiracion si)
(usuario-respiracion no)
(not (color ?))
=>
(assert (usuario-caida (si-o-no-p "¿Ha sufrido caidas o recibido golpes recientes?(Si/No)"))))
;;;=========
;;;=Genital=
;;;=========
(defrule determina-genital ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor genital)
(not (color ?))
=>
(assert (usuario-genital (si-o-no-p "¿Considera usted que se trata de una infeccion presenta irritacion erupcion o sintomas similares?(Si/No)"))))
(defrule determina-orina ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor genital)
(not (color ?))
=>
(assert (usuario-orina (si-o-no-p "¿Ha orinado sangre?(Si/No)"))))
(defrule determina-gestacion ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor genital)
(not (color ?))
=>
(assert (usuario-gestacion (si-o-no-p "¿Se encuentra usted en estado de gestacion (Embarazo)?(Si/No)"))))
;;==========
;;=Cefalico=
;;==========
(defrule determina-sintoma-dolor-c ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor cefalico)
(not (color ?))
=>
(assert (usuario-region-dolor-c (preguntas "¿En que region se intencifica el dolor Frente/Cuello/Nariz/Cerebro?" frente cuello nariz cerebro))))
(defrule determina-mucosa ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor cefalico)
(usuario-region-dolor-c frente)
(usuario-region-dolor-c nariz)
(not (color ?))
=>
(assert (usuario-mucosa (si-o-no-p "¿Posee dificultad para respirar u ojos rojizos o llorosos?(Si/No)"))))
(defrule determina-migraña ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor cefalico)
(usuario-region-dolor-c cerebro)
(not (color ?))
=>
(assert (usuario-migraña (si-o-no-p "¿Considera usted que el dolor interfiere con sus actividades diarias ?(Si/No)"))))
(defrule determina-vision ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor cefalico)
(usuario-region-dolor-c cerebro)
(usuario-migraña si)
(not (color ?))
=>
(assert (usuario-vision(si-o-no-p "¿Presenta sintomas como perdida de vision problemas al habla o mala articulacion?(Si/No)"))))
(defrule determina-cuello-debil ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor cefalico)
(usuario-region-dolor-c cuello)
(not (color ?))
=>
(assert (usuario-cuello-debil (si-o-no-p "¿Siente debilidad en los brazos u hombros ?(Si/No)"))))
(defrule determina-rotacion ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor cefalico)
(usuario-region-dolor-c cuello)
(usuario-cuello-debil no)
(not (color ?))
=>
(assert (usuario-rotacion (si-o-no-p "¿Puede rotar el cuello con facilidad?(Si/No)"))))
(defrule determina-cuello ""
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-dolor si)
(usuario-tipo-dolor cefalico)
(usuario-region-dolor-c cuello)
(usuario-cuello-debil no)
(usuario-rotacion no)
(not (color ?))
=>
(assert (usuario-cuello (si-o-no-p "¿Esta su dolor asociado con la garganta?(Si/No)"))))
(defrule determina-cuello-sintoma ""
(usuario-cuello si)
(usuario-vivo si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(not (color ?))
=>
(assert (usuario-cuello-sintoma (si-o-no-p "¿Presenta sintomas como falta del habla o dificultad al tragar?(Si/No)"))))
(defrule determina-cuello-columna ""
(usuario-cuello-debil si)
(usuario-conciencia si)
(usuario-sangre no)
(usuario-combulsion no)
(usuario-conciente si)
(usuario-quemadura no)
(usuario-rotacion si)
(not (color ?))
=>
(assert (usuario-cuello-columna (si-o-no-p "¿Relaciona usted el dolor con la columna?(Si/No)"))))
;;=========
;;=Toxicos=
;;=========
(defrule determina-tipo-toxico ""
(usuario-toxico si)
(not (color ?))
=>
(assert (usuario-tipo-toxico (si-o-no-p "¿Ha ingerido elementos como Gasolina Cloro o Detergentes?(Si/No)"))))
(defrule determina-toxico-daños ""
(usuario-toxico si)
(usuario-tipo-toxico no)
(not (color ?))
=>
(assert (usuario-daños (si-o-no-p "¿Presenta perdida de vision/Dolor de garganta/Ardor en los ojos, nariz o labios?(Si/No)"))))
(defrule determina-sangre-heces ""
(usuario-toxico si)
(usuario-daños no)
(not (color ?))
=>
(assert (usuario-haces (si-o-no-p "¿Presenta sangre en las heces?(Si/No)"))))
(defrule determina-toxico-vomitos ""
(usuario-toxico si)
(usuario-daños no)
(usuario-haces no)
(not (color ?))
=>
(assert (usuario-vomitos (si-o-no-p "¿Ha presentado vomitos?(Si/No)"))))
(defrule determina-toxico-inflamacion ""
(usuario-toxico si)
(usuario-daños no)
(usuario-haces no)
(usuario-vomitos no)
(not (color ?))
=>
(assert (usuario-inflamacion (si-o-no-p "¿Posee dificultad respiratoria o inflamacion en la garganta?(Si/No)"))))
(defrule determina-huecos ""
(usuario-toxico si)
(usuario-daños no)
(usuario-haces no)
(usuario-vomitos no)
(usuario-inflamacion)
(not (color ?))
=>
(assert (usuario-huecos (si-o-no-p "¿Presenta irritacion u orificion en al piel?(Si/No)"))))
;;======
;;=Azul=
;;======
(defrule determina-actividad ""
(usuario-emergencia no)
(not (color ?))
=>
(assert (usuario-actividad (si-o-no-p "¿Viene a entregar documentos como resultados u otros? (Si/No)"))))
;;;**************
;;;*DIAGNOSTICOS*
;;;**************
(defrule estado-vivo ""
(usuario-emergencia si)
(usuario-vivo no)
(not (color ?))
=>
(assert (color "Codigo Rojo")))
(defrule estado-inutil ""
(usuario-emergencia no)
(usuario-actividad no)
(not (color ?))
=>
(assert (color "Por favor no moleste")))
(defrule no-color ""
(declare (salience -20))
(not (color ?))
=>
(assert (color "Lo lamento no estoy capacitado para ayudarlo")))
;;;************************
;;;*REGLAS DE CONCLUCIONES*
;;;************************
(defrule system-banner ""
(declare (salience 20))
=>
(printout t crlf crlf)
(printout t "Sistema Experto de Triaje")
(printout t crlf crlf))
(defrule print-color ""
(declare (salience 20))
(color ?item)
=>
(printout t crlf crlf)
(printout t "Su color es:")
(printout t crlf crlf)
(format t " %s%n%n%n" ?item))
If you run up to the point that you expect the determina-zona-sangre rule to execute, you can enter a matches command for that rule and see that the second pattern is unmatched. A facts command shows that the last fact asserted is (usuario-tipo-sangre exteriorizada). The rule however matches (usuario-sangre-tipo exteriorizada). Since the fact doesn't match the pattern, the rule will not be executed.