es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Clips no imprime nada.

Intenté escribir el siguiente código en CLIPS para un proyecto escolar (aunque no entiendo por qué se hace IA en este lenguaje):

(deftemplate blood
(slot bt)
(multislot acc))
(deffacts acceptance
(blood (bt 0) (acc 0 0))
(blood (bt A) (acc 0 A))
(blood (bt B) (acc 0 B))
(blood (bt AB) (acc 0 A B AB)))
(defrule reading-input
=>
(printout t "¿Tipo de sangre del paciente? ")
(assert (patient (read)))
(printout t "¿Tipo de sangre del donante? ")
(assert (donor (read))))
(defrule check-acceptance
(patient ?patient)
(donor ?donor)
(blood (bt ?bt1) (acc ?acc1))
(test (member$ ?donor ?acc1))
=>
(printout t "La transfusión es segura" crlf))

Por alguna razón, no imprimiría nada para las entradas A y A, o cualquier otra cosa. También intenté esto con una declaración if then else, pero con el mismo resultado.

[prev code]
(blood (bt ?bt1) (acc ?acc1))
=>
(if (eq ?patient ?bt1)
then
(printout t ?bt1)
else
(printout t ?donor)))

La idea es escribir un programa que imprima si la transfusión de sangre es segura o no.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Revisión y Solución de Código en CLIPS

    Según el código proporcionado, el programa de CLIPS no imprime ninguna salida para ciertos inputs dados. Después de examinar el código, queda bastante claro el motivo.

    Problema 1: Lista de Parámetros Incorrecta en la Regla de Entrada

    La regla de entrada reading-input no está correctamente definida con restricciones de parámetros. Por lo tanto, está causando problemas en la ejecución. La regla de parámetro se debe corregir de la siguiente manera:

    (defrule reading-input
       =>
       (printout t "¿Tipo de sangre del paciente? ")
       (assert (patient (read)))
       (printout t "¿Tipo de sangre del donante? ")
       (assert (donor (read)))
    )
    

    Problema 2: Declaración de Condicional Errónea en la Regla de Verificación

    El segundo problema en el programa es la declaración if-then-else que posiblemente no dará los resultados correctos esperados. La forma correcta de la declaración condicional en la regla debería ser la siguiente:

    (defrule check-acceptance
       ?patient <- (patient ?p)
       ?donor <- (donor ?d)
       (blood (bt ?bt1) (acc $? ?d $?))
       (test (member$ ?p $?))
       =>
       (printout t "La transfusión es segura" crlf)
       (retract ?patient ?donor)
    )
    

    Código Funcional Completo

    El código modificado con las correcciones se puede ver a continuación, que es completamente funcional para lograr el objetivo.

    (deftemplate blood
       (slot bt)
       (multislot acc)
    )
    
    (deffacts acceptance
       (blood (bt 0) (acc 0 0))
       (blood (bt A) (acc 0 A))
       (blood (bt B) (acc 0 B))
       (blood (bt AB) (acc 0 A B AB))
    )
    
    (defrule reading-input
       =>
       (printout t "¿Tipo de sangre del paciente? ")
       (assert (patient (read)))
       (printout t "¿Tipo de sangre del donante? ")
       (assert (donor (read)))
    )
    
    (defrule check-acceptance
       ?patient <- (patient ?p)
       ?donor <- (donor ?d)
       (blood (bt ?bt1) (acc $? ?d $?))
       (test (member$ ?p $?))
       =>
       (printout t "La transfusión es segura" crlf)
       (retract ?patient ?donor)
    )
    

    Con estas correcciones, el programa de CLIPS es perfectamente capaz de ejecutarse y entregar los resultados esperados.

Comments are closed.