Вы находитесь на странице: 1из 9

CLIPS

Variables: Valor monocampo: hola 1 2.3 Valor multicampo: () (hola) (relaciona 1 2.3) Uso: ?x ?y Variables multicampo: $?x Variables globales: (defglobal <nombre>) Uso: ?*<nombre>* (ppdefglobal <nombre>) Uso: solo poner el nombre Funciones: Entre parntesis. Se ponen en notacin prefija: llamada + argumentos Ejemplo: (+ 4 5) printout: imprime por pantalla. Ejemplo (printout t Valor: ?x crlf). Imprime Valor: + x Contructores: Encerrados entre parntesis defmodule: define un mdulo defrule: define una regla deffacts: defice un conjunto de hechos que son automaticamente afirmados al hacer un reset deftemplate: define una plantilla defglobal: define una variable global deffunction: define una funcin defgeneric: define una funcion genrica defmethod: define un mtodo Comentarios: En los constructores entre : (defrule regla-1 Regla... Comentario de linea: ;comentario de linea

1/9

Hechos: Ordenados: (nombre-relacion campo1 campo2...) No ordenados o plantillas: (nombre-relacion (campo1 <valor>) (campo2 <valor>) (deftemplate nombre-hecho (slot campo1) (slot campo2) (multislot campo3)...) Tipo: (slot campo1 (type <tipo>)) symbol, string, lexeme, integer, float, number, Valores permitidos: (allowed-symbols campo1 campo2...) Rango permitido: (range ?VARIABLE 30) de -infinito a 30 Cardinalidad: (cardinality 0 5) entre 0 y 5 valores Valores por defecto: (default <>) Mostrar plantilla: (ppdeftemplate dato) Borrar plantilla: undeftemplate Modificar/Duplicar: modify/duplicate

Afirmar: assert (assert (hecho)) Eliminar: retract <nombre/s o numero/s de hecho/s o *> [aunque se borre, los indices no cambian] Duplicar: duplicate Afirmar hechos: assert (hecho) Ver hechos: facts Hechos iniciales: deffacts. Pueden ser ordenados o plantillas (con la definicin de la plantilla antes) Funciones: list-deffacts, undeffacts y ppdeffacts <nombre>[muestra la definicion de un conjunto de hechos iniciales]. Reiniciar hechos: reset Limpiar hechos: clear Depurar: watch facts / unwatch facts [muestra los hechos elmininados o insertados.]

Variables Globales: Uso incorrecto: (defrule ejemplo1 (valor ?*x*) => ) Uso correcto: (defrule ejemplo1 (valor ?y&: (= ?y ?*x*)) => ) El segundo es el correcto porque no se puede emparejar un hecho directamente con la variables global, hay que emparejarlo con una variable local y luego comparando su valor con el de la variable global. Modificar: bind <variable> <expresion>* Ver valor: poniendo su nombre o show-defglobals [<nombre-modulo>]

2/9

Reglas: defrule nombre [comentarios] [<propiedades>] <Antecedente, condicional>* => <accin>* El antecedente se comprueba de manera secuencial, cuando uno no se cumple se para. Las reglas no tienen porque ejecutarse de manera secuencial. Estados: Inactiva: definida, pero no se cumple el antecedente. Activa: cuando se cumple el antecedente y puede ejecutarse. En ejecucin: cuando el motor de inferencia decide que se debe ejecutar y se ejecuta el consecuente. Cuando una regla se activa, pasa a la agenda, la cual tiene la lista de activaciones. CLIPS usa encadenamiendo hacia adelanteo dirigido por datos, es decir, con los hechos se activan reglas que pueden aadir mas hechos que activen mas reglas.

Ciclo de ejecucin: 1. Se ejecuta la orden (run [<mximo>]) 2. Si se ha alcanzado el mximo de disparos, se para la ejecucin 3. Se actualiza la agenda, ya que puede ser que se aadan, modifiquen o eliminen hechos en la base de hechos, lo que puede hacer que se eliminen o se aadan activaciones a la agendaa 4. Se selecciona la instancia de la regla a ejecutar de acuerdo a las prioridades y estrategia de resolucin de conflictos 5. Se dispara la instancia seleccionada y se elimina de la agenda. 6. Se vuelve al paso 2. Propiedad de refraccin: una regla slo puede activarse una vez para un mismo conjunto de hechos. Si se elimina un hecho y se aade otro exactamente igual, la regla se vuelve a ejecutar.

3/9

Elementos Condicionales: Hechos ordenados: (<simbolo> <restriccin-1> <restriccin-n>) Hechos no ordenados: (<nombre-plantilla> (<nombre-slot-1 <restriccin-1> <restriccin-m>) ... (<nombre-slot-1 <restriccin-1> <restriccin-m>) Comodines: equivalen a 0, 1, o varios elementos de cualquier tipo Monocampo: ? Multicampo: $? Se pueden dar varios casos, por lo que la regla se activaria varias veces. Se tienen que poner estos si se situan en un multislot de una plantilla. Variables: Son iguales que los comodines, pero seguido de un nombre. La primera vez que aparece en un antecedente, si concuerda con algun conjunto, se le asignar un valor y se conservar dentro de su mbito. La primera vez que aparece se comporta como comodin, el resto se comportar como un literal. La funcin (length ?c) devuelve el nmero de objetos recogidos en la variable multicampo 'c'. Restricciones conectivas: & (and), | (or) operador binario ~ (not) se satisface si la restriccin a la que afecta no se satisface. Ejemplos (defrule ejemplo1 (datos ~azul) => ) (defrule ejemplo2 (datos (valor ~rojo&~verde) => ) (defrule ejemplo3 (datos (valor verde|rojo) => ) Restricciones Predicado: se realizan con el comando : (dos puntos) Devuelve true o false dependiendo de lo que devuelva una funcion predicado. Ejemplo: Numberp devuelve true si su argumento es un numero(symbolp con simbolos). La regla se activar ante (dato 2) pero no ante (dato rojo). (defrule regla (datos ?x&:(numberp ?x)) => ) Restricciones de valor devuelto: Utilizan el valor devuelto por una funcin. comando = (igual). Ejemplo: La regla se activa si el valor de la casilla y es el doble que el de la x en un hecho de la base de hechos. (defrule doble (datos (x ?x) (y =(* 2 ?x))) => ) Captura de direcciones de hechos: Ordenes assert, retract, modify, y duplicate, no obstante, las ordenes retract, modify y duplicate necesitan que se indique el hecho. Esto se consigue obteniendo la direccion del hecho colocando una variables seguida del indicador '<-' delante del elemento condicional. Ejemplo: Si en la base de datos existe el hecho (dato 1) lo borra. (defrule borra1 4/9

?hecho <- (dato 1) => (retract ?hecho)) Elemento Condicional Test: Comprueba si se cumple una condicin cualquiera. El EC test se satisface si la funcion devuelve un valor distinto de false. Ejemplo: (defrule diferencia (dato ?x) (valor ?y) (test (>= (abs (- ?x ?y)) 3)) => ) Es equivalente a (valor ?xy&:(>= (abs (- ?x ?y)) 3)) pero este es mas dificil de leer Elemento Condicional OR: La condicin se cumple si almenos una de las condiciones elementales que la forman se cumple. Ejemplo: (defrule regla (tengo pan) (or (tengo mantequilla) (tengo aceite)) => (assert (desayuno tostadas))) Ante los hechos (tengo pan), (tengo mantequilla) y (tengo aceite) se activara 2 veces la regla. Elemento Condicional AND: La condicin se cumple si se cumplen todas. Ejemplo: (defrule posibles-desayunos (tengo zumo-natural) (or (and (tengo pan) (tengo aceite)) (and (tengo leche) (tengo cereales))) => (assert (desayuno sano))) Elemento Condicional NOT: Se cumple si es falso. Puede dar errores, hacer reset. (libro) Ejemplo: (defrule Homer-loco (not (hay tele)) (not (hay cerveza)) => (assert (Homer pierde la cabeza))) Elemento Condicional exist: (exists <elemento-condicional>+) Se cumple si existen el/los hechos. Si se cumple varias veces solo se ejecuta una (en la agenda pondria algo como: f-1, que indica que hay algun hecho que es necesario para satisfacer la regla, pero no se puede decir cual es) 5/9

Ejemplo: (exist (tengo mermelada ?))

Elemento Condicional forall: (forall <elemento-condicional> <elemento-condicional>+) Comprueba que si se satisface un determinado EC se satisfacen tambin otros ECs. Se satisface si siempre que se satisface el primer EC se satisfacen tambien los siguientes. Ejemplo: (defrule todos-limpios (forall (estudiante ?nombre) (lengua ?nombre) (matematicas ?nombre) (historia ?nombre)) => (printout t To=os los estudiantes pasan de curso crlf) ) Si, por ejemplo, la base de hechos esta vacia, la regla se ejecutara. Para los hechos: (estudiante pepe), (lengua pepe), (matemticas pepe) y (historia pepe) tambien se ejecutaria, pero si a la base de hechos anterior, se aade el hecho (estudiante ana) ya no se ejecutara la regla. Elemento Condicional logical: (logical <elemento-condicional>+) Para ejecutar la regla actua como un ECs and PERO se crea un soporte lgico con los hechos afirmados en el consecuente. Esto quiere decir que si en algun momento (totalmente ajeno a si se puede o no ejecutar la regla) se elimina algun elemento del logical que da soporte a los hechos afirmados en el consecuente, estos son automaticamente retractados. Los ECs logical TIENEN que ir antes de cualquier otro EC en el antecedente. Ejemplo: (defrule regla1 (logical (a) (b)) (logical (c)) (d) => (assert (x) (y))) (defrule regla2 (logical (e) (f)) => (assert (x) (y))) (assert (a) (b) (c) (d) (e) (f)) Al ejecutar lo anterior, las reglas se activan y se disparan, afirmando los hechos (x) e (y). Si hacemos un (retract 4 5), (x) y (y) seguiran en la base de hechos ya que siguen teniendo soporte lgico de la regla1, si se elmia el hecho (d) tambien se mantienen, ya que es un hecho necesario para activar la regla, pero no da soporte lgico a los hechos (x) y (y). Finalmente, si se elimina el hecho (a) se retracta un hecho que formaba el nico conjunto de hechos (conjunto formado por (a) y (b) por un lado y (c) por otro) que quedaba de los que daban soporte lgico a los hechos dependientes por lo que (x) desaparece de la base de hechos. Prioridades: (declare (salience <expresin-entera>)) 6/9

Una regla pude tener una nica sentencia declare. La prioridad puede estar entre -10000 y 10000 la mas baja y la mas alta respectivamente. Si no se le asigna prioridad, CLIPS le asigna una prioridad 0. Si tienen la misma prioridad se considera que no se sabe cual se activar.

Otras rdenes: (ppdefrule <nombre-regla>) muestra por pantalla la definicin de la regla indicada. (list-defrules [<nombre-mdulo> | *]) muestra el nombre de las reglas que hay definidas en un mdulo especificado. Si no se especifica el mdulo, se muestran los nombres de las reglas definidas en el mdulo actual. * muestra todas las reglas de todos lo mdulos (undefrule <nombre-regla> | *) borra la regla indicada. * borra todas las reglas, a no ser que exista una llamada *.

Funciones Convencionales: Compuestas por nombre, lista de 0 o mas parmetros regulares, parametro comodin opcional que gestiona un nmero variables de argumentos y una secuencia de acciones que se ejecutarn de forma secuencial. Ejemplo 1: (deffuncion imprime-args (?a ?b $?c) (printout t ?a ?b y (length ?c) ms: ?c crlf)) Llamadas: (imprime-args 12 13) 12 13 y 0 ms: () (imprime-args 1 2 casa 3 ventana) 1 2 y 3 ms: (casa 3 ventana) Ejemplo 2: (deffunction factorial (?a) (if (or (not (integerp ?a)) (< ?a 0)) then (printout t "Error!" crlf) else (if (= ?a 0) then 1 else (* ?a (factorial (- ?a 1))) ) ) ) Funciones Genricas: definicin (defgeneric <nombre>) Normalmente no se usa, pero si se utiliza una funcion 7/9

generica antes de impementarla, se debe definir primero. Tambien se usa para hacer el cdigo mas legible. Implementacin defmethod. Compuesto de nombre, ndice(op), conjunto de parmetros monocampo, parametro multicampo (op), secuencia de acciones. Pag 160 171

Mdulos: Contructos: cualquier elemento definido mediante un constructor: deftemplate, deffacts, defrule, defglobal, deffunction, defgeneric y defmethod. Un mdulo es un bloque de cdigo que agrupa una serie de constructos. En cada mdulo se suelen incluir constructos que tengan que ver algo entre s. Los constructos que se agrupan en un mdulo no son accesibles para los dems mdulos. Cuanto mas grande es el programa, mas tiles son los mdulos Los mdulos se pueden crear, pero no borrar. Solo se pueden borrar con clear, pero se borra todos. Primero se define el mdulo con defmodule y despues se le asocian los constructos de manera explicita o implicita Explicita: al momento de definirlo, colocando ::(separador de mdulo) entre el nombre del mdulo y el del constructo. Usado con los constructores: deffacts, deftemplate, defrule, deffunction y defgeneric. Implicita: solo se puede utilizar un modulo a la vez (mdulo actual). Por lo que al definir un constructo sin indicarle que mdulo, este pertenecer al mdulo actual. set-current-module <nombre> establece el mdulo actual. Al definir un nuevo mdulo, este ser el actual. Al definir un constructo asociado a un mdulo, este pasa a ser el actual. (defrule A::r2 => ) Importar/exportar: un constructo es visible en un mdulo si se puede usar. Los constructos que se pueden exportar/importar son plantillas, variables globales, funciones convencionales y funciones genricas. Para que un constructo sea visible en otro mdulo es necesario exportar e importar. Se pueden exportar/importar todos los constructos con la variable ?ALL o ninguno con ?NONE Ejemplo 1 (defmodule A (export deftemplate datos)) (deftemplate A::datos (slot x)) (defmodule B(import A deftemplate datos)) (defrule B::r1 (datos (x 3)) => ) Ejemplo 2: (defmodule A (export deftemplate datos data)) (deftemplate datos (slot x)) (deftemplate data (slot y)) (deffacts info (datos (x 1)) (data (y 2))) (defmodule B (import A deftemplate datos data)) (reset) (facts A) (facts B) Ejemplo 3: (defmodule A (export deftemplate ?ALL)) 8/9

(assert (datos 1)) (facts) (defmodule B (import A deftemplate ?ALL)) (assert (datos 2) (data 3)) (facts) (facts A)

Otros: CLIPS es case sensitive, y en los hechos es sensible al orden.

9/9

Вам также может понравиться