Sistemas Inteligentes de Gestión
Tutorial de CLIPS
© Juan Carlos Cubero & Fernando Berzal
Sistemas Inteligentes de Gestión: CLIPS 2ÍndiceCLIPS ............................................................................................................................... 3
Referencias ................................................................................................................... 3
Hechos y reglas ................................................................................................................. 4
Vectores ordenados de características .......................................................................... 5
Registros ....................................................................................................................... 5
Uso de la memoria de trabajo ....................................................................................... 7
Reglas ......................................................................................................................... 10
El ciclo de control de CLIPS ...................................................................................... 11
Emparejamiento en vectores ordenados de características ......................................... 13
Reglas con varios patrones ......................................................................................... 16
Emparejamiento en registros ...................................................................................... 17
Refracción ................................................................................................................... 21
Direcciones de hechos ................................................................................................ 22
Restricciones sobre campos ........................................................................................ 24
Estrategias de resolución de conflictos ........................................................................... 26
Estrategia “primero en profundidad” (LIFO) ............................................................. 27
Estrategia “primero en anchura” (FIFO) .................................................................... 27
Por complejidad .......................................................................................................... 28
Por antigüedad ............................................................................................................ 28
LEX ............................................................................................................................ 29
Especificación de prioridades ..................................................................................... 29
Funciones aritméticas y lógicas ...................................................................................... 30
Funciones aritméticas ................................................................................................. 30
Funciones lógicas ....................................................................................................... 31
Emparejamiento y restricciones avanzadas .................................................................... 34
Restricciones sobre campos ........................................................................................ 34
Elementos condicionales ............................................................................................ 35
Uso de hechos de control ................................................................................................ 40
TMS ................................................................................................................................ 46
Modularización ............................................................................................................... 56
Ficheros .......................................................................................................................... 67
Apéndice: Atributos de los campos ................................................................................ 68

