;Ejercicio 22 (deftemplate Medabot (slot chasis (type SYMBOL) (allowed-symbols C100 C200 C300 C400 C500) ) (slot ranuras (type INTEGER) (range 1 4) ) (slot energia (type INTEGER) (range 4 9) ) (slot precio (type INTEGER) (range 2000 3500) ) ) (deftemplate Dispositivo (slot nombre (type STRING) (default ?NONE) ) (slot energia (type INTEGER) (range 1 6) ) (slot precio (type INTEGER) (range 50 800) ) ) (deftemplate Configuracion (slot chasis (type SYMBOL) (allowed-symbols C100 C200 C300 C400 C500) ) (multislot dispositivos (type STRING) (default ?NONE) ) ) (deffacts inicio (Medabot (chasis C100 ) (ranuras 1) (energia 4) (precio 2000)) (Medabot (chasis C200 ) (ranuras 2) (energia 5) (precio 2500)) (Medabot (chasis C300 ) (ranuras 3) (energia 7) (precio 3000)) (Medabot (chasis C400 ) (ranuras 2) (energia 8) (precio 3000)) (Medabot (chasis C500 ) (ranuras 4) (energia 9) (precio 3500)) (Dispositivo (nombre "Zaptron") (energia 2) (precio 100)) (Dispositivo (nombre "Recodificador") (energia 6) (precio 800)) (Dispositivo (nombre "Megainductor") (energia 1) (precio 300)) (Dispositivo (nombre "Separador") (energia 3) (precio 200)) (Dispositivo (nombre "Ondatronic") (energia 4) (precio 150)) (Dispositivo (nombre "Buzzer") (energia 2) (precio 50)) (Dispositivo (nombre "Excelerator") (energia 3) (precio 400)) (Configuracion (chasis C200) (dispositivos "Zaptron" "Recodificador")) ) ; En el primer paso creamos unos hechos auxiliares para obtener información ; sin modificar el hecho principal (defrule iniciar ?f1<-(initial-fact) (Configuracion (chasis ?c) (dispositivos $?d)) => (retract ?f1) (assert (chasis ?c)) (assert (dispositivos $?d)) (assert (numero-dispositivos (length$ $?d))) ) ; Primeramente calculamos el precio del chasis y la energia necesaria (defrule calcular-precio-1 (chasis ?c) (Medabot (chasis ?c) (ranuras ?rr) (energia ?e) (precio ?p)) => (assert (precio ?p)) (assert (energia ?e 0)) ) ; A continuación calculamos el precio de los dispositivos (defrule calcular-precio-2 ?f1<-(dispositivos ?d $?r) ?f2<-(precio ?p) ?f3<-(energia ?ee ?e) (Dispositivo (nombre ?d) (energia ?e2) (precio ?p2)) => (retract ?f1 ?f2 ?f3) (assert (precio (+ ?p ?p2))) (assert (energia ?ee (+ ?e ?e2))) (assert (dispositivos $?r)) ) (defrule mostrar-datos ?f1<-(precio ?p) (energia ?ee ?e) (numero-dispositivos ?n) ?f2<-(dispositivos $?d) => (retract ?f1 ?f2) (printout t "Datos de la Configuración" crlf) (printout t "-------------------------" crlf) (printout t "Número de dispositivos: " ?n crlf) (printout t "Energía requerida: " ?e crlf) (printout t "Precio: " ?p crlf) ) (defrule mostrar-errores-ranuras ?f1<-(chasis ?c) ?f2<-(numero-dispositivos ?n) (Medabot (chasis ?c) (ranuras ?r) (energia ?e) (precio ?p)) (test (> ?n ?r) ) => (retract ?f1 ?f2) (printout t crlf "Error: El chasis posee " ?r " ranura(s) y la configuración" crlf) (printout t "necesita " ?n " ranuras" crlf) ) (defrule mostrar-errores-energia ?f1<-(energia ?e1 ?e2) (test (< ?e1 ?e2) ) => (retract ?f1) (printout t crlf "Error: El chasis genera " ?e1 " unidades de energía y la configuración" crlf) (printout t "necesita " ?e2 " unidades de energía" crlf) ) (defrule config-correcta ?f1<-(energia ?e1 ?e2) ?f2<-(chasis ?c) ?f3<-(numero-dispositivos ?n) => (retract ?f1 ?f2 ?f3) (printout t crlf "Configuración correcta" crlf) )