INFORMATICA APLICADA
PRACTICA 3: Fundamentos de CLIPS
Ejercicio 5.2. Sensores de alarma
5.2.1. Planteamiento del problema
Se pretende crear un SE que controle un sencillo sistema de alarma formado por diez
sensores, que emita un mensaje de aviso si tres o más sensores dan fallo.
El programa será interactivo, de forma que nos pida el estado de los diez sensores.
Una vez introducidos los datos, si hay tres o más sensores que den fallo, se produce el
mensaje. Para evitar que éste mensaje se muestre más de una vez (esto
ocurrirá cuando haya más de tres sensores con fallo), lo que hacemos es abandonar
el programa en cuanto se active la regla de aviso por primera vez.
Para el diseño del SE, definimos una plantilla, llamada sensor, con dos campos:
numero-sensor y estado-sensor.
5.2.2. Reglas
- activa-pregunta: Se dispara con initial-fact, y su cometido es poner en marcha una especie de
contador.
;
; Regla activa-pregunta
;
(defrule activa-pregunta
(initial-fact)
=>
(assert (cuenta 1))
)
- pide-datos: siempre que no exista el hecho cuenta 11 (es decir, hemos llegado hasta el sensor
10), nos preguntará el estado del sensor, e incrementará el "contador".
;
; Regla pide-datos
;
(defrule pide-datos
(cuenta ?c)
(test (neq ?c 11))
=>
(printout t "Estado del sensor " ?c ": " )
(bind ?e (read))
(assert (sensor (numero-sensor ?c) (estado-sensor ?e)))
(bind ?nc (+ ?c 1))
(assert (cuenta ?nc))
)
- diagnóstico: comprueba si hay al menos tres sensores con fallo, en cuyo caso nos
muestra el mensaje de aviso, ejecuta un (reset) para evitar que se duplique el mensaje y abandona
la ejecución.
;
; Regla diagnostico
;
(defrule diagnostico
(cuenta 11)
(sensor (numero-sensor ?n1) (estado-sensor m | M))
(sensor (numero-sensor ?n2) (estado-sensor m | M))
(sensor (numero-sensor ?n3) (estado-sensor m | M))
(test (neq ?n1 ?n2))
(test (neq ?n1 ?n3))
(test (neq ?n2 ?n3))
=>
(printout t "ALARMA el sistema esta fallando" crlf)
(reset)
(halt)
)
[Código del programa]
[Siguiente Ejercicio]
[Indice General]
Práctica realizada por Juan José Cruz Jiménez
e-mail: i42crjij@uco.es