Sistemas Inteligentes de Gestión: CLIPS 3CLIPSCLIPS es un shell para el desarrollo de sistemas expertos que utiliza una estrategis de
control irrevocable con encadenamiento hacia adelante.
Desarrollado originalmente en la NASA a mediados de los 80, puede integrarse con
C/C++ (en ambas direcciones). De hecho, su nombre es un acrónimo derivado de “C
Language Integrated Production System”
La sintaxis (y el nombre) de CLIPS están inspirados en OPS (“Official Production
System”), un shell para el desarrollo de sistemas expertos creado en 1977 por Charles
Forgy durante su doctorado con Allen Newell en la Carnegie-Mellon University.
La primera implementación de OPS se realizó en LISP, de ahí la sintaxis de CLIPS que
puede resultar algo extraña para el que sólo haya utilizado lenguajes imperativos tipo C,
C++ o Java. No en vano, hay quien interpreta el nombre de LISP [LISt Processing]
como “Lots of Insipid Silly Parentheses”]
N
OTA: Posteriormente, OPS se reprogramó, por cuestiones de eficiencia, en
BLISS ["Basic Language for Implementation of System Software" o "System
Software Implementation Language, Backwards"], un lenguaje de programación
de sistemas diseñado en CMU que pasó a un segundo plano debido al auge del
lenguaje de programación C.
http://en.wikipedia.org/wiki/BLISS_programming_languageReferencias
- Sitio web oficial de CLIPS:http://clipsrules.sourceforge.net/

- Jess [Java Expert System Shell], descendiente de CLIPS para Java:http://www.jessrules.com/
- Libro de texto:
Joseph C. Giarratano & Gary D. Riley:
Expert Systems:
Principles and Programming
Thomson, 4
th edition, 2005.
ISBN 0534384471
- Más información:http://es.wikipedia.org/wiki/CLIPS

Sistemas Inteligentes de Gestión: CLIPS 4Hechos y reglasEl entorno de trabajo de CLIPS nos muestra:
- La Memoria de trabajo (ventana Facts).
- El “conjunto conflicto” (ventana Agenda).
Además, nos permite inspeccionar otros elementos (por ejemplo, instancias de objetos).
A la hora de representar datos, CLIPS nos permite utilizar:
1. Vectores ordenados de características.
2. Registros.
3. Instancias de clases (objetos).
A continuación veremos cómo se usan los dos primeros:

Sistemas Inteligentes de Gestión: CLIPS 5Vectores ordenados de características(Pedro 45 V NO) sería un ejemplo de vector ordenado.
Cada valor corresponde, según un orden definido por el programador, a un atributo.
Desde la línea de comandos de CLIPS, puede “asertarse” un hecho mediante
(assert):CLIPS> (assert (Pedro 45 V NO))Obviamente, este hecho será distinto al hecho (Pedro 45 NO V), dado que el orden es
fundamental en la definición de hechos de esta forma.
Una buena práctica consiste en anteponer un nombre de relación al vector ordenado de
características, como por ejemplo:
(Persona Pedro 45 NO V)RegistrosPara evitar errores asociados a la utilización de vectores ordenados de características,
normalmente resulta más recomendable definir registros (templates).
Primero, definiremos el tipo de dato registro con
(deftemplate). A continuación,
utilizaremos
(assert) para establecer uno o varios hechos del tipo definido.CLIPS> (deftemplate Persona
(field Nombre)
(field Edad)
(field Sexo)
(field EstadoCivil) )
CLIPS> (assert (Persona
(Nombre Juan)
(Edad 30)
(EstadoCivil casado)
(Sexo V)))
- Cada vez que se añade un hecho (vector o registro), CLIPS devuelve un
identificador de hecho, empezando desde 0 (a no ser que se haya asertado
automáticamente con
(reset) el hecho inicial, en cuyo caso, éste es el que tiene
índice 0).
- CLIPS es sensible a mayúsculas y minúsculas, por lo que
persona sería distinto
a
Persona.
- Si no se especifica un campo de un registro, CLIPS le asigna automáticamente
un valor nulo (
nil en CLIPS).
- No pueden definirse estructuras anidadas, con un template dentro de otro. Para
hacer esto tendríamos que utilizar clases.

Sistemas Inteligentes de Gestión: CLIPS 6NOTA: Aunque actualmente se haga referencia a los campos de los registros con el
término
field, antes de la versión 6 de CLIPS, se utilizaba el término slot(tradicionalmente usado en I.A. para modelos de representación del conocimiento
basados en marcos).
multifieldDentro de un template, si queremos que un campo sea un vector ordenado de
características, usamos el identificador
multifield, en vez de field:(deftemplate Persona
(field Nombre)
(field Edad)
)
(assert (Persona
(Nombre Juan Carlos Cubero)
(Edad 39))
)
Error: “The single field slot Nombre can only contain a single field”
(deftemplate Persona
(multifield Nombre)
(field Edad)
)
(assert (Persona
(Nombre Juan Carlos Cubero)
(Edad 33))
)
Correcto!!Tanto con field como con multifield, podríamos haber utilizado comillas dobles:(assert (Persona
(Nombre “Juan Carlos Cubero”)
(Edad 33))
)

Sistemas Inteligentes de Gestión: CLIPS 7Uso de la memoria de trabajo(deffacts)Para no tener que estar asertando hechos desde línea de comandos de CLIPS, podemos
utilizar el comando
(deffacts) para asertarlos desde un fichero (con extensión .clppor convención).personas.clp
; Datos de personas
(deftemplate Persona
(field Nombre)
(field Edad)
(field Sexo)
(field EstadoCivil)
)
(deffacts VariosHechos
(Persona
(Nombre JuanCarlos)
(Edad 33))
(Persona
(Nombre Maria)
(Sexo M))
)
(deffacts OtrosHechos
(NumeroDeReactores 4)
)
El fichero comienza con un comentario (que en CLIPS se indica mediante un punto y
coma al comienzo de la línea), tras el cual se define el tipo de registro Persona y se
establecen tres hechos (dos de tipo Persona y un vector ordenado).
Para cargar el fichero escribimos lo siguiente desde la línea de comandos de CLIPS:
CLIPS> (load personas.clp)Pero los tres hechos no pasan a formar parte de nuestra memoria de trabajo hasta que
ejecutamos:
CLIPS> (reset)
Sistemas Inteligentes de Gestión: CLIPS 8(reset) elimina primero todos los hechos que estuviesen en la memoria de trabajo. Las
definiciones de los templates no se borran con
(reset), pero sí los hechos de la
memoria de trabajo, ya sean vectores o registros.
(reset) también añade un hecho inicial con identificador 0 (del que más adelante
veremos su uso).
A continuación, se cargan los
(deffacts) existentes en los ficheros que hayamos
cargado con
(load). Si, por ejemplo, hubiésemos escrito (load f1.clp) y (load
f2.clp)
, entonces, después de ejecutar (reset), tendríamos en la memoria de trabajo
tanto los hechos definidos con
(deffacts) en f1.clp como los definidos en f2.clp.
Resumiendo, CLIPS nos proporciona los siguientes mecanismos para añadir hechos a la
memoria de trabajo:
- Desde línea de comandos con
(assert).
- Desde un fichero que contenga
(deffacts), que deberemos cargar con (load) y
posteriormente ejecutar un
(reset).
- Como acción ejecutada en una regla.

Sistemas Inteligentes de Gestión: CLIPS 9(retract)(retract <índice de hecho>+ )
CLIPS> (retract 1 2)
Suprime los hechos con identificadores 1 y 2.CLIPS> (retract *)borra todos los hechos
N
OTA: Resulta bastante incómodo tener que recordar los identificadores de los hechos,
por lo que veremos una forma mejor de hacerlo más adelante.
(modify) & (duplícate)(modify <índice de hecho>
(<nombre campo> <nuevo valor>))
CLIPS> (modify 1 (edad 27))
cambia la edad asociada al hecho #1, que deberá tener definido el campo edad.
I
MPORTANTE: El identificador del hecho cambia después del (modify).
Para añadir una copia de un hecho a la vez que modificamos alguno de sus campos:
CLIPS> (duplicate 1
(Nombre "Pedro Pérez")
(Edad 40))
(clear)CLIPS> (clear)borra todo lo que se hubiese definido en la sesión de trabajo, ya sea desde la
línea de comandos o desde un fichero (todos los hechos que existan en la
memoria de trabajo las definiciones de registros, los deffacts, las reglas…).
También es posible borrar selectivamente lo que nos interese, con
(undeffacts ...),(undefrules ...), etc.
Sistemas Inteligentes de Gestión: CLIPS 10Reglas(defrule <nombre> <comentario>
<patrón antecedente> +
=>
<consecuente> +
)
La parte izquierda de la regla suele llamarse LHS (Left Hand Side), mientras que la
parte derecha es RHS (Right Hand Side).
La LHS está constituida por varios patrones. En ellos se establecen las condiciones que
han de darse sobre los elementos de la memoria de trabajo para que la regla pueda
activarse.
Los consecuentes pueden consistir en la adición o supresión de un elemento a la
memoria de trabajo (ejecutando
(assert) o (retract)) o la ejecución de algún
procedimiento (como, por ejemplo,
(printout)).reglas.clp
(deffacts VariosHechosVectores
(Persona Pedro 45 V SI)
(Persona Maria 34 M NO)
)
(defrule ECivilPedro_Soltero
(Persona Pedro 45 V NO)
=>
(printout t crlf "Pedro está soltero")
)
(defrule ECivilPedro_Casado
(Persona Pedro 45 V SI)
=>
(printout t crlf "Pedro está casado")
)
(defrule ECivilMaria_Soltera
(Persona Maria 34 M NO)
=>
(printout t crlf "Maria está soltera")
)
CLIPS> (clear)
CLIPS> (load datos.clp)
CLIPS> (reset)
RECORDATORIO: (reset) es necesario para añadir los hechos definidos con(deffacts) a la memoria de trabajo.
Sistemas Inteligentes de Gestión: CLIPS 11El ciclo de control de CLIPSTres fases constituyen el ciclo de control de un motor de inferencia con encadenamiento
hacia adelante: emparejamiento, resolución de conflictos y ejecución.
Veamos cómo se realiza este proceso en CLIPS:
Después de
(reset), CLIPS realiza el emparejamiento de todas las reglas con todos los
hechos de la memoria de trabajo y, en ese momento, ya son aplicables dos reglas que
pasan a formar parte de la agenda. En realidad, entran en la agenda las activaciones de
las reglas con los hechos correspondientes (es decir, la misma regla podría aparecer
varias veces en la agenda si fuese aplicable a distintos datos):
Memoria de trabajo Agenda
f-1:(P Pedro 45 V SI)
f-2:(P Maria 34 M NO)
ECMS(f-2)
ECPC(f-1)
A continuación, CLIPS ordena dichas reglas según algún criterio y aquí finalizan las
acciones realizadas por
(reset).
La primera regla de la agenda no se dispara hasta que no lo digamos explícitamente con:
CLIPS> (run 1)o bien CONTROL+Tlo que mostrará en pantalla el mensaje “María está soltera” y eliminará de la agenda la
regla que se ha aplicado:
Memoria de trabajo Agenda
f-1:(P Pedro 45 V SI)
f-2:(P Maria 34 M NO)
ECPC(f-1)

Sistemas Inteligentes de Gestión: CLIPS 12Cada vez que ejecutamos (run 1), se realiza una iteración completa del ciclo de
control de CLIPS, que consta de las siguientes fases:
1. Ejecución y refracción: Se ejecuta la primera regla de la agenda y ésta
desaparece de la misma por refracción.
2. Emparejamiento: Se emparejan los hechos de la memoria de trabajo con las
reglas existentes.
a. Si en la parte derecha de la regla ejecutada se hubiese añadido algún
elemento a la memoria de trabajo, algunas reglas nuevas podrían ser
aplicables (por lo que entrarían en la agenda).
b. Si en la parte derecha de la regla ejecutada se hubiese suprimido algún
elemento de la memoria de trabajo, algunas reglas que estaban en la
agenda podrían desaparecer de ésta.
N
OTA: En el ejemplo anterior, no se daba ninguna de los dos casos, por lo
que no se modificaba la agenda (más allá de la regla aplicada, que
desaparecía).
3. Resolución de conflictos: Según el criterio definido por CLIPS, se ordenan las
reglas (activaciones) de la agenda y se selecciona una de ellas como la primera,
que será la que se ejecute en el siguiente ciclo de control.
En nuestro ejemplo, como sólo queda una regla aplicable, la resolución es inmediata:
Memoria de trabajo Agenda
f-1:(P Pedro 45 V SI)
f-2:(P Maria 34 M NO)
ECPC(f-1)
CLIPS> (run 1)mostrará ahora en pantalla el mensaje “Pedro está casado” y eliminará de la
agenda la regla aplicada, con lo que la agenda se queda vacía:
Memoria de trabajo Agenda
f-1:(P Pedro 45 V SI)
f-2:(P Maria 34 M NO)
También podríamos haber utilizadoCLIPS> (run n)dónde n es el número de iteraciones que queremos que se ejecuten del ciclo de
control de CLIPS, o
CLIPS> (run)que va ejecutando automáticamente todas las reglas de la agenda hasta que ésta
quede vacía (equivale a
CONTROL+R). ¡Mucho cuidado con los ciclos infinitos!

No hay comentarios:

Publicar un comentario