Introducción a CLIPS Inteligencia Artificial 5 o Informática IA curso 2008-2009 CCIA Noviembre 2008 IA 0809 (CCIA) CLIPS Noviembre-2008 1 / 10
Introducción a CLIPS CLIPS: C Language Integrated Production Systema Entorno para el desarrollo de sistemas expertos Desarrollado en C con licencia libre Web: http://clipsrules.sourceforge.net/ Define lenguaje para definición de hechos(frames) y reglas Integra elementos del paradigma funcional y orientado a objetos Uso desde intérprete o integrado en programas C Derivados: JESS: implementación Java Web: http://www.jessrules.com/ FuzzyCLIPS: extensión con soporte para lógica difusa Web: http://www.iit.nrc.ca/ir_public/fuzzy/ IA 0809 (CCIA) CLIPS Noviembre-2008 2 / 10
Comandos Inicio: $ clips Finalización: (exit) (clear): elimina los hechos de la memoria activa (reset): inicia/reinicia el intérprete elimina hechos y reglas activadas restaura la situación inicial (hechos iniciales) (load "fich.clp"): carga un fichero (save "fich.clp"): guarda reglas y hechos de sesión actual (run) : inicia encadenamiento hacia adelante finaliza cuando no existan reglas que aplicar (run <n>): inicia encadenamiento hacia adelante finaliza cuando haya ejecuta n reglas (facts): muestra los hechos de la memoria activa (instances): muestra las instancias de la memoria activa (agenda): muestra las reglas activadas (en orden) (watch facts rules...): modo de depuración muestra lista de hechos reglas.. cada vez que se modifican IA 0809 (CCIA) CLIPS Noviembre-2008 3 / 10
Hechos Frames simplificadas (no hay niveles de indentación) Formadas por conjuntos { de slots (ranuras) un valor simple Pares atributo-valor lista de valores Tres opciones Frames anónimas (ordered facts) Formato libre: nombre + lista plana de valores Usados para representar relaciones/propiedades simples Ejemplo: (cerca Vigo Pontevedra) Frames con estructura (non-ordered facts) La lista de slots admitidos se declara con deftemplate (asignatura "descripción de IA" (nombre "inteligencia artificial") (curso 5) (creditos 9) (profesor "...")) Objetos (instances) Similares a frames con estructura Pertenecientes a una clase declarada con defclass IA 0809 (CCIA) CLIPS Noviembre-2008 4 / 10
Comandos manejo de hechos Añadir a memoria activa: (assert <hecho>) CLIPS > (assert (persona (nombre "juan pérez pérez") (edad 25) (padres "lucas" "ana"))) Eliminar de memoria activa: (retract <ref. a hecho>) CLIPS > (retract 1) [elimina el hecho n o 1] CLIPS > (retract?res) [elimina el hecho apuntado por variable?res] Modificar campos: (modify <ref. hecho> <nuevo slot>...) CLIPS > (modify 1 (nombre "juan luis pérez pérez")) Copiar: (duplicate <ref. hecho> <nuevo slot>...) CLIPS > (duplicate 1 (nombre "antonio pérez pérez") (edad 24)) IA 0809 (CCIA) CLIPS Noviembre-2008 5 / 10
Plantillas de hechos Definen la estructura de las frames no ordenadas (non-ordered facts) Asigna nombre al tipo de frame Listado de ranuras (slots) indicando sus características (facets) clase de slot: simple, multivaluado tipo de su contenido: STRING, SYMBOL, INTEGER,.. rango de valores valor por defecto, etc,... Nota: El orden de los slots en un hecho no es relevante Esquema (deftemplate <nombre frame> (slot <nombre>) (slot <nombre> (type <tipo>) (default <valor>)...) (multislot <nombre> (type <tipo>) (default <valor>)...)... ) Ejemplo (deftemplate persona (slot nombre (type STRING)) (slot edad (type INTEGER) (range 0 120)) (multislot padres (type STRING) (cardinality 0 2))) IA 0809 (CCIA) CLIPS Noviembre-2008 6 / 10
Hechos iniciales Por defecto, al inicio de la ejecución o después del comando (clear), siempre existirá el hecho inicial (initial-fact) Cada vez que se ejecuta el comando (reset)) se incluyen en la memoria activa los hechos definidos con el constructor deffacts y las instancias (objetos) definidas con definstances (deffacts <nombre-deffacts> <hecho 1>... <hecho n> ) Ejemplo: (deffacts personas-iniciales (persona (nombre "juan") (edad 26) (padres "luis" "ana")) (persona (nombre "ana") (edad 59)) (persona (nombre "luis") (padres "pedro" "eva") ) Nota: secuencia típica de comandos CLIPS > (reset) CLIPS > (run) [inserta hechos iniciales => se activan reglas] [inicia la ejecución de las reglas] IA 0809 (CCIA) CLIPS Noviembre-2008 7 / 10
Reglas (defrule) { condiciones sobre hechos/instancias Lado izquierdo (patrones) pueden incluir variables añadir/modificar/borrar hechos/instancias interacción con usuario (leer/escribir) Lado derecho (acciones) uso de variables definidas en lado izq. acción (halt): detiene inferencias Sintaxis: (defrule <nombre regla> <comentario (opc.)> (declare (salience <prioridad>)) [opcional] (patron 1)... (patron n) => (accion 1)... (accion m) ) De entre las reglas que cumplan todas sus precondiciones en la memoria activa actual, el motor de inferencias seleccionará una o varias a ejecutar (y su orden). IA 0809 (CCIA) CLIPS Noviembre-2008 8 / 10
(defrule hermanos (persona (nombre?n1) (padres?p $?)) (persona (nombre?n2) (padres?p $?)) => (assert (hermanos (hijo1?n1) (hijo2?n2))) (printout t "hermanos "?n1?n2 " hijos de "?p crlf) ) (defrule activar-aspersor (sensor (tipo temperatura) (ubicacion?id-habitacion) (activado si))?hab <- (habitacion (id?id-habitacion) (aspersor apagado)) (sensor (tipo presencia) (ubicacion?id-habitacion) (activado)) => (assert (alarma (tipo fuego) (ubicacion?id-habitacion)) (assert (accion (tipo desalojo) (ubicacion?id-habitacion)) (modify?hab (aspersor encendido)) ) IA 0809 (CCIA) CLIPS Noviembre-2008 9 / 10
Variables { variables simples:?<nombre> Sintaxis: variables multivaluadas: $?<nombre> Nota:Variables anónimas (comodines):? (1 valor) $? (n valores) Normalmente se asignan (toman valor) en el lado izquierdo (condiciones) Puede asignárseles valor explícitamente con el comando (bind <variable> <expresion>) { lado derecho: correspondencia de patrones compleja Uso lado izquierdo: acceso a sus valores Pueden referirse al valor de un slot (persona (edad?edad)) Pueden mantener una referencia a un hecho/objeto (operador <-)?hecho <-(persona (nombre "juan") (edad?edad)) IA 0809 (CCIA) CLIPS Noviembre-2008 10 / 10
Condiciones sobre slots y variables Restricciones sobre slots negación (~): (persona (edad ~25)) conjunción (&): (persona (edad ~25 & ~26)) Util para extraer e valor de una variable a la vez que se aplica la restricción (edad?edad & 25) disyunción ( ): (persona (edad 25 26)) Restricciones sobre variables: comando (test <operador> <argumentos>) Generalmente en lado izquierdo (también posible en lado derecho) Operadores: and, or, not, <, >, =,... Pueden usarse funciones definidas por el usuario (deffunc... ) Usa notacion prefija + paréntesis para expresiones complejas (persona (edad? edad)) (test (and (>=?edad 25) (<=?edad 65))) /* edad en 25 y 65 */ IA 0809 (CCIA) CLIPS Noviembre-2008 11 / 10
Patrones complejos Por defecto deben verificarse todos los patrones para que una regla se active AND implícito Pueden usarse otros operadores para agrupar los patrones del lado izquierdo (or <patrones>): al menos uno de los patrones debe satisfacerse en la memoria activa actual la regla sea activará una vez para cada patrón que se satisfaga (and <patrones>): todos os patrones debe satisfacerse en la memoria activa actual (not <patron>): el patrón no debe satisfacerse en la memoria activa actual (exist <patrones>): uno o más patrones deben satisfacerse, pero la regla se activará una única vez (forall <patron> <patrones>): exige que el conjunto de hechos que satisfagan el primer patrón deban satisfacer los demás (logical <patron>): establece un vínculo lógico entre el patrón IA 0809 (CCIA) del lado derecho y losclips hechos que se añadannoviembre-2008 en las 12 / 10
Proceso de inferencia Emparejar hechos/instancias con reglas Reglas activadas se mantienen en la agenda Una agenda por cada módulo que componga el sistema Funciona como pila: próxima regla a ejecutar en la cima Posibilidad de usar prioridades (salience) Ante empates en agenda ejecutar antes reglas mayor salience refracción: sólo se seleccionan para ejecución reglas que no fueran activadas en el pasado por el conjunto de hechos/instancias actual Pueden indicarse distintas estrategias de resolución de conflictos Deciden en caso de empates entre reglas de igual prioridad Comando (set-stretegy <estrategia>) Profundidad (depth): estrategia por defecto, nuevas activaciones por encima Anchura (breadth): activaciones nuevas quedan por debajo Simplicidad (simplicity): preferencia a activaciones de reglas menos específicas ( n o comparaciones en lado izq.) Complejidad (complexity): preferencia a activaciones de reglas más específicas Lex y Mea: preferencia por las activaciones nuevas de reglas más específicas Aletoria (random) IA 0809 (CCIA) CLIPS Noviembre-2008 13 / 10
Orientación a Objetos COOL: Clips Object-Oriented Language Amplicación de CLIPS para dar soporte a características de la POO (herencia, encapsulación,...) Clases predefinidas: Clases de usuario heredan de USER INITIAL-OBJECT usado para instancias inciales (comando (clear)) IA 0809 (CCIA) CLIPS Noviembre-2008 14 / 10
Definición de clases Operador deffclass (defclass nombre [comentario] (is-a <nombre superclase>) (role concrete abstract) (pattern-match reactive non-reactive) <definición slots> <definición handlers> ) [opcional] [opcional] En cada clase se especifica Su superclase (is-a) [es posible herencia múltiple] Si es abstracta o concreta (puede tener instancias) (role) Si los cambios en sus slots pueden disparar los patrones de las reglas (pattern-match reactive) o no (pattern-match non-reactive) Lista de slots con sus restricciones limitar el acceso al slot: (visibility public private), (access read-write read-only initializa-only) indica si crear handlers get y set para ese slot: (create-accesor?none read write read-write) IA 0809 (CCIA) CLIPS Noviembre-2008 15 / 10
(defclass ser_vivo (is-a USER) (role abstract) (slot nombre (type STRING)) (defclass vegetal (is-a ser_vivo) (role abstract) ) (defclass animal (is-a ser_vivo) (role abstract) (slot edad)) (defclass mamifero (is-a animal) (role abstract) (slot num_patas (type INTEGER)) (defclass gato (is-a animal) (role concrete) (slot raza (type STRING)) (slot color (type SYMBOL))) (defclass perro (is-a animal) (role concrete) (slot raza (type STRING)) (slot color (type SYMBOL))) (defclass hombre (is-a animal) (role concrete) (slot pais (type SYMBOL)) (slot DNI (type SYMBOL))) IA 0809 (CCIA) CLIPS Noviembre-2008 16 / 10
Definición y uso de instancias Creación: (make-instance [<instancia>] of <nombre clase> <definicion slots>) (make-instance alumno1 of hombre (nombre "juan") (edad 26)) (make-instance of hombre (nombre "luis") (edad 56)) Modificación: (modify-instance <instancia> <redefinicion slots>) (modify-instance alumno1 (nombre "juan antonio")) Copia: (duplicate-instance <instancia> [to <nueva instancia>] <redefinicion slots>) (duplicate-instance alumno1 to alumno2 (nombre "pedro")) (duplicate-instance alumno2 to alumno3) Borrado: (make-instance <ref. instancia>) (unmake-instance alumno1) (unmake-instance?referencia) Otra opción: usar handler delete ((send [instancia]) delete) (send [alumno1] delete) IA 0809 (CCIA) CLIPS Noviembre-2008 17 / 10
Definición y uso de instancias Declaración instancias iniciales: (definstances) Instancias a crear al inicio de la ejecución (comando (reset)) Siempre existe objeto initial-object (de clase INITIAL-OBJECT) (definstances personas (juan of hombre (nombre "juan") (luis of hombre (nombre "luis") (pablo of hombre (nombre "pablo")) Definición de handlers: (defmessage-handler <clase> <handler> (<parametros>) <lista instru Acceso a variables y ejecución de handlers (métodos) ([instancia] send <nombre handler> <paramatros>) En slots donde { se defina modificador create-accessor se crean get-<nombre slot> dos handlers set-<nombre slot> ([juan] send set-edad 26) ([pablo] send imprimir) ([juan] send get-nombre) IA 0809 (CCIA) CLIPS Noviembre-2008 18 / 10
Uso de objetos en reglas Se pueden crear precondiciones en el lado izquierdo de las reglas que hagan referencia objetos o al valor de sus slots usando la palabra clave object (object <lista 8restricciones>) < <restriccion> = : Ejemplo (is-a <nombre clase>) (name <restriccion sobre nombre>) (<nombre slot> <restriccion sobre slot>) (defrule fuego-misma-planta (object (is-a sensor-humo) (habitacion?id_habitacion) (activo SI)) (object (is-a habitacion) (id?id_habitacion) (piso?piso) (aspersor encendido))?h1 <- (object (is-a habitacion) (piso?piso)) => (modify-instance?h1 (aspersor encendido)) (bind?nombre-habitacion [?h1] get-nombre) (printout "Encendido aspersor en la habitacion "?nombre-habitacion " del piso "?piso crlf)) ) IA 0809 (CCIA) CLIPS Noviembre-2008 19 / 10
Otras posibilidades Definición de funciones: (deffunc...) División en módulos: (defmodule...)) exportación e importaciones de elementos: plantillas, hechos, reglas, clases,... Uso de factores de certidumbre asoicados a reglas y hechos Simulación de razonamiento hacia atrás IA 0809 (CCIA) CLIPS Noviembre-2008 20 / 10