1ª parte Mtl. Lourdes Cahuich - http://yo-te-ayudo.com El lenguaje de sistema experto que se utilizará es CLIPS, que soporta tres tipos de paradigmas de programación: basado en reglas, orientado a objetos y por procedimiento. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Componentes básicos de un sistema experto basado en reglas Lista de hechos: contiene los datos de los que se derivan las inferencias Base de conocimiento: comprende todas las reglas Mecanismo de inferencia: controla la ejecución global Mtl. Lourdes Cahuich - http://yo-te-ayudo.com HECHOS Con el fin de resolver problemas, un programa de CLIPS debe tener datos e información con la que pueda razonar, a cada “fragmento” de información se le llama hecho. Los hechos constan de un nombre de relación (un campo simbólico) seguido por cero o más ranuras (slots) y sus valores asociados. El siguiente ejemplo es un hecho Mtl. Lourdes Cahuich - http://yo-te-ayudo.com (persona (nombre Juan) (edad 20) (color-ojos azul) (color-pelo cafe) ) Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Todo el hecho, además de cada ranura, está delimitado por un paréntesis izquierdo de apertura y uno derecho de cierre. El símbolo persona es el nombre de relación del hecho y éste contiene cuatro ranuras “slots” nombre, edad, color-ojos y color-pelo. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com La construcción plantillas de definición Antes de que puedan crearse los hechos, CLIPS debe tener información sobre la lista de ranuras válidas para un nombre de relación determinado. Los grupos de hechos que comparten el mismo nombre de relación y contiene información común pueden describirse utilizando la construcción plantillas de definición o deftemplates Mtl. Lourdes Cahuich - http://yo-te-ayudo.com La construcción plantillas de definición es análoga a una estructura de registro en un lenguaje como Pascal. El formato general de una plantilla de definición es: (deftemplate<nombre-relación> [<comentario-opcional>] <definición-ranura>*) Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Utilizando esta sintaxis, el hecho persona puede describirse con la siguiente deftemplate: (deftemplate persona “Una deftemplate de ejemplo” (slot nombre) (slot edad) (slot color-ojos) (slot color-pelo) ) Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en CLIPS Mtl. Lourdes Cahuich - http://yo-te-ayudo.com 2ª parte Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Hechos ordenados A los hechos con un nombre de relación que tienen una plantilla de definición correspondiente se les llama «hechos de plantilla de definición». A los hechos con un nombre de relación que no la tiene se les llama «hechos ordenados». Estos tienen implícita una sola ranura de varios campos que se utiliza para almacenar todos los valores que se encuentran después del nombre de relación. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Cada vez que CLIPS encuentra un hecho ordenado, crea automáticamente una plantilla de definición implícita para este hecho (opuesto a cuando hacemos una plantilla explícita). Como un hecho ordenado sólo tiene una ranura, no se requiere el nombre de ésta para definirlo, por ejemplo, una lista de números podría estar representada por el siguiente hecho: (número-lista 7 9 3 4 20) Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Por lo general los hechos de plantilla de definición deben usarse cada vez que sea posible, por que los nombres de ranura hacen que los hechos sean más legibles y que resulte más fácil trabajar con ellos. Solo hay dos casos done los hechos ordenados resultan útiles: primero, los hechos que sólo incluyen un nombre de relación son útiles como marcas. En segundo lugar, para hechos que contienen una sola ranura, el nombre de ésta suele ser sinónimo del nombre de relación. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Comando WATCH, construcción DEFFACTS Mtl. Lourdes Cahuich - http://yo-te-ayudo.com watch El comando watch es útil para depurar programas. La sintaxis de este comando es: (watch <elemento-observado>) Donde <elemento-observado> es uno de los hechos, reglas, actuaciones, estadísticas recopiladas, enfoque o todo. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com watch Estos elementos pueden observarse en cualquier combinación para proporcionar la cantidad apropiada de información de la depuración. El comando watch puede utilizarse más de una vez para observar más de una función de la ejecución de CLIPS con la palabra “all” puede utilizarse para habilitar todas sus funciones. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com watch Si se están observando los hechos, CLIPS imprimirá automáticamente un mensaje que indica que se ha hecho una actualización de la lista de hechos cada vez que alguno se afirma o se retira. El siguiente diálogo de comandos ilustra el uso de este comando de depuración (retomando los ejemplos del tutorial anterior). Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Mtl. Lourdes Cahuich - http://yo-te-ayudo.com watch La secuencia de caracteres <== indica que se está retirando el hecho previo, y ==> indica que se está afirmando el nuevo. Los efectos de un comando watch pueden desactivarse utilizando el comando correspondiente unwatch, cuya sintaxis es: (unwatch <elemento-observado>) Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Mtl. Lourdes Cahuich - http://yo-te-ayudo.com La construcción DEFFACTS Mtl. Lourdes Cahuich - http://yo-te-ayudo.com DEFFACTS A menudo es conveniente tener la capacidad de afirmar automáticamente un conjunto de hechos en lugar de escribir las mismas afirmaciones desde el nivel superior, sobre todo en hechos que se saben verdaderos antes de ejecutar un programa. La ejecución de casos de prueba para depurar un programa es un ejemplo en el que es útil afirmar automáticamente un grupo de hechos. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com DEFFACTS Los grupos de hechos que representan el conocimiento inicial pueden definirse utilizando la construcción deffacts. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com DEFFACTS Después de la palabra “deffacts”, se encuentra el nombre necesario para esta construcción . En el caso del ejemplo, el nombre elegido fue “persona”; después del nombre sigue un comentario adicional entre comillas. Después del nombre o comentario siguen los hechos que habrán de afirmarse en la lista de hechos. Mtl. Lourdes Cahuich - http://yo-te-ayudo.com RESET Los hechos de una instrucción de deffacts se afirman utilizando el comando “reset” de CLIPS, que elimina todos los hechos de la lista de hechos y luego afirma los hechos de la instrucción de deffacts existente. La sintaxis es: (reset) Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en la consola CLIPS Proyección de video complementario en youtube Mtl. Lourdes Cahuich - http://yo-te-ayudo.com Componentes de una regla Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas Con el fin de realizar trabajo útil, un sistema experto debe tener reglas y hechos. Ahora que se han analizado las afirmaciones y retractaciones de los hechos, es posible ver cómo funcionan las reglas. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas Las reglas pueden escribirse directamente en CLIPS o cargarse desde un archivo de reglas creado por un editor. Los ejemplos en este tutorial serán ingresados desde la línea de comandos de la consola CLIPS. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas Por ejemplo, consideremos los tipos de hechos y reglas que pueden utilizarse para vigilar y responder a un rango de urgencias posibles como un incendio o una inundación. A continuación se muestra el pseudocódigo para una de las posibles reglas del sistema experto de vigilancia de una planta industrial. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas SI la urgencia es un incendio ENTONCES la respuesta es activar el sistema anti incendios Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas Después de convertir el pseudo código en una regla, deben definirse las plantillas de definición para los tipos de hechos a los que hace referencia la regla. Una urgencia puede representarse mediante la siguiente deftemplate: Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas (deftemplate urgencia (slot tipo) ) En donde el campo “tipo” del hecho “urgencia” contendría símbolos como fuego, inundación e interrupción de energía. De igual manera, la respuesta puede representarse mediante la siguiente plantilla de definición: Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas (deftemplate respuesta (slot acción) ) Donde el campo “acción” del hecho “respuesta” indica la respuesta que se emprenderá. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Antes de introducir la regla mencionada en CLIPS hay que ingresar ambos deftemplates. Sin embargo, antes de introducir cualquiera de estas instrucciones, escriba el comando (clear) seguido por un enter en la línea de comandos. El comando “clear” se explicará a detalle posteriormente. Mtl Lourdes Cahuich - http://yo-te-ayudo.com (defrule urgencia-incendio “Una regla de ejemplo” (urgencia (tipo incendio) ) => (assert (respuesta (acción activar-sistema-antiincendios)))) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas Si la regla se introduce correctamente como se muestra, reaparecerá el indicador de comandos de CLIPS; de lo contrario, aparecerá un mensaje de error indicando muy probablemente que alguna palabra clave está mal escrita o que hay un paréntesis mal colocado. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas A continuación se muestra la misma regla, pero con comentarios añadidos para igualar sus partes. Los comentarios empiezan con punto y coma y continúan hasta un enter; CLIPS ignorará esta línea. Mtl Lourdes Cahuich - http://yo-te-ayudo.com ; Encabezado de regla (defrule urgencia-incendio “Una regla de ejemplo” ; Patrones (urgencia (tipo incendio) ) ;flecha ENTONCES => ; Acciones (assert (respuesta (acción activar-sistema-antiincendios)))) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas La regla completa debe ponerse entre paréntesis, al igual que cada uno de sus patrones y acciones, que puedan ser múltiples. Los paréntesis que rodean a los patrones y acciones deben equilibrarse de manera apropiada si están anidados. En la regla “incendio-urgencia” hay un patrón y una acción. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Formato de la regla 1. La regla debe empezar con la palabra clave “defrule” , seguida por su nombre, que puede ser cualquier palabra de CLIPS válida. Si se introduce una regla con un nombre que ya se ha asignado a otra, entonces la nueva regla reemplazará a la anterior. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Formato de la regla 2. Después del encabezado de la regla siguen cero o más elementos adicionales (EC). El tipo más simple de ellos es un “patrón EC” o solo “patrón”, cada uno consta de una o más restricciones destinadas a igualar los campos de un hecho de deftemplate. CLIPS trata de comparar los patrones de reglas con los hechos de la lista de hechos, si todos los patrones de una regla coinciden con los hechos, la regla se activa y se coloca en la “agenda”, que es la colección de reglas activadas, donde puede haber cero o más reglas Mtl Lourdes Cahuich - http://yo-te-ayudo.com Formato de la regla 3. Al símbolo => que sigue a los patrones de una regla se le llama “flecha”, se forma al escribir el signo de igual seguido del signo mayor que, y representa el principio de la parte “ENTONCES” de una regla SI… ENTONCES. A la parte de la regla que va antes de la flecha se le llama “lado izquierdo”, a la parte que va después de la flecha se le llama “lado derecho”. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas sin patrones Si una regla no tiene patrones, se agregará el patrón especial (hecho inicial), que se define automáticamente. Cualquier regla sin patrones al lado izquierdo se colocará en la agenda cuando se realice un “reset”. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Formato de la regla La última parte de la regla es la lista de acciones que se ejecutará cuando se “dispare” la regla, aunque no es obligatorio que una regla tenga acciones. CLIPS ordena las reglas de la agenda a partir de su prioridad y dispara la regla con mayor prioridad. La prioridad de una regla es un atributo entero llamado “prominencia, que se analiza con mayor detalle posteriormente. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Proyectar video youtube correspondiente Mtl Lourdes Cahuich - http://yo-te-ayudo.com Agenda y ejecución Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejecutar Es posible hacer que un programa de CLIPS se ejecute con el comando “run” que tiene la siguiente sintaxis: (run [<límite>]) Donde el argumento opcional <límite> es el número máximo de reglas que habrán de dispararse, pero si no se incluye <límite> o es igual a -1, se dispararán todas las reglas hasta que no quede ninguna en la agenda. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejecutar De lo contrario, la ejecución de las reglas cesará después de haber disparado el número <límite> de reglas. Cuando se ejecuta un programa de CLIPS, se dispara la regla en la agenda con mayor prominencia, si solo hay una regla en la agenda, ésa es la que se disparará. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejecutar Las reglas se activan cada vez que se igualan todos los patrones de regla mediante hechos. El proceso de igualación de patrones siempre se mantiene actualizado y se lleva a cabo independientemente de si los hechos se afirman antes o después de que se ha definido una regla. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reiniciar sistema Como las reglas requieren de los hechos para ejecutarse, el comando “reset” es el método clave para iniciar o reiniciar un sistema experto en CLIPS. Por lo general, los hechos asegurados con “reset” satisfacen los patrones de una o más reglas y colocan en agenda, las activaciones de estas reglas. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reiniciar sistema Entonces al aplicar el comando “run” se inicia la ejecución del programa. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com Lista de reglas en la agenda El comando “agenda” permite mostrar la lista de reglas en la agenda y su sintaxis es: (agenda) Si no hay activaciones en la agenda, re aparecerá el indicador de comandos. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Lista de reglas en la agenda Si la regla “incendio-urgencias” (del tutorial anterior) ha sido activada por el hecho “(urgencia (tipo incendio) )” con un índice de hecho “1”, un comando “agenda” producirá la siguiente salida: Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (reset) CLIPS> (assert (urgencia (tipo incendio))) <fact – 1> CLIPS> (agenda) 0 urgencia-incendio: f:1 For a total of 1 activation CLIPS> Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas y refracción Siguiendo el ejemplo, con la regla incendio-urgencia en la agenda, ahora el comando “run” provocará que se dispare la regla. El hecho (respuesta (acción activar-sistemaantiincendios)) se agregará a la lista de hechos como la acción de la regla, como se muestra a continuación: Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS>(run) CLIPS>(facts) f-0 (hecho inicial) f-1 (urgencia (tipo incendio)) f-2 (respuesta (acción activar-sistema-antiincendios)) For a total of 3 facts CLIPS> Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas y refracción ¿Qué pasa si se vuelve a aplicar el comando “run”? Hay una regla y un hecho la satisface, por lo que debería dispararse de nuevo, pero si se ejecuta de nuevo el comando “run” no producirá resultados. Al revisar la agenda comprobará que no se dispararon reglas por que no había reglas en ella. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Reglas y refracción La regla no se volvió a disparar debido a la manera en que está diseñado CLIPS, en éste las reglas muestran una propiedad llamada “refracción”, lo que significa que no se disparan más de una vez para un conjunto específico de hechos. Sin esto los sistemas expertos caerían en ciclos triviales disparando las mismas reglas sobre los mismos hechos. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Comando refresh Se puede usar el comando “refresh” como alternativa para que se vuelva a disparar la regla, ya que este comando vuelve a colocar en la agenda todas las activaciones que ya se han disparado para una regla (los hechos que desencadenaron la activación estarán presentes en la lista de hechos). (refresh <nombre-regla>) Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS>(agenda) CLIPS>(refresh incendio-urgencia) CLIPS>(agenda) 0 urgencia-incendio: f-1 For a total of 1 activation. CLIPS> Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com Observación de activaciones Si se están observando las activaciones, CLIPS imprimirá automáticamente un mensaje cada vez que se agregue o se elimine una activación a la agenda. Igual que con los hechos, la secuencia de caracteres <== indica que se está eliminando una activación y la secuencia ==> indica que se está agregando. Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (reset) CLIPS> (watch activations) CLIPS> (assert (urgencia (tipo incendio))) ==> Activation 0 urgencia-incendio: f-1 <Fact-1> CLIPS>(agenda) 0 urgencia-incendio: f-1 For a total of 1 activation CLIPS>(retract 1) <== Activation 0 urgencia-incendio: f-1 CLIPS>(agenda) CLIPS> Mtl Lourdes Cahuich - http://yo-te-ayudo.com Observación de activaciones Si se están observando las reglas, CLIPS imprimirá un mensaje cada vez que se dispare cada una de ellas. Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (reset) CLIPS> (watch rules) CLIPS> (assert (urgencia (tipo incendio))) ==> Activation 0 urgencia-incendio: f-1 <Fact-1> CLIPS> (run) FIRE 1 urgencia-incendio: f-1 CLIPS> (agenda) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Fire - disparar El número que sigue al símbolo FIRE indica cuántas reglas se han disparado desde que se proporcionó el comando “run” por ejemplo, si se disparó otra regla después de “urgencia-incendio”, sería precedida por “FIRE 2”. Después de imprimir el orden de disparo, se imprime el nombre de la regla, seguido por el índice de hecho que igualó los patrones de la regla. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Si se están observando estadísticas, al terminar una ejecución CLIPS imprimirá mensajes informativos como el siguiente: Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (unwatch all) CLIPS> (reset) CLIPS> (watch statistics) CLIPS> (assert (urgencia(tipo incendio))) <Fact-1> CLIPS> (run) 1 rules fired Run time is 0.02699999999993 seconds. 37.0370370371331 rules per second. 3 mean number of facts (3 maximum). 1 mean number of instances (1 maximum). 1 mean number of activations (1 maximum). CLIPS> (unwatch statistics) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Estadísticas Se observa que se imprimen seis estadísticas después de un comando “run”; así mismo se muestra el número total de reglas disparadas, la cantidad de tiempo en segundos que se requirió para dispararlas y el promedio de reglas disparadas pro segundo (la primera estadística dividida entre la segunda). El número entre paréntesis seguido por la palabra “maximum” indica el número más grande de hechos contenido en la lista de hechos para cualquier disparo de regla. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Proyectar video youtube correspondiente Mtl Lourdes Cahuich - http://yo-te-ayudo.com Comandos para el manejo de construcciones Mtl Lourdes Cahuich - http://yo-te-ayudo.com Despliegue de listas El comando “list-defrules” se utiliza para mostrar la lista actual de reglas mantenidas por CLIPS De manera similar los comandos “list-deftemplates” y “list-deffacts”, pueden utilizarse para mostrar respectivamente la lista actual de deftemplates o deffacts. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Sintaxis (list-defrules) (list-deftemplates) (list-deffacts) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com Despliegue de miembros de la construcción. Los comandos ppdefrule (pretty print defrule, defrule de impresión), ppdeftemplate (pretty print deftemplate, deftemplate de impresión) y ppdeffacts (pretty print deffacts, deffacts de impresión) se utilizan para mostrar las representaciones en texto de una defrule, una deftemplate y una deffacts, respectivamente. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Despliegue de un miembro de construcción (ppdefrule <nombre-defrule>) (ppdeftemplate <nombre-deftemplate>) (ppdeffacts <nombre-deffacts>) El único argumento de cada comando especifica el nombre de la defrule, deftemplate o deffacts que se mostrará. Cuando se despliega CLIPS pone diferentes partes de las construcciones en diferentes líneas para mejorar la legibilidad. Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (ppdefrule urgencia-incendio) (defrule MAIN::urgencia-incendio (urgencia (tipo incendio)) => (assert (respuesta (accion activar-sistemaantiincendio)))) CLIPS> (ppdeftemplate respuesta) (deftemplate MAIN::respuesta (slot accion)) CLIPS> (ppdeffacts urgencia) (deffacts MAIN::urgencia (tipo incendio)) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Despliegue El símbolo MAIN:: que precede a cada uno de los nombres de construcción indica el módulo en el que se han colocado las construcciones. Los módulos proporcionan un mecanismo para dividir una base de conocimiento. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Eliminación de un miembro de una construcción Los comandos undefrule, undeftemplate y undeffacts se utilizan para eliminar un defrule, una deftemplate y una deffacts, respectivamente. Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (undeffacts urgencia) CLIPS> (list-deffacts) initial-fact For a total of 1 deffacts. CLIPS> (list-defrules) urgencia-incendio For a total of 1 defrule. CLIPS> (undefrule urgencia-incendio) CLIPS> (list-defrules) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Eliminación Si se proporciona el símbolo * como un argumento para cualquiera de los comandos para eliminación de construcciones, entonces se eliminan todas las construcciones del tipo apropiado. El símbolo * también puede utilizarse con el comando retract para eliminar todos los hechos. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Eliminación Las construcciones que son utilizadas como referencia por otras construcciones, solo pueden eliminarse después de las segundas. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Eliminación de todas las construcciones del ambiente CLIPS El comando clear se utiliza para borrar toda la información contenida en el entorno de CLIPS, elimina todas las construcciones contenidas actualmente y todos los hechos de la lista de hechos. (clear) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Eliminación total Después de borrar el entorno CLIPS, el comando clear agrega la deffacts “initial-fact” al ambiente CLIPS. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Mtl Lourdes Cahuich - http://yo-te-ayudo.com Comando PRINTOUT Además de afirmar hechos, el lado derecho de las reglas puede utilizarse para imprimir información utilizando el comando printout. Ejemplo (defrule urgencia-incendio (urgencia (tipo incendio)) => (printout t “Activar el sistema antiincendios” clrf) ) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Imprimir en salida estándar La sintaxis es (printout <nombre-lógico> <imprimir-elementos>*) Donde “nombre-lógico” indica el destino de la salida del comando “printout”, <imprimir-elementos> son los cero o más elementos que habrán de imprimirse con este comando. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Imprimir en salida estándar Es muy importante incluir la letra “t” después del comando printout por que este argumento indica el destino de la salida, también conocido como “nombre lógico”. En este caso se indica a CLIPS que envíe la salida al dispositivo de salida estándar de la computadora. La palabra “crlf” obliga una reacción de “enter”, lo que mejora el aspecto de la salida. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Proyectar video youtube correspondiente Mtl Lourdes Cahuich - http://yo-te-ayudo.com El uso de varias reglas, comando set-break Mtl Lourdes Cahuich - http://yo-te-ayudo.com Hasta ahora sólo se han mostrado el tipo más simple de programa que contiene únicamente una regla. En realidad los sistemas prácticos pueden constar de cientos o miles de reglas. Veamos el ejemplo con más reglas. Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (deftemplate urgencia (slot tipo)) CLIPS> (deftemplate respuesta (slot accion)) CLIPS> (defrule incendio-urgencia (urgencia (tipo incendio)) => (printout t "Activar sistema antiincendios" crlf)) CLIPS> (defrule inundacion-urgencia (urgencia (tipo inundacion)) => (printout t "Apagar equipo electrico" crlf)) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Una vez que estas reglas se han introducido en CLIPS, la afirmación del hecho (urgencia (tipo incendio)) y luego la aplicación de un comando run, producirán la salida “activar sistema antiincendio”, en tanto que la afirmación del hecho (urgencia (tipo inundacion)) y la emisión de un comando run, producirán la salida “Apagar el equipo eléctrico”. Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (assert (urgencia (tipo incendio))) <Fact-1> CLIPS> (run) Activar sistema antiincendios CLIPS> (assert (urgencia (tipo inundacion))) <Fact-2> CLIPS> (run) Apagar equipo electrico Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com Si los incendios y las inundaciones son las únicas urgencias que deben controlarse, las reglas anteriores serán suficientes. Sin embargo el mundo real no es tan simple; no todos los incendios pueden extinguirse usando agua, tal vez algunos requieran extintores químicos. Si todas las situaciones se incluyen como reglas ¿ya se han cubierto todas las posibilidades? Mtl Lourdes Cahuich - http://yo-te-ayudo.com Por desgracia, la respuesta es no. En realidad las cosas no siempre funcionan a la perfección, y capturar todo el conocimiento pertinente en un sistema experto puede ser muy difícil. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com La mayor parte de la heurística real es demasiado complicada para expresarse con reglas de un solo patrón. Es posible utilizar reglas con más de un patrón para expresar estas condiciones. Retomando el ejemplo del sistema antiincendio: Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (deftemplate sistema-extintor (slot tipo) (slot estado)) CLIPS> (defrule incendio-clase-A-urgencia (urgencia (tipo incendio-clase-A)) (sistema-extintor (tipo aspersar-agua) (estado apagado)) => (printout t "Activar contra incendios de agua" crlf)) CLIPS> (defrule incendio-clase-B-urgencia (urgencia (tipo incendio-clase-B)) (sistema-extintor (tipo dioxido-carbono) (estado apagado)) => (printout t "Usar exintor de dioxido de carbono" crlf)) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ambas reglas tienen dos patrones, el primero determina que existe una urgencia de incendio y si éste es de clase A o B; el segundo patrón determina s se ha habilitado el extintor apropiado. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Es posible colocar cualquier número de patrones en una regla; lo importante es observar que la regla sólo se coloca en la agenda si los hechos satisfacen a todos los patrones; a este tipo de limitación se le llama elemento condicional y. Puesto que los patrones de todas las reglas están contenidos de manera implícita dentro de un elemento condicional “y”, la regla no se disparará si alguno de los patrones no se satisface. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS tiene un comando de depuración llamado “set- break” que permite detener la ejecución antes de que se dispare cualquier regla de un grupo específico. A una regla que detiene la ejecución antes de dispararse se le llama “punto de interrupción”. La sintaxis es: (set-break <nombre-regla>) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Considerando como ejemplo las siguientes reglas: CLIPS> (clear) CLIPS> (defrule primera => (assert (disparar segunda))) CLIPS> (defrule segunda (disparar segunda) => (assert (disparar tercera))) CLIPS> (defrule tercera (disparar tercera) =>) Mtl Lourdes Cahuich - http://yo-te-ayudo.com El siguiente diálogo de comandos muestra la ejecución de las reglas sin ningún punto de interrupción: CLIPS> (watch rules) CLIPS> (reset) CLIPS> (run) FIRE 1 primera: * FIRE 2 segunda: f-1 FIRE 3 tercera: f-2 Mtl Lourdes Cahuich - http://yo-te-ayudo.com Las reglas se disparan en sucesión cuando se introduce el comando “run”. El siguiente diálogo de comandos demuestra el uso del comando “set-break” para detener la ejecución: CLIPS> (set-break segunda) CLIPS> (set-break tercera) CLIPS> (reset) CLIPS> (run) FIRE 1 primera: * Breaking on rule segunda. CLIPS> (run) FIRE 1 segunda: f-1 Breaking on rule tercera. CLIPS> (run) FIRE 1 tercera: f-2 Mtl Lourdes Cahuich - http://yo-te-ayudo.com En este caso, la ejecución se detiene antes de permitir que se disparen las reglas “segunda” y “tercera”. Observe que el comando “run” debe disparar cuando menos una regla antes de que un punto de interrupción detenga la ejecución. Por ejemplo, después de que se ha detenido la ejecución de la “segunda” regla, no lo vuelve a hacer cuando se proporciona nuevamente el comando “run”. Mtl Lourdes Cahuich - http://yo-te-ayudo.com El comando “show-breaks”, puede utilizarse para enumerar todos los puntos de interrupción, su sintaxis es: (show-breaks) Mtl Lourdes Cahuich - http://yo-te-ayudo.com El comando “remove-break” puede usarse para eliminar los puntos de interrupción, su sintaxis es: (remove-break [<nombre-regla>]) Si <nombre-regla> se proporciona como argumento, sólo se eliminará el punto de interrupción para esa regla; de lo contrario, se suprimirán todos los puntos de interrupción. Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS> (show-breaks) segunda tercera CLIPS> (remove-break) CLIPS> (show-breaks) CLIPS> Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Proyectar video youtube correspondiente Mtl Lourdes Cahuich - http://yo-te-ayudo.com Carga y guardado de construcciones Mtl Lourdes Cahuich - http://yo-te-ayudo.com Carga desde un archivo El comando “load” permite cargar en CLIPS un archivo de construcciones hecho con un editor de texto. La sintaxis del comando “load” es: (load <nombre-archivo>) Donde <nombre-archivo> es una cadena o símbolo que contiene el nombre del archivo que habrá de cargarse. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Carga desde un archivo Suponiendo que las reglas y deftemplates de urgencia se almacenan en un archivo llamado “incendio.clp” en la unidad C de una PC, el siguiente comando cargaría las construcciones en CLIPS: (load “C:incendio.clp”) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Carga desde un archivo Uno de los problemas que pueden ocurrir durante la carga se debe al carácter de diagonal invertida utilizado en algunos sistemas operativos como separador de ruta, pues CLIPS la interpreta como un carácter de escape. Es necesario usar dos diagonales invertidas para crear una sola en una cadena C:\usr\clips\incendio.clp (load “C:\\usr\\clips\\incendio.clp”) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Carga desde un archivo Las construcciones no tienen que permanecer en un solo archivo. Pueden almacenarse en varios y cargarse empleando diversos comandos de carga. Si no ocurren errores cuando se carga un archivo, el comando de carga devolverá el símbolo TRUE, de lo contrario devolverá el símbolo FALSE. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Proyectar video youtube correspondiente Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com Observaciones de compilación Cuando se observan compilaciones (como opción predeterminada), se imprime un mensaje informativo que incluye el nombre de la construcción para cada una de las cargadas por medio del comando “load”. Supongamos que CLIPS acaba de iniciarse y se introdujeron los siguientes comandos: Mtl Lourdes Cahuich - http://yo-te-ayudo.com CLIPS>(load "C:\\Users\\Lourdes\\incendio.clp") Defining deftemplate: urgencia Defining deftemplate: respuesta Defining defrule: incendio-urgencia +j+j TRUE Mtl Lourdes Cahuich - http://yo-te-ayudo.com Observaciones de compilación El mensaje indica que se cargaron dos deftemplates (urgencia y respuesta), seguidas por la regla “incendiourgencia” y la cadena “+j+j” al final del mensaje “Defining defrule” es información de CLIPS sobre la estructura interna de las reglas compiladas Esta información será útil para afinar un programa y se analizará más adelante. Mtl Lourdes Cahuich - http://yo-te-ayudo.com No observando compilaciones Si no se están observando las compilaciones, entonces CLIPS imprime un solo carácter para cada construcción cargada: * para defrules, % para deftemplates y $ para deffacts. CLIPS> (clear) CLIPS> (unwatch compilations) CLIPS> (load "C:\\Users\\Lourdes\\incendio.clp") %%* TRUE CLIPS> Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Proyectar video youtube correspondiente Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com Guardando en archivo CLIPS también proporciona lo opuesto al comando “load”; el comando “save” permite guardar en un archivo de disco el conjunto de construcciones almacenado en CLIPS, y la sintaxis es: (save <nombre-archivo>) (save “C:incendio-archivo.clp”) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Guardando en archivo El comando “save” guardará todas las construcciones de CLIPS en el archivo especificado, pero no es posible guardar construcciones especificadas en un archivo. En condiciones normales, si se utiliza un editor para crear y modificar las construcciones, no hay necesidad de utilizar el comando “save”, ya que las construcciones se guardarán mientras está usando el editor. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Mtl Lourdes Cahuich - http://yo-te-ayudo.com Agregando comentarios Es una buena idea incluir comentarios en un programa CLIPS, por que a veces las construcciones pueden resultar difíciles de comprender, y es posible utilizar los comentarios para explicar al lector lo que están haciendo las construcciones. Los comentarios también se emplean para tener una buena documentación de los programas y serán útiles en programas extensos. Mtl Lourdes Cahuich - http://yo-te-ayudo.com Agregando comentarios El siguiente es un ejemplo de comentarios en un programa de incendios Mtl Lourdes Cahuich - http://yo-te-ayudo.com ;**************************************** ;* * ;* Programador: L. Cahuich * ;* * ;* Titulo: Programa incendio * ;* * ;* Fecha: 11/Marzo/2011 * ;* * ;**************************************** ;Deftemplates (deftemplate urgencia (slot tipo)) (deftemplate respuesta (slot accion)) ; El propósito de esta regla es activar ; el sistema contra incendios en caso de un incendio (defrule incendio-urgencia ; SI ; Hay una urgencia de incendio (urgencia (tipo incendio)) => ;ENTONCES ; Activar el sistema aspersar (assert (respuesta (accion activar-sistema-antiincendio)))) Mtl Lourdes Cahuich - http://yo-te-ayudo.com Agregando comentarios La carga de estas construcciones en CLIPS y su impresión demostrará que cada comentario que comienza con punto y coma se elimina del programa CLIPS Mtl Lourdes Cahuich - http://yo-te-ayudo.com Ejemplo en consola CLIPS Proyectar video youtube correspondiente Mtl Lourdes Cahuich - http://yo-te-ayudo.com