Ejemplos cortos con Clips
Problemas de clase
Ejemplo de listar los nombres
(assert (nombres juan pedro paco pepe))
(defrule mostrar
?f1<-(nombres ?x $?resto)
=>
(retract ?f1)
(assert (nombres ?resto))
(printout t " " ?x ))
Ojo que no hemos utilizado la orden (reset).
Se puede probar a eliminar el retract y se ejecutaria igual, ya que aunque se crearan nuevas reglas y por el Principio de refractariedad
Un hecho solo dispara una regla una sola vez.
Pero si miramos la base de hechos vemos que se han creado nuevas reglas que si se han disparado...
CLIPS> (facts)
f-0 (nombres juan pedro paco pepe)
f-1 (nombres pedro paco pepe)
f-2 (nombres paco pepe)
f-3 (nombres pepe)
f-4 (nombres)
(runFor a total of 5 facts.
Ejemplo de obtener la suma de los 100 primeros numeros
(assert (suma 0))
(assert (i 0))
Otra forma de hacerlo seria....
(deffacts sumatorio
(suma 0)
(i 0)
)
En este caso no el primero deberemos hacer (reset) y luego (run)
(defrule suma-100
?f1<-(suma ?x)
?f2<-(i ?y)
=>
(retract ?f1)
(retract ?f2)
(if (= ?y 100) then
(printout t ?x)
else
(assert (suma (+ ?x ?y)))
(assert (i (+ 1 ?y))))
)
Variaciones y problemas cortos
Para abrir clips ejecutamos el comando clips, si estamos en windows lo ejecutaremos buscandolo y haciendo doble click. Pero me centrare en el uso de Clips con Unix.
godai@godai:~$ date
Wed Oct 9 20:08:22 CEST 2002
godai@godai:~$ clips
CLIPS (V6.10 07/01/98)
CLIPS> (exit)
godai@godai:~$
Vemos que para salir de clips solo tenemos que escribir el comando
(exit)
Veamos el primer ejemplo... mostrar una lista por pantalla...
Primero afirmamos el hecho lista
CLIPS> (assert (lista jose pedro juan antonio))
y nos sercionamos que esta en la base de hechos
CLIPS> (assert (lista manolo pedro juan perico))
Vamos a crear nuestra regla para mostrarlo por pantalla
(defrule listar
(lista $?x)
=>
(printout t "La lista es: " ?x crlf))
CLIPS> (run)
La lista es (manolo pedro juan perico)
Sobre la suma hay una forma de hacerlo solo con una variable...
directamente claro...
(assert (suma 100))
(defrule suma-100
?f1<-(suma ?x)
=>
(retract ?f1)
(assert (solucion (/ (* ?x (+ ?x 1)) 2)))
)
Si miramos con (facts) nos dara la suma que es 5050, lo importante en este
caso es ver como se ejecuta una operacion que en c seria..
int suma=100;
suma=(suma*(suma+1))/2;
Cual es el ciclo de ejecucion de una regla?
El motor de Inferencia evalua la regla comparandola con cada uno de los
patrones de la base de hechos. Lleva la regla a la agenda y la deja activa.
Si no hay mas reglas en la base de hechos dispara la regla.