Está en la página 1de 57

Introduccin al

CLIPS
C Language Integrated Production System
Recursos de CLIPS
Sitio oficial:
http://www.ghg.net/clips/CLIPS.html
Ejecutables:
http://www.ghg.net/clips/download/executables/
Documentacin:
http://www.ghg.net/clips/download/documentation/
Ejemplos:
http://www.ghg.net/clips/download/executables/examples/
Preguntas Frecuentes:
http://www.ghg.net/clips/CLIPS-FAQ
Herramienta para SBC desarrollada por la seccin
de tecnologa de software (Software Technology
Branch) de la NASA.
En desarrollo desde 1985
Portable: Se puede portar a cualquier sistema con
compilador ANSI C o C++. Existe en Windows
95/98/NT, MacOS X, y Unix. Se tiene acceso al
cdigo fuente para adaptarlo a necesidades.
Integrable: Se puede integrar con cdigo de otros
lenguajes (C, Java, FORTRAN, ADA) y extender
mediante protocolos definidos.
De dominio pblico.
CLIPS Soporta:
Programacin declarativa: Reglas (con
encadenamiento hacia adelante)
Programacin procedimental
Programacin orientada a objetos
Base de
Conocimientos
(Reglas)
Memoria
de Trabajo
(Hechos)
Interfaz
Motor de Inferencia
Agenda
Caracteres no imprimibles (espacio, retorno, tabulador, etc.)
Comillas dobles "
Parntesis ()
et &
barra vertical |
Menor que, < , puede ser primer caracter de un smbolo
virgulilla ~
punto y coma ; comienzo de comentario, hasta un retorno
Delimitadores de simbolos
? y $? no pueden comenzar un smbolo, pero pueden estar
dentro de un smbolo
Hechos
Los hechos (facts) en CLIPS
constan de
Un nombre del hecho (Ej: relacin)
Una o ms ranuras (slots)
Antes de crear hechos, para cada
tipo de hecho puede definirse una
plantilla con la lista de ranuras vlidas
para ese tipo de hecho.
Ejemplo: Declaracin de una plantilla
para hecos que describirn una persona:
(deftemplate persona es una persona
(slot nombre)
(slot edad)
(slot estatura)
(slot color-de-cabello))
Agregando un hecho a la lista de hechos
con el comando assert:
(assert (persona
(nombre Juan Mora")
(edad 35)
(estatura 168)
(color-de-cabello negro)))
<Fact-0>
Agregando otro hecho a la lista de
hechos:
(assert (persona
(nombre Pedro Pombo")
(edad 46)
(estatura 172)
(color-de-cabello negro)))
<Fact-1>
Ver lista de los hechos:
(facts)
f-0 (persona (nombre "Juan Mora")
(edad 35) (estatura 168)
(color-de-cabello negro))
f-1 (persona (nombre "Pedro
Pombo") (edad 46) (estatura
172) (color-de-cabello
negro))
For a total of 2 facts.
Modificar ranura de un hecho:
(modify 0 (edad 37))
<Fact-2>
(facts)
f-1 (persona (nombre "Pedro
Pombo") (edad 46) (estatura
172) (color-de-cabello
negro))
f-2 (persona (nombre "Juan Mora")
(edad 37) (estatura 168)
(color-de-cabello negro))
For a total of 2 facts.
Crear un hecho con base en otro:
(duplicate 1 (nombre Lina Mira))
<Fact-3>
(facts)
f-1 (persona (nombre "Pedro
Pombo") (edad 46) (estatura
172) (color-de-cabello
negro))
f-2 (persona (nombre "Juan Mora")
(edad 37) (estatura 168)
(color-de-cabello negro))
f-3 (persona (nombre "Lina Mira")
(edad 46) (estatura 172)
(color-de-cabello negro))
For a total of 3 facts.
(retract 1)
(facts)
f-2 (persona (nombre "Juan Mora")
(edad 37) (estatura 168)
(color-de-cabello negro))
f-3 (persona (nombre "Lina Mira")
(edad 46) (estatura 172)
(color-de-cabello negro))
For a total of 2 facts.
Se pueden eliminar varios hechos con un
solo retract:
(retract 0 2 5)
Se pueden eliminar todos los hechos:
(retract * )
Se pueden definir ranuras multicampo,
que admiten varios valores:
(deftemplate individuo ejemplo multislot
(multislot nombre)
(slot edad)
(slot estatura)
(slot color-de-cabello))
As pueden existir hechos como:
(individuo
(nombre Juan Mora Duarte)
(edad 35)
(estatura 168)
(color-de-cabello negro)))
Se pueden declarar varios hechos como
conocimiento inicial con deffacts:
(deffacts gente algunas personas
(persona (nombre "Marta Paez") (edad 33)
(estatura 170) (color-de-cabello rubio))
(persona (nombre "Diego Molina") (edad 25)
(estatura 168) (color-de-cabello negro))
(persona (nombre "Luz Perez Daza") (edad 19)
(estatura 166) (color-de-cabello negro)) )
(facts)
f-2 (persona (nombre "Juan Mora")
(edad 37) (estatura 168)
(color-de-cabello negro))
f-3 (persona (nombre "Lina Mira")
(edad 46) (estatura 172)
(color-de-cabello negro))
For a total of 2 facts.
Los hechos contenidos en deffacts se
aseveran a la lista de hechos con el comando:
(reset)
Efectos:
1. Se borran los hechos que hay en la lista de
hechos (no se borran reglas)
2. Los hechos definidos en deffacts se crean
en la lista de hechos
3. Se crea el hecho adicional
(initial-fact)
f-0 con identificador
Este hecho inicial se usa tpicamente para
iniciar la ejecucin del programa
(reset)
f-0 (initial-fact)
f-1 (persona (nombre "Marta Paez")
(edad 33) (estatura 170) (color-
de-cabello rubio))
f-2 (persona (nombre "Diego Molina")
(edad 25) (estatura 168) (color-
de-cabello negro))
f-3 (persona (nombre "Luz Perez Daza")
(edad 19) (estatura 166) (color-
de-cabello negro))
For a total of 4 facts.
(facts)
Se pueden crear hechos sin tener un
deftemplate correspondiente:
(assert (jefe Hector Luis))
(assert (jefe Diego Hector))
(assert (tallas 12 32 34 36 40))
Estos se llaman hechos ordenados, y a
ellos CLIPS les crea un deftemplate
implcito
El comando watch es til para depurar
programas.
Sintxis: (watch <item-observado>)
(watch facts)
(watch activations)
(watch rules)
(watch statistics)
Se desactivan con:
(unwatch <item-observado>)
(defrule nombre comentario opcional
(patron-1) . . . . (patron-n)
=>
(accion-1) . . . . (accion-m) )
El nombre de cada regla debe ser nico.
Reglas
(deftemplate peligro (slot tipo))
(deftemplate respuesta (slot accion))
Sean estas dos plantillas:
(defrule peligro-presion regla ejemplo
(peligro (tipo presion-excesiva))
=>
(assert (respuesta
(action abrir-valvula))))
Ejemplo de regla:
Agenda
(agenda)
CLIPS coloca en la Agenda las reglas cuyos
patrones antecedente concuerdan con hechos.
0 emergencia-tipo-1: f-0
0 emergencia-tipo-2: f-1
5 ambulancia-libre: f-2
El contenido de la Agenda se puede
inspeccionar con el comando agenda
Otros comandos
(clear)
Restaura el estado inicial de CLIPS: borra
todos los hechos y todas las reglas, reinicia
a cero el identificador de hechos.
(run)
Ejecuta el programa. Este termina cuando
ya no hay activaciones en la agenda
(printout t Hola mundo ! crlf)
Variables
Comienzan por signo de interrogacin.
Ejemplos:
?precio
?nn
?color
Durante la comparacin de antecedentes de
reglas con hechos, si hay concordancia entre
un patrn que tenga variables y un hecho, las
variables se enlazan a los valores
correspondientes dentro del hecho; son valores
vlidos dentro de la regla.
Variables en reglas
Ejemplo, Sea la regla:
(defrule R-abuelo
(papa ?x ?y )
(papa ?y ?z )
=>
(assert (abuelo ?x ?z ) )
)
Variables en reglas
Y sean los hechos:
(papa agustin pedro )
(papa pedro hernando )
La regla R-abuelo se activa ( agenda), y al
ejecutarse resultan las asignaciones:
?x agustin
?y pedro
Y se crea el hecho:
(abuelo agustin hernando )
Comodines (wildcards)
A veces en la comparacin de patrones y
hechos existen campos en un hecho
cuyos valores no nos interesan para lo
que queremos, pero deben tenerse en
cuenta para que haya concordancia.
Sea el hecho: (nombre jose luis ramirez)
El patrn: (nombre ? ? ramirez)
hace concordancia con ese hecho y
todos los que tengan 2 nombres y
ramirez.
Comodines (wildcards)
(nombre jose luis ramirez)
(nombre hugo ramirez)
(nombre luis pablo maria ramirez)
El patrn: (nombre ? $? ramirez)
hace concordancia con hechos como:
$? comodn para cero o ms campos
Ejecutando
(deftemplate persona (slot nombre)
(slot edad) (slot estatura) (slot color-de-cabello))
(assert (persona (nombre juan)
(edad 30) (estatura 173) (color-de-cabello rubio)))

(assert (persona (nombre pedro)
(edad 20) (estatura 166) (color-de-cabello negro)))

CLIPS>
CLIPS>
<Fact-0>
CLIPS>
<Fact-1>
(defrule hallar-rubios
(persona (nombre ?nn)
(color-de-cabello rubio))
=>
(printout t ?nn " es rubio" crlf))


(run)
juan es rubio
CLIPS>
CLIPS>
CLIPS>
Un ejemplo con 2 reglas
CLIPS> (assert (perro rintintin))
<Fact-0>
CLIPS> (assert (perro lassie))
<Fact-1>
CLIPS> (assert (perro laika))
<Fact-2>
CLIPS> (assert (gato felix))
<Fact-3>
CLIPS> (assert (gato garfield))
<Fact-4>
<CLIPS>
(defrule ladran ""
(perro ?x)
=>
(assert (ladra ?x))
(printout t "ladra " ?x crlf))
(defrule maullan ""
(gato ?x)
=>
(assert (maulla ?x))
(printout t "maulla " ?x crlf))
CLIPS>
CLIPS>
CLIPS>
(facts)
f-0 (perro rintintin)
f-1 (perro lassie)
f-2 (perro laika)
f-3 (gato felix)
f-4 (gato garfield)
For a total of 5 facts.
CLIPS>
CLIPS>
(run)
maulla garfield
maulla felix
ladra laika
ladra lassie
ladra rintintin
CLIPS>
CLIPS>
(facts)
f-0 (perro rintintin)
f-1 (perro lassie)
f-2 (perro laika)
f-3 (gato felix)
f-4 (gato garfield)
f-5 (maulla garfield)
f-6 (maulla felix)
f-7 (ladra laika)
f-8 (ladra lassie)
f-9 (ladra rintintin)
For a total of 10 facts.
CLIPS>
CLIPS>
Variables multicampo
Si anteponemos $ a una variable en un
patrn, esa variable hara concordancia
(matching) con una lista de cero o ms
smbolos en un hecho, en CLIPS esta lista es
un valor multicampo.
A la variable se asigna pues la lista
multicampo en este caso. El signo $ no es
parte del nombre de la variable. El $ es como
una funcin cuyo argumento es una variable
monocampo y que retorna una variable
multicampo
Variables multicampo
(assert (escritor gabriel garcia marquez))

(defrule R1
(escritor $?nombres )
=>
(printout t ?nombres crlf ) )
(run)
CLIPS>
CLIPS>
<Fact-0>
CLIPS>
(gabriel garcia marquez)
CLIPS>
Restricciones en variables
(metal oro)
(metal titanio)
(metal plata)
El patrn: (metal oro | plata | titanio )
hace concordancia con los hechos:
Restricciones en variables
(metal titanio)
(metal plata)
El patrn: (metal ~oro )
hace concordancia con cualquier
smbolo excepto oro
Restricciones en variables
(metal ?m&~titanio&~oro)
Se puede usar el operador & para poner
una combinacin de restricciones a una
variable.
Ejemplo, el patrn:
har concordancia con cualquier hecho
metal en el cual el metal no sea titanio
ni oro, y el valor de ?m ser asignado al
valor que concuerde.
Prioridades de las reglas
(declare (salience 25) )
A las reglas se les puede asignar una
prioridad (salience). Estas se pueden
declarar as:
en la regla, entre el comentario opcional y
el primer patrn del antecedente.
El valor puede ir de -10000 a +10000.
Si no se declara, CLIPS asume un valor
de cero.
Orden de ejecucin de las reglas
En la Agenda las reglas de mayor valor
salience se colocan sobre las de menor
valor, y se ejecutan primero.

Dentro de reglas de igual salience, la
colocacin de las reglas en la agenda
est determinada por una estrategia de
resolucin de conflictos basada en el
orden en que se van activando las reglas.
Por defecto, la estrategia de resolucin
de conflictos es por primero en
profundidad (depth):

Las nuevas reglas activadas van encima
de las que existan en la agenda.
Orden de ejecucin de las reglas
Se puede usar una estrategia primero en
amplitud (breadth), que coloca las
nuevas reglas activadas debajo de las
reglas preexistentes.
Para cambiar de la estrategia por defecto
a esta, se usa el comando:
Orden de ejecucin de las reglas
(set-strategy breadth)
Hay otras estrategias pero estas 2 son
las ms usuales
(deffunction <nombre> "comentario opcional"
(?arg1 ?arg2 ... ?argM [$?argN])
<accion1>
<accion2>
...
<accion(K-1)>
<accionK>
)
( deffunction hipotenusa
(?a ?b)
(sqrt (+ ( * ?a ?a) (* ?b ?b) ) ) )
( hipotenusa 4 6 )
7.21110255092798
CLIPS>
CLIPS>
CLIPS>
(deffunction interrogar (?pregunta $?allowed-values)
(printout t ?pregunta)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta))
)
(while (not (member ?respuesta ?allowed-values)) do
(printout t ?pregunta)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta))
)
)
?respuesta
)
(deffunction afirmativo (?pregunta)
(bind ?larespuesta (interrogar ?pregunta si no s n))
(if (or (eq ?larespuesta si) (eq ?larespuesta s))
then TRUE
else FALSE
)
)

;===============================
(defrule licor-disponible ""
=>
(if (afirmativo "Tiene brandy (si/no)? ")
then
(assert (disponible brandy))
else
(if (afirmativo "Tiene conac (si/no)? ")
then
(assert (disponible conac))
else
(printout t "Lo siento, no se puede hacer el coctel"crlf)
)
)
)
Otros comandos
(list-defrules)
(list-deftemplates)
(list-deffacts)
Listar nombres de defrules,
deftemplates y deffacts:
Otros comandos
(ppdefrule <nombre>)
(ppdeftemplate <nombre>)
(ppdeffacts <nombre>)
Listar contenido (declaraciones)
de defrules, deftemplates y
deffacts:
Otros comandos
(undefrule <nombre>)
(undeftemplate <nombre>)
(undeffacts <nombre>)
Borrar defrules, deftemplates y
deffacts:

También podría gustarte