Tutorial de CLIPS: Lenguaje y Comandos
Tutorial de CLIPS: Lenguaje y Comandos
Introducción
Í di
Índice
(
(exit)
) Cierra la interfaz CLIPS.
(run) Lanza la ejecución del programa CLIPS actualmente cargado. Se
le puede indicar el número máximo de reglas a lanzar.
(clear) Elimina todos los hechos y reglas almacenados en memoria,
equivalente a cerrar y rearrancar CLIPS.
CLIPS
(reset) Elimina sólo los hechos, no las reglas, anulando la agenda y
añadiendo los elementos definidos por defecto o iniciales.
(watch <elemento>)
elemento ) Permite realizar depuración del programa.
La orden
L d ( l
(clear)
) elimina
li i t d los
todos l hechos
h h pero también
t bié todas
t d las
l
reglas, éstas las trataremos más adelante. El comando (reset)
elimina todos los hechos de la lista y posteriormente añade los
iniciales a priori sólo (initial-fact).
iniciales, (initial fact)
H h
Hechos
CLIPS> (facts)
f-0 (initial-fact)
f-1 (tiempo nublado)
For a total of 2 facts
CLIPS> (reset)
CLIPS> (assert (color azul) (color rojo))
<Fact-2>
F 2
CLIPS> (facts)
f-0 (initial-fact)
f-1 ((color azul))
f-2 (color rojo)
For a total of 3 facts.
CLIPS> (retract 1)
CLIPS> (facts)
f-0 (initial-fact)
f-2 (color rojo)
For a total of 2 facts.
H h
Hechos
Ejercicios:
CLIPS> (clear)
CLIPS> (assert (lista-compra
papas
cebolla
ajos
pescado))
<Fact-0>
CLIPS> (facts)
f-0 (lista-compra papas cebolla ajos pescado)
For a total of 1 fact.
H h
Hechos
(
(assert (
(nombre
b José))
J é))
(deftemplate
(d ft l t datos-persona
d t
(slot nombre)
(multislot apellidos)
( l edad)
(slot d d)
(slot peso)
(slot altura)
(multislot presion-arterial ) )
((edad
d d Samuel
S l 20)
(peso Samuel 80)
(altura Samuel 188)
(
(presion-arterial
i i l Samuel
S l 130 80)
(deftemplate datos-persona
(slot nombre (type STRING) (default ?DERIVE))
((slot edad ((type
yp FLOAT)) ((default ((* 2.0 3.4))
)) ((range
g 0.0 100.0))
)) )
(deftemplate dato
(slot w (default?NONE))
((slot x ((default?DERIVE))
))
(slot y (default(gensym*) ))
(slot z (default-dynamic(gensym*) )) )
CLIPS> (clear)
CLIPS> (assert (dato))
[TMPLTRHS1] Slot w requires a value because of its (default ?NONE)
attribute.
H h
Hechos: Pl
Plantillas
till
((new-id g
gen1 flag1
g 7))
(deftemplate ficha
ficha-personal
personal
(slot nombre (type STRING))
(slot genero (type SYMBOL)(allowed-symbol hombre mujer) )
– allowed-symbols
y rico p
pobre
– allowed-strings "Ricardo" "Juan" "Pedro"
– allowed-numbers 1 2 3 4.5 -2.01 1.3e-4
– allowed-integers -100 53
– allowed-floats -2.3 1.0 300.00056
– allowed-values "Ricardo" rico 99 1.e9
H h
Hechos: Pl
Plantillas
till
((assert ((datos-persona
p (peso 150)) ((edad 23)) ((nombre Eva)))
(p )))
H h
Hechos: Pl
Plantillas
till
Ejercicios:
– Crea una plantilla y define para ella al menos cuatro campos, que
no sean todos unicampo, definiendo su tipo y valores por defecto
– Lista las plantillas existentes
– Inserta dos hechos no ordenados
– Muestra los hechos
– Inserta otros dos hechos no ordenados sin proporcionar todos los
campos
– Activa el modo watch para los hechos
– I
Inserta
t dos
d nuevos hechos
h h y elimina
li i posteriormente
t i t uno.
– Muestra los hechos
– Modifica uno de los hechos, duplica otro
– Muestra los hechos
– Elimina la plantilla
R l
Reglas
(defrule nombre_de_regla
(hecho1)
=>
(assert (hecho2)) )
No p
puede haber dos reglas
g con el mismo nombre.
R l
Reglas
(defrule <nombre-regla>
[ d
[<descripción
i ió opcional>]
i l ]
[(declare (salience <num>))]
(patrón 1)
(patrón
ó 2)
...
(patrón N)
=>
(acción 1)
(acción 2)
...
(acción N)
)
R l
Reglas
(defrule cielo
(color azul)
=>
(assert (cielo-es despejado)))
CLIPS> (run)
CLIPS> (facts)
f-0 (initial-fact)
f-1 (color rojo)
For a total of 2 facts.
R l
Reglas
CLIPS> (reset)
CLIPS> (assert (color azul) (color rojo))
CLIPS> (defrule cielo (color azul) => (assert (cielo-es despejado)))
CLIPS> (watch facts)
CLIPS> (watch rules)
CLIPS> (run)
FIRE 1 cielo: f-1
==> f-3 (cielo-es despejado)
Las reglas poseen refracción: una regla sólo se dispara una vez
para un conjunto dado de hechos, con lo que se evitan bucles
infinitos.
R l
Reglas
También
T bié puede
d no haber
h b ninguna
i acción
ió en ell consecuente,
t con lo
l
que la ejecución de la regla no tiene en ese caso ninguna
consecuencia.
(defrule cielo
(color azul)
(estamos en exterior)
(estamos-en e terior)
=>
(assert (cielo-es despejado)))
Al igual
i l que la
l acción
ió resultante,
lt t p.e. para mostrar
t un mensaje
j por
la salida estándar con printout:
(defrule cielo
(color azul)
(estamos-en exterior)
=>
((assert ((cielo-es despejado))
p j ))
(printout t “cielo despejado" crlf) )
(load “[Link]”)
(save “[Link]”)
R l
Reglas
Ejercicios:
Por ejemplo:
El identificador agrupa
g p conceptualmente
p diferentes hechos sobre
el mismo objeto:
(deffacts coche
“información del coche”
(marca Seat)
(modelo Ibiza)
(puertas 5) )
Pi
Primeros ejemplos:
j l Hechos
H h iiniciales
i i l
CLIPS> (list-deffacts)
initial-fact
arranque
For a total of 2 deffacts.
Ejercicios:
Los hechos utilizados hasta ahora en las reglas eran muy simples,
simples al
estar referidos a hechos específicos. Los comodines permiten
especificar reglas que encajen para distintos hechos. Definamos los
hechos iniciales y regla
g siguientes:
g
CLIPS> (run)
animal encontrado
animal encontrado
animal encontrado
(defrule lista-animales
(animal ?nombre)
=>
( i t t t ?nombre
(printout ? b “ encontrado"
t d " crlf))
lf))
CLIPS> (reset)
CLIPS> (run)
animal encontrado
pato encontrado
animal encontrado
gato encontrado
animal encontrado
perro encontrado
CLIPS> (deffacts arranque (animal perro) (animal gato) (animal pato) (animal
tortuga) (sangre-caliente perro) (sangre-caliente gato) (sangre-caliente pato)
(pone-huevos
(pone huevos pato) (pone
(pone-huevos
huevos tortuga))
CLIPS> (run)
gato es un mamífero
perro es un mamífero
Pi
Primeros ejemplos:
j l Variables
V i bl
(defrule
(d f l mamifero2
if 2
(mamifero ?nombre) (hijo-de ?nombre ?joven)
=>
(assert (mamifero ?joven))
(printout t ?joven " es un mamífero " crlf))
CLIPS> (run)
gatito es un mamífero
perrito es un mamífero
Pi
Primeros ejemplos:
j l Variables
V i bl
(defrule elimina
?hecho <- (mamifero ?nombre)
=>
(printout t "eliminando
eliminando “ ?hecho crlf) (retract ?hecho))
CLIPS (run)
CLIPS>
gato es un mamífero
eliminando <Fact-12>
perro es un mamífero
eliminando <Fact-13>
Fact 13
Pi
Primeros ejemplos:
j l Variables
V i bl
(defrule suma
(num ?x) (num ?y)
=>
(bind ?total (+ ?x ?y))
(printout t ?x " + " ?y " = “ ?total crlf)
(assert (total ?total)))
En este caso es una variable temporal que sólo tiene validez dentro
de esa regla.
Pi
Primeros ejemplos:
j l Variables
V i bl
(defglobal
?*var1* = 17 ?*naranjas* = “siete" )
(defrule prueba
(dato ?)
=> (bind
(bi d ?*var1*
?* 1* 3))
Pi
Primeros ejemplos:
j l Condiciones
C di i
test permite establecer condiciones que van más allá de los
hechos al permitir hacer uso de variables y valores numéricos
(defrule nonecesario
(test (> 6 5))
=>
(printout t “Seis es mayor que cinco" crlf) )
(defrule positivo
( l ?val)
(valor ? l)
(test (> ?val 0))
=>
(printout t ?val “es positivo" crlf) )
Pi
Primeros ejemplos:
j l Variables
V i bl y CCondiciones
di i
Ejercicios:
– Escriba una regla que se active ante hechos del tipo (valor a b)
– E ib una regla
Escriba l que se active
i con hechos
h h deld l tipo
i ( l a b),
(valor b)
siempre que b sea mayor que a, circunstancia en la que se
escribirán los valores de a y b en pantalla. Comprueba el
funcionamiento con la siguiente base de hechos:
(valor 6 12)
(valor 6 7)
(valor 15 30)
(valor 14 7)
Pi
Primeros ejemplos:
j l Entrada
E d y salida
lid
Puedes probar con (assert (milectura (read))) que tras leer el dato añade
un hecho. Puedes comprobarlo con (facts).
(defrule estan-luces-funcionando
(not (luces-funcionando ?))
=>
( i
(printout t "¿Están
" E á las
l luces
l d l coche
del h funcionando
f i d (S o N)?")
(assert (luces-funcionando (read))))
(defrule r3
?hecho <<- (luces
(luces-funcionando
funcionando ?)
(not (luces-funcionando S))
(not (luces-funcionando N))
=>
(printout t “Formato de respuesta incorrecto")
(retract ?hecho))
Pi
Primeros ejemplos:
j l Entrada
E d y salida
lid
(defrule obtener-nombre
=>
(printout t "Su nombre: ")
(assert (nombre (readline))))
(defrule obtener-nombre2
=>
(printout t "Su nombre: ")
(assert (nombre (explode$(readline)))))
Pi
Primeros ejemplos:
j l Entrada
E d y salida
lid
Ejercicios:
(printout <nombre-lógico>
nombre lógico <expresión>)
expresión )
(open "[Link]"
[Link] F1) ; indicando r o nada abre en modo lectura
Sentencia condicional
( if (<condición>)
then (<acciones>)
[else (<acciones>)] )
((loop-for-count
p ((<var> <inicio> <final>)) [[do]] <acción>))
(defrule continua-bucle
continua bucle
?bucle <- (bucle)
=>
(printo t t “¿Continuar?”
(printout “¿Contin ar?” crlf)
(bind ?resp (read))
(if (or (eq ?resp si)(eq ?resp s))
then
th
(retract ?bucle) ; Ante una respuesta positiva quitamos y
(assert (bucle)) ; añadimos el hecho
else
l
(retract ?bucle) ; No continuamos, simplemente eliminamos
(halt)
) )
Pi
Primeros ejemplos:
j l Estructuras
E de
d controll
(loop-for-count (?i 0 2) do
(loop-for-count (?j 1 3) do
(printout t ?i " " ?j crlf)))
(defrule rwhile
=>
(bind ? 4)
(while (> ?v 0) ; antes ?v debe tener un valor
(printout t "v es " ?v " " crlf)
(bind ?v (- ?v 1))) )
Pi
Primeros ejemplos:
j l Estructuras
E de
d controll
Ejercicios
(defrule mamifero
(animal ?nombre) (sangre-caliente ?name) (not (pone-huevos ?nombre))
=>
(assert (mamifero ?nombre))
(printout t ?nombre " es un mamífero" crlf))
(defrule coge-paraguas
(or (tiempo lloviendo) (tiempo nevando)) => (assert (paraguas necesario)))
Algunos ejemplos:
CLIPS>(+ 5 7)
12
CLIPS>(- 5 7)
-2
2
CLIPS>(* 5 7)
35
CLIPS>(/ 5 7)
0 7142857142857143
0.7142857142857143
CLIPS> (signo 3)
1
El comando list-deffunctions permite listar las funciones definidas
Pi
Primeros ejemplos:
j l Funciones
F i
n n 1
i n i
i 1 i 1
CLIPS> (sumatorio 5)
15
El
Elementos
t bábásicos:
i F
Funciones
i
Ejercicios
• Si a = b mcd( a,
a a)=a
• Si a > b mcd( a, b ) = mcd( a−b, b )
• Si a < b mcd( a, b ) = mcd( a, b−a )
El
Elementos
t bábásicos:
i F
Funciones
i
Ejercicios
(defrule no-cruzar
(luz ~verde)
=>
(printout t “No cruce”
cruce crlf)))
crlf
(defrule precaucion
(luz amarilla|intermitente)
=>
(printout t “Cruce con precaución” crlf))
(defrule puedo-cruzar
(luz ~rojo&
rojo&~aamar
marillo)
illo)
=>
(printout t "Puede cruzar“ crlf))
Pi
Primeros ejemplos:
j l Restricciones
R i i
(defrule Regla1
(dato ?x)
(persona (edad =(* 2 ?x) ) ) ; el dato de la edad debe coincidir
=>
(printout t "Encontrada persona con edad igual al doble de "
?x crlf))
(defrule Regla2
(d t ?x)
(dato ? )
(persona (edad ?y&=(* 2 ?x)|=(+ 2 ?x) ) ) ; guardamos en variable
=>
(printout t "Encontrada
Encontrada persona con edad " ?y “ que es el
doble de " ?x “ o dos años mas que " ?x
Pi
Primeros ejemplos:
j l Restricciones
R i i
(defrule Regla1
( l ??x&:(>
(valor & ( ??x 0))
=>
) ;?x tal que es mayor que 0
(defrule Regla2
(Hecho (valor ?x&:(integerp ?x)|:(floatp ?x) ) )
=>
) ; si el valor del campo de un hecho es un número
Pi
Primeros ejemplos:
j l Comodines
C di y variables
i bl
(defrule bandas
(miembro-de ?banda $?)
=>
(printout t “Hay una banda llamada " ?banda crlf))
Pi
Primeros ejemplos:
j l Comodines
C di y variables
i bl
(defrule miembros-banda
((miembro-de ?banda $? ?miembro $?))
=>
(printout t ?miembro " es miembro de " ?banda crlf))
(defrule miembros-banda2
(miembro-de ?banda $?miembros)
$
=>
(printout t “Los miembros de " ?banda " son " $?miembros crlf))
Pi
Primeros ejemplos:
j l Comodines
C di y variables
i bl
Ejercicios:
(defrule edades
(datos-personales (nombre ?nombre) (edad ?edad))
=>
( i t t t ?nombre
(printout ? b " tiene"
ti " ?edad
? d d " años."
ñ " crlf)
lf) )
(defrule edades-peso
(and
(datos-personales (nombre ?nombre) (edad ?edad))
(datos-personales (nombre ?nombre) (peso ?peso)) )
=>
(printout t ?nombre " pesa " ?peso " con " ?edad " años." crlf) )
Pi
Primeros ejemplos:
j l Plantillas
Pl ill y condiciones
di i
Como ya sabes,
sabes test permite especificar un elemento condicional
basado en una expresión, en este caso, personas con peso superior
a 100 kilos.
(defrule sobre-cien
(datos-personales (nombre ?nombre) (peso ?peso))
(test (> ?peso 100))
=>
(printout t ?nombre " pesa " ?peso " kg." crlf) )
Pi
Primeros ejemplos:
j l Plantillas
Pl ill y condiciones
di i
(defrule cumpleanos
?cumpleanos <- (cumpleanos ?nombre)
?data-fact <- (datos-personales (nombre ?nombre) (edad ?edad) )
=>
(modify ?data-fact (edad (+ ? edad 1)))
(retract ?cumpleanos) )
Al añadir
ñ di ell hecho
h h (cumpleanos
( l S
Samuel)
l) se modifica
difi su edad
d d sin
i
alterar el resto de sus registros. Se elimina finalmente el hecho
para evitar que la regla pueda volver a activarse (p.e. si se
modificara otra parte de la plantilla)
Pi
Primeros ejemplos:
j l Plantillas
Pl ill y condiciones
di i
(defrule persona-existe
(datos-personales (nombre ?nombre))
=>
(printout t “Hay una persona llamada " ?nombre crlf) )
(defrule hay-personas
(exists (datos-personales (nombre ?nombre)))
=>
>
(printout t “Al menos hay una persona" crlf) )) )
Pi
Primeros ejemplos:
j l Plantillas
Pl ill y condiciones
di i
(defrule prueba-cada-persona
(forall (datos-personales (nombre ?nombre)))
=>
(printout t “Todas las personas tienen nombre" crlf) )
Pi
Primeros ejemplos:
j l El coche
h no arranca
– A=[Coche-no-arranca]
– B=[Posible-fallo-eléctrico] ¿Porqué no
– C=[Carga-batería-<-10-volts]
[ g ] arranca este
– D=[Batería-baja-de-carga] trasto?
Pi
Primeros ejemplos:
j l El coche
h no arranca
A=[Coche-no-arranca]
Regla 1: Si [Coche
[Coche-no-arranca]
no arranca]
entonces [Posible-fallo-eléctrico]
Regla 2: Si [Posible-fallo-eléctrico] Y [Carga-batería-<-10-volts]
entonces [Batería
[Batería-baja-de-carga]
baja de carga]
Regla 1: Si A entonces B
Regla 2: Si B Y C entonces D
Pi
Primeros ejemplos:
j l El coche
h no arranca
(deffacts hecho-inicial
hecho inicial Constructor y nombre de hechos iniciales
(Coche_No_Arranca)
) Hecho inicial
(d f l primera
(defrule i Constructor y nombre de la primera regla
(Coche_No_Arranca)
entonces => Premisa equivalente a Si A
(assert (Posible_Problema_Eléctrico))
Para mostrar información por la pantalla
( i t t t “T
(printout “Tensión
ió B
Batería”
t í ” crlf)
lf)
(assert (tensión (read))) ; Solicita al usuario información respecto a la tensión de batería
)
Conclusión Comentario
I
Insertar
t un h
hecho
h en b
base L t
Lectura tteclado
l d
defrule Distancia
=>
(printout t "Distancia al teatro (en kilómetros)" crlf)
(assert (distancia (read)))
)
(defrule Tiempo_comienzo
=>
(printout t "Tiempo disponible hasta el comienzo de la función (en minutos)" crlf)
(assert (tiempo (read)))
)
Pi
Primeros ejemplos:
j l Vamos
V all tteatro
t
(defrule Meteo
(consulta_meteo)
=>
(printout t "¿Cómo está el tiempo (bueno o malo)?" crlf)
(assert (meteo (read)))
)
(defrule Lugar
(pregunta loc)
(pregunta_loc)
=>
(printout t "¿Dónde es la función (centro o afueras)?" crlf)
(assert (loc (read)))
)
(defrule R1
(distancia ?dist)
(test (> ?dist 2)) ; Está
á a más
á de 2 kilómetros
ó
=>
(assert (transporte coche))
(assert (pregunta_loc))
)
Pi
Primeros ejemplos:
j l Vamos
V all tteatro
t
(defrule R2
(distancia ?dist)
(tiempo ?temp)
(test (> ?dist 1)) ; Está a más de 1 kilómetro
(test (< ?temp 10)) ; Tenemos menos de 10 minutos
=>
(assert (transporte coche))
(assert (pregunta_loc))
)
(defrule R3
(distancia ?dist)
(ti
(tiempo ?t
?temp))
(test (> ?dist 1)) ; Está a más de 1 kilómetro
(test (< ?dist 2)) ; Está a menos de 2 kilómetros
(test (> ?temp 10)) ; Tenemos más de 10 minutos
=>
(assert (transporte a_pie))
)
Pi
Primeros ejemplos:
j l Vamos
V all tteatro
t
(defrule R4
(distancia ?dist)
(tiempo ?temp)
(test (< ?dist 1.5)) ; Está a menos de 1.5 kilómetros
(test (> ?temp 10)) ; Tenemos más de 10 minutos
=>
(assert (transporte a_pie))
(assert (consulta_meteo))
)
(defrule R5
(transporte coche)
(l centro)
(loc t )
=>
(printout t "Toma un taxi al centro" crlf)
(halt)
)
Pi
Primeros ejemplos:
j l Vamos
V all tteatro
t
(defrule R6
(transporte coche)
(loc ~centro)
=>
(printout t "Toma
Toma tu coche"
coche crlf)
(halt) )
(defrule R7
(transporte a_pie)
a pie)
(meteo bueno)
=>
(printout t "Ve a pie" crlf)
(h lt) )
(halt)
(defrule R8
(transporte a_pie)
(meteo ~bueno)
=>
(printout t "Ve a pie, pero no olvides el paraguas" crlf)
(halt) )
Pi
Primeros ejemplos:
j l Logs
L
(deftemplate datos-personales
(slot nombre) (slot edad)
(slot peso) (slot fumador)
(multislot fecha-nacimiento)
fecha nacimiento) )
(deffacts gente
(datos-personales (nombre angel) (peso 60) (edad 30)
(fumador no) (fecha-nacimiento
(fecha nacimiento 18 06 1970))
(datos-personales (nombre belinda) (peso 120) (edad 45)
(fumador si) (fecha-nacimiento 18 06 1955))
(datos-personales (nombre carlos) (peso 120) (edad 60)
(fumador si)(fecha-nacimiento
si)(fecha nacimiento 18 06 1940)) )
(deffacts datos
(fecha 08 10 2008) )
Pi
Primeros ejemplos:
j l Consistencia
C i t i
(defrule riesgo-cardiaco
(datos-personales (nombre ?nombre) (fumador si)
(peso ?peso)) (test (> ?peso 100))
=>
(assert (riesgo-cardiaco ?nombre)) )
(defrule riesgo-cardiaco
(logical (datos-personales (nombre ?nombre) (fumador si) (peso
?peso)))
(l i l (test
(logical (t t (>
( ?peso
? 100)))
=>
(assert (riesgo-cardiaco ?nombre)) )
Pi
Primeros ejemplos:
j l Consistencia
C i t i
(defrule molesta-fumadores
(datos-personales (nombre ?nombre) (fumador si))
=> (printout t ?nombre " es un loco." crlf) )
((defrule p
preocupa-por-delgados
p p g
(datos-personales (nombre ?nombre) (peso ?peso)) (test (< ?peso 80))
(printout t ?nombre " parece algo delgado." crlf) )
La regla
g p preocupa-por-delgados
p p g tendrá p
prioridad. Se recomienda
utilizar esta propiedad de forma comedida.
Pi
Primeros ejemplos:
j l Resolución
R l ió de d conflictos
fli
(l
(location
ti station
t ti marble-arch)
bl h)
(defrule found-it
(declare (salience 100))
(end-station ?station)
(location station ?station)
=>
(printout t "FOUND IT!" crlf)) ((halt))
(p ))
– Reglas de estado
– Preguntas
g
– Reglas de sugerencias
– Reglas de reparaciones
– Control de fase
– Selección de cualidades
– Selección de vino
– Preguntas
– Presentación
– Reglas de eliminación
– Reglas de combinación
– Control de fase
Alejandro Talavera
Ej
Ejemplos:
l Curso
C 09/10
Desiré Santana
Ej
Ejemplos:
l Curso
C 09/10
Rayco Toledo
Ej
Ejemplos:
l Curso
C 09/10
Rayco Toledo
Ej
Ejemplos:
l Curso
C 09/10
Cristina Medina
Ej
Ejemplos:
l Curso
C 10/11
I l i en la
Incluir l memoria:
i
Fechas:
Definición temática del trabajo 18 Noviembre
Fecha tope de entrega 13 Enero
Fecha tope
p entrega
g revisión 27 de Enero
R f
Referencias/Documentación
i /D t ió
• Ejemplo
j p consulta médica