Documente Academic
Documente Profesional
Documente Cultură
INTRODUCCIN:
Hechos ordenados y no ordenados Una plantilla se puede considerar como un molde de hechos, definen patrones que seguirn hechos de un mismo tipo. Se definen slots cada uno con sus diferentes propiedades y/o restricciones.
ESTRUCTURA:
(deftemplate persona (slot dni (default ?NONE)) (slot nombre) (slot edad (type INTEGER)(range 1 13)) (multislot fecha_nacimiento) )
DEFAULT (ESTTICOS):
Este tipo de default, el valor por defecto que se le va a asignar a un slot se define en el momento en que se crea la plantilla, una vez creada la plantilla quedo definido el valor por defecto del slot y este se asignar sin cambiar en todas las inserciones (assert) que se hagan. (default ?DERIVE | ?NONE | <expresin>*)
?DERIVE: Este es el tipo de default esttico que esta definido en todos los campos si es que no se a definido que tipo de valor por defecto tendrn.
(deftemplate persona (slot nombre (default ?Derive)) (slot edad (type integer) )
Ej.: (deftemplate ejemplo (slot a) ; (slot a (type SYMBOL)) (slot b (type INTEGER)) (slot c (allowed-values rojo verde azul)) (multislot d) (multislot e (cardinality 2 2)(type FLOAT) (range 3.5 10.0) ) (slot f (type STRING)) )
(assert(ejemplo ))
Obtendramos que los valores de los campos del hecho son: (ejemplo (a nil) (b 0) (c rojo) (d) (e 3.5 3.5)(f ))
?NONE: Este tipo de default esttico hace que en el campo el que se haya definido necesariamente a la hora de ingresar (assert) tiene que tener algn valor, no puede obviarse es campo ya que si se hace eso te botar error.
(deftemplate persona (slot dni (default ?NONE)) (slot nombre) )
valor en el
Entonces la salida del clips sera: CLIPS> (assert (persona)) [TMPLTRHS1] Slot dni requires a value because of its (default ?NONE) attribute.
Valores Definidos:
En este tipo de default esttico, el valor por defecto que nuestro campo nosotros lo definimos. (deftemplate producto (slot nombre (default ?NONE)) (slot tipo (allowed-values comestible no_comestible)(default comestible)) (slot stock(type integer)(range 0 1000)(default 10) ) ) tendr
DEFAULT-DYNAMIC:
Este tipo de default, el valor por defecto que se le va a asignar a un slot se define en el momento en que se va a crear el hecho, una vez creado el hecho quedo definido el valor por defecto del slot y este variar cada vez que se asigne un nuevo hecho. (default-dynamic <expresin>*)
Ejemplo:
(deftemplate producto (slot codigo (default-dynamic gensym)) (slot nombre (default ?NONE)) (slot precio (type integer) (slot area (type STRING)) ) Si introducimos un hecho en la MT sin dar ningn valor a sus slots excepto el de nombre: (assert (producto (nombre TV)))
Entonces al listar los hechos veremos que los valores por defecto que se asignaron fueron lo siguientes:
(producto (codigo gen1) (nombre "tv") (precio 0) (area "")) (producto (codigo gen2) (nombre "dvd") (precio 0) (area ""))
Ejemplo: (deftemplate objeto (slot marca) (slot precio) (slot codigo) (multislot areas) ) (defrule regla (objeto(marca ?m)(precio ?p)) (objeto(marca ?m)(precio 20)) => (printout t "hola") )
Se pueden establecer restricciones en los atributos en la definicin de plantillas (deftemplate). Restricciones estticas. En este caso la posible violacin de la restriccin se chequea cuando se carga un programa CLIPS.
Restricciones dinmicas. En este caso la posible violacin de la restriccin se chequea cuando un programa CLIPS esta ejecutndose.
Se hace referencia a los atributos que tendra la casilla, entendiendo como las restricciones referentes tanto a los valores por defecto de las casillas, <atrib-por-defecto>, como al tipo de datos, rango y cardinalidad que pueden almacenar , <restricciones-atributo>
Tipos de Atributos.
Especica el tipo de valor que puede almacenarse en la casilla que se restringe. (deftemplate alumno "Relacion alumno" (slot nombre (type STRING)) (slot apellido (type STRING)) (slot codigo (type ?VARIABLE)) (slot color-ojos (type SYMBOL)) (slot edad (type INTEGER)) )
CLIPS> ( assert ( alumno (nombre "carlos"))) <Fact-2> CLIPS> ( assert ( alumno (codigo 2h))) <Fact-3> CLIPS> ( assert ( alumno (codigo "cod"))) <Fact-4>
(deftemplate trabajador "Relacion trabajador" (slot nombre (type STRING)) (slot apellido (type STRING)) (slot codigo (type ?VARIABLE)) (slot peso(allowed-numbers 20 25.9)) (slot color-ojos (type SYMBOL)) (slot edad (type INTEGER)) ))
OBS:
Cuando los atributos son numricos conviene, en ocasiones, establecer sus valores mximo y mnimo
* Si no existe alguno de los limites puede utilizarse como valor el smbolo ?VARIABLE * Si se utiliza la palabra ?VARIABLE como valor mnimo, entonces el limite inferior toma el valor , y si se utiliza como valor mximo, dicho limite toma el valor +. * Si se utiliza la restriccin de rango, no pueden utilizarse las restricciones allowed-integers, allowed-floats, allowed-numbers y allowed-values.
En ocasiones puede que deseamos que el usuario introduzca una cantidad limite de valores en una casilla multicampo.
* Si se utiliza la palabra clave ?VARIABLE como primer limite, entonces la cardinalidad mnima es cero. Si se utiliza la palabra clave ?VARIABLE como segundo limite, entonces la cardinalidad mxima es + * Si no se especifica la cardinalidad de un atributo se supone que se opto por introducir ?VARIABLE en ambos limites.
( deftemplate medico "datos de un medico" (slot nombre (type STRING)(default ?NONE)) (slot edad (type INTEGER) (range 0 ?VARIABLE)) (slot sexo(allowed-values hombre mujer)) (multislot guardias (type INTEGER) (range 1 31) (cardinality 0 4)) )
CLIPS> ( assert(medico)) [TMPLTRHS1] Slot nombre requires a value because of its (default ?NONE) attribute. CLIPS> ( assert(medico(nombre "carlos"))) <Fact-1> CLIPS> ( assert(medico(nombre "Maria")(edad 24)(sexo mujer)(guardias 4 5 8 12))) <Fact-2>
NOTA: CLIPS realiza por defecto comprobaciones de tipo estaticas ( es decir en el momento de leer las expresiones correspondientes). Pero tambien puede realizarlos de forma dinamica ( en tiempo de ejecucion) esto se puede manipular utilizando las instrucciones: get-static-constraint-checking set-static-constraint-checking < valor> get-dynamic-constraint-checking set-dynamic-constraint-checking <valor>
DEFFACTS
DEFFACTS
La orden (deffacts) es una alternativa a (assert) para afirmar hechos. Deffacts se entiende como el conjunto de hechos iniciales que se disponen al comenzar el problema. Sintaxis (deffacts <nombre-definicin> [<comentario>] <hecho>*)
COMO USARLO?
Modo usual de utilizar deffacts es: 1. 2. 3. Declarar tantos hechos iniciales como deseemos con uno o varios deffacts. Ejecutar reset para usar los hecho previamente declarados. Ejecutar mas comandos de CLIPS.
EJEMPLO
CLIPS> (clear) CLIPS> (deffacts paseo "Algunos hechos sobre el paseo" (estado paseando) ;Hecho para ser insertado (tipo-de-paseo largo)) ;Hecho para ser insertado CLIPS> (reset) ;Hace que los hechos deffactssean insertados CLIPS> (facts) f-0 (initial-fact) f-1 (estado paseando) f-2 (tipo-de-paseo largo) Fora totalof3facts. CLIPS>
VISUALIZACION DE HECHOS
(ppdeffacts <nombre-deffacts>)
(list-deffacts)
BORRADO DE HECHOS
Para borrar hechos definidos previamente se utiliza el destructor undeffacts que tiene la Sintaxis: (undeffacts <nombre-de-la-definicion>)
Donde <nombre-de-la-definicion> ::= *|Un simbolo utilizado previamente por un deffacts
No debe confundir retract con undeffacts. El primero lo que hace es eliminar un hecho de la memoria de trabajo. El segundo no elimina nada de la memoria de trabajo. Solo dice que en el caso de que reinicie (despues de un reset) no se vuelvan a afirmar los hechos que se construyeron con <nombre-de-la-definicion>.