1 CLIPS v6.1 Resumen Raquel Fuentetaja Pizán raquel.fuentetaja@uc3m.es Susana Fernández Arregui susana.fernandez@uc3m.es Universidad Carlos III de Madrid Departamento de Informática http://galahad.plg.inf.uc3m.es/∼docweb/ 2 CLIPS v6.1 Resumen 1. 2. 3. 4. 5. Introducción Hechos Reglas Funciones Marcos Introducción Clips • CLIPS: C Language Integrated Production System • Programado en C • Comunicación con otros lenguajes: C y Ada • Similitudes con LISP y C • Desarrollado por Software Technology Branch (STB) NASA desde 1986 • Combina elementos de los paradigmas de lenguajes declarativos, funcionales y orientados a objetos 3 Introducción Intérprete de comandos • $ clips • $ clips -f nombrefichero, nombrefichero fichero con comandos CLIPS • Recomendación: Utilizar emacs o xemacs, hacer dos buffers en uno tener el fichero .clp y en el otro abrir un shell con clips • Cuando aparece el prompt CLIP S > introducir comandos para evaluar • Distingue entre mayúsculas y minúsculas • Clips tiene muchos comandos implementados: (load nombrefichero), (reset), (run), (clear) . . . 4 Introducción Expresiones • La sintaxis de las expresiones es prefija • Una expresión es una serie de campos delimitados por paréntesis • Ejemplo: (+ 1 (* 2 3)) • En modo interactivo CLIPS evalúa las expresiones: CLIP S > (+ 1 2 (* 3 4 )) 15 CLIP S > • Algunas funciones y operadores matemáticos disponibles: + - / * mod div sqrt round integer 5 Introducción Tipos de datos • NUMBER - INTEGER - FLOAT • STRING. Ejemplo: ”Esto es un string” - Para incluir comillas en una cadena hay que usar \” - Para incluir \ en una cadena hay que usar \\ • SYMBOL. Ejemplo: luis, luis-gil, • EXTERNAL-ADDRESS • FACT-ADDRESS • INSTANCE-NAME • INSTANCE-ADDRESS 6 7 CLIPS v6.1 Resumen 1. 2. 3. 4. 5. Introducción Hechos Reglas Funciones Marcos Hechos Facts • Elementos básicos de conocimiento • Pueden tener un campo o varios. El primer campo suele representar una relación entre los restantes: (hola) (alumnos Juan Pedro Luis) (edad 14) (color silla verde) • Campos sin valor: nil. Ej. (color silla nil) • Ordenados y no ordenados (plantillas o templates) • A cada hecho CLIPS asigna automáticamente un identificador único (fact-index). Por ejemplo f-10 8 Hechos Comandos sobre hechos • (facts) : Para ver el contenido de la base de hechos (fact-list) • (assert hecho) : Para añadir hechos a la base de hechos • (retract indice-hecho) : Para eliminar hechos de la base de hechos • (reset) : Elimina todos los hechos de la memoria de trabajo, elimina las activaciones de la agenda y restaura las condiciones iniciales: - Añade initial-fact e initial-object - Añade los hechos y ejemplares iniciales, definidos con deffacts y definstances - Añade las variables globales con su valor inicial • (clear) : Elimina todos los hechos y construcciones de la memoria de trabajo 9 Hechos Hechos iniciales • deffacts: Para definir los hechos iniciales Los hechos iniciales se añaden a la base al hacer (reset) - CLIP S > (deffacts padres ”padres iniciales” (padre-de Luis Antonio) (padre-de Luis Maria) (padre-de Antonio Juan)) - CLIP S > (reset) - CLIP S > (facts) f-0 (initial-fact) f-1 (padre-de Luis Antonio) f-2 (padre-de Luis Maria) f-3 (padre-de Antonio Juan) 10 Hechos Plantillas o templates • Permiten asignar un nombre a cada campo. El orden de los slots no tiene importancia • Se declaran con deftemplate (deftemplate <nombre-plantilla> [<comentario>] <descripcion-de-slot1> ... <descripcion-de-slotN>) • Los slots se definen por un nombre y sus atributos (facetas). Por defecto CLIPS les asigna un valor. (deftemplate robot (slot bandeja (type SYMBOL) (allowed-values LLENA VACIA) (default VACIA)) ) • Pueden almacenar un único valor slot o varios multislot 11 Hechos Atributos o facetas • Los atributos de un slot pueden ser de dos tipos - De restricción ? type tipo : determina el tipo de datos del slot ? allowed-values valores: limita al conjunto de valores los que se pueden asignar ? range rango : limita los valores posibles al rango indicado - De valor ? default valor: valor por omisión al slot ? Se puede forzar al usuario a que indique un valor (?NONE) ? Se puede indicar que sea CLIPS quien determine el valor por omisión de un slot en función de las restricciones aplicadas siguiendo una serie de reglas con el atributo ?DERIVE • Además de assert y retract se pueden modificar con modify (modify direccion-hecho (nombre-atributo nuevo-valor)* ) 12 Hechos Ejemplo (deftemplate fichado (slot nombre (type STRING) (default ?NONE)) (slot edad (type INTEGER) (range 1 100) (default ?NONE)) (slot condicion (type SYMBOL) (allowed-values inocente sospechoso imputado condenado antecedentes) (default inocente)) (slot clase (type SYMBOL) (allowed-values media baja alta) (default ?DERIVE)) ) 13 14 Hechos Ejemplo • Insertar hechos diferentes de tipo fichado: (assert (fichado (assert (fichado (assert (fichado (assert (fichado FALSE (nombre (nombre (nombre (nombre “Carlos”) (edad 28) (condicion sospechoso))) “Pepe”) (edad 18) (clase alta))) “Juan”))) “Juan”))) • CLIPS>(facts) f-0 (initial-fact) f-1 (fichado (nombre “Carlos”) (edad 28) (condicion sospechoso) (clase media)) f-2 (fichado (nombre “Pepe”) (edad 18) (condicion inocente) (clase alta)) f-3 (fichado (nombre “Juan”) (edad 1) (condicion inocente) (clase media)) For a total of 4 facts • CLIPS>(assert (fichado)) [TMPLTRHS1] Slot nombre requires a value because of its (default ?NONE) attribute. 15 CLIPS v6.1 Resumen 1. 2. 3. 4. 5. Introducción Hechos Reglas Funciones Marcos Reglas Sintaxis • (defrule <nombre-regla> [<documentacion-opcional>] [(declare (salience <numero>))] <premisa-o-elemento-de-condicion>* ⇒ <accion>* • Ejemplo: (defrule ascendencia ”detecta los antepasados obvios” (padre-de Luis Pedro) ⇒ (assert (antepasado-de Luis Pedro))) • Si no hay elementos de condición se usa initial-fact: (defrule regla-inicial ⇒ (assert (antepasado-de Luis Pedro))) 16 Reglas Variables • El uso de variables ?<nombre-variable>, ?$<nombre-variable> hace las reglas más generales (defrule ascendencia ”detecta los antepasados obvios” (declare (salience 2)) (padre-de ?x ?y) ⇒ (assert (antepasado-de ?x ?y)) ) (defrule genera-escenas (declare (salience 20)) (lista $?l) ⇒ (assert (un-hecho-de-la-lista (nth$ 1 $?l))) ) 17 18 Reglas Elementos de condición (LHS) • Patrones: Consulta a la fact-list preguntando por la existencia de hechos determinados (dato 1 azul rojo) (persona (nombre ?N) (amigos $?A) (edad 30)) • Direcciones de hechos: Almacenar direcciones de hechos en variables ?P←(persona (nombre ?N) (amigos $?A) (edad 30)) • Test: Comprobar el cumplimiento de alguna condición (test (>= (abs (- ?y ?x)) 3)) • Not: Preguntar por la NO existencia de determinados hechos en la fact-list (not (dato rojo ?x ?x)) Reglas Acciones o efectos (RHS) • assert: Para incorporar un hecho en la fact-list (assert dato 1 azul rojo)) • retract: Para eliminar un hecho de la fact-list (defrule eliminar-estado-valvula ?f1 ←(estado (valvula ?X)) ⇒ (retract ?f1) ) • modify: Para modificar un hecho de la fact-list. Equivalente a hacer un retract y un assert. Sólo para plantillas (defrule cambiar-estado-valvula ?f1 ← (estado (valvula abierta)) ⇒ (modify ?f1 (valvula cerrada))) 19 Reglas Acciones • Parada: Para parar la ejecución del sistema: (halt) • bind: Asignación de valor a variables (bind ?X (* ?Y 2)) • Funciones de entrada/salida: open, close, printout, read, readline • Otras funciones 20 Reglas Comandos para reglas • Al definir reglas ya existentes, la primera regla se borra • (list-defrules): Para ver las reglas definidas • (ppdefrule <nombre-de-regla>): Para ver la definición de una regla • (undefrule <nombre-de-regla>): Para eliminar una regla • (undefrule *): Para eliminar todas las reglas 21 Reglas Ejecución de reglas • Las activaciones de reglas se mantienen en la agenda • La colocación de una regla en la agenda se realiza según su prioridad y la estrategia de resolución de conflictos definida • (agenda): Para ver el contenido de la agenda • (run): Para ejecutar las reglas seguidas • (run <veces>): Para ejecutar <veces> reglas • (matches <nombre-regla>): Para ver que hechos se equiparan con los patrones de una regla 22 Reglas Depuración de programas • (watch <item>) : Observación de la evolución de los componentes del sistema all compilations statistic messages deffunctions rules facts activations • (unwatch <item>): Para desactivar el modo de observación • (dribble-on/off <nombre-fichero>): Para grabar en un fichero la evolución del diálogo usuario-CLIPS • set-break y remove-break: Para poner y quitar un breakpoint en la regla que se les pasa como argumento • (run <numero-de-reglas-a-disparar>): Ejecutar paso a paso • (matches <nombre-regla>): Para ver que hechos se equiparan con los patrones de una regla 23 Reglas Estrategias de resolución de conflictos • Se seleccionan con el comando: (set-strategy <estrategia>) • depth: (Profundidad). Las nuevas activaciones se sitúan por encima de las de igual prioridad. Es la estrategia por omisión • breadth: (Amplitud). Las nuevas activaciones se sitúan por debajo de las de igual prioridad • simplicity: Las nuevas activaciones se sitúan por encima de las activaciones con igual o mayor especificidad • complexity: Las nuevas activaciones se sitúan por encima de las activaciones con igual o menor especificidad • random: Aleatoria. A cada activación se le asigna un número aleatorio para determinar su orden en la agenda. 24 25 CLIPS v6.1 Resumen 1. 2. 3. 4. 5. Introducción Hechos Reglas Funciones Marcos Funciones Funciones de Entrada/Salida • Abrir un fichero: open (open nombre-fichero nombre-canal-asignado modo-acceso) • Cerrar un fichero: close (close nombre-canal) • Modos de acceso: ”r” sólo lectura ”w” sólo escritura ”r+” lectura y escritura ”a” escritura al final de fichero (append) • Canales predefinidos: stdin, stdount, werror • Leer de un canal: read. Devuelve el primer sı́mbolo que encuentre (read <nombre-canal>) 26 Funciones Escritura • Por pantalla: (printout t “texto literal” ?v1 “ más texto” ?v2 crlf) • En fichero: (defglobal ?*file* = “ “ ) (defrule estado-inicial (declare (salience 3000)) ⇒ (unwatch all) (set-strategy random) (open “cuento.txt” ?*file* “a”) (printout ?*file* “EMPIEZA EL CUENTO” crlf)) 27 Funciones Funciones de comparación y lógicas • Las siguientes funciones comparan sus argumentos y devuelven un valor lógico TRUE o FALSE ? eq TRUE si los valores de las expresiones argumento son iguales en valor y tipo ? neq TRUE si alguno de los valores de las expresiones argumento es distinto • Las funciones =, <>, <, >, <=, >= presuponen argumentos numéricos • Las funciones lógicas usan argumentos lógicos y devuelven un valor lógico ? and TRUE si todos los valores de las expresiones argumento son TRUE ? or TRUE si alguno de los valores de las expresiones argumento es TRUE ? not TRUE si el valor de la expresión argumento es TRUE 28 29 CLIPS v6.1 Resumen 1. 2. 3. 4. 5. Introducción Hechos Reglas Funciones Marcos Marcos Definición • Se declaran con defclass: (defclass <nombre-plantilla> (is-a <clase-padre>) <propiedades de la clase> <descripcion-de-slot1> ... <descripcion-de-slotN>) • Slot igual que en las plantillas. Algunos atributos propios ? (create-accesor read-write). Para poder modificarlo ? (source composite). Hereda todas las facetas del mismo slot que el padre. Redefinir slots • Propiedades de la clase: (role abstract/concrete), (pattern-match non-reactive/reactive) • CLIPS tiene 17 clases definidas. Todas abstractas (no se pueden crear instancias directas) menos INITIAL-OBJECT 30 Marcos Ejemplo1 ;; Definicion de la clases SECUENCIA (defclass SECUENCIA (is-a INITIAL-OBJECT) (slot id (type INTEGER) (create-accessor read-write)) (slot gliterario (type SYMBOL) (default CUENTO) (create-accessor read-write)) (multislot lista (type SYMBOL) (create-accessor read-write))) (definstances secuencias ([sec1] of SECUENCIA (id 1) (gliterario cuento) (lista INTRODUCCION PROBLEMA MANDATO ALEJAMIENTO))) 31 Marcos Ejemplo2 ;; Definición de la clase abstracta (no se pueden generar instancias de ella) ESCENA (defclass ESCENA (is-a INITIAL-OBJECT) (role abstract) (pattern-match non-reactive) (slot orden (create-accessor read-write) (range 1 10) (type INTEGER))) ;; Definición de las claeses hijas de ESCENA (defclass INTRODUCCION (is-a ESCENA) (role concrete) (pattern-match reactive) (slot primitiva (create-accessor read-write) (type SYMBOL)) (slot orden (source-composite) (default 8))) 32 Marcos Comandos • make-instance: añade una instancia a la base de hechos (make-instance of INTRODUCCION (primitiva ESTAR)) • unmake-instance: quita la instancia de la base de hechos (unmake-instance ?ins) • modify-instance: borra y crea instancias de la base de hechos (modify-instance ?ins (orden 7)) • instances: muestra las instancias de la base de hechos [gen1] of INTRODUCCION • (send [gen1] print): para ver valor de los slots 33 Marcos Reglas (defrule genera-escenas ?control ← (control (paso 1) (secuencia ?id) (total-escenas ?tot&∼0) (escena ?es&:(<= ?es ?tot))) ?secuencia ← (object (is-a SECUENCIA) (lista $?lista) (id ?id)) ⇒ (bind ?clase (nth$ ?es $?lista)) (printout t ”Escena ”?es çlase, ”?clase crlf) (make-instance of ?clase (orden ?es)) (modify-instance ?secuencia (id 0)) (unmake-instance ?secuencia) (modify ?control (escena (+ 1 ?es)))) 34