Sunteți pe pagina 1din 33

DEFTEMPLATE

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) )

VALORES POR DEFECTO:


Podemos asignar un valor por defecto que se asignar cuando instanciemos un dato sin necesidad de que le proporciones un dato inicial.

(assert(persona (dni 18647596)(nombre Juan)))


Tenemos default y default-dynamic.

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)) )

Si introducimos un hecho en la MT sin dar ningn valor a ninguno de sus slots:

(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) )

Si introducimos un hecho sin introducir un campo dni: (assert(persona))

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 gen2) (nombre "tv") (precio 0) (area ""))


Si volvemos a ingresar otro hecho:
(assert (producto (nombre TV))) Entonces:

(producto (codigo gen1) (nombre "tv") (precio 0) (area "")) (producto (codigo gen2) (nombre "dvd") (precio 0) (area ""))

RESTRICCIONES PREDETERMINADAS DE COINCIDENCIA DE PATRONES


Para slots que no han sido definidos en la parte izquierda de la regla (LHS) se van a definir esos slots, respetando el nmero de campos de ese slot. En si esos son los slot que no han sido nombrados en el patrn. LHS => RHS

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)) )

Definicin de restricciones sobre el tipo de datos en las casillas

CLIPS> ( assert ( alumno (nombre "carlos"))) <Fact-2> CLIPS> ( assert ( alumno (codigo 2h))) <Fact-3> CLIPS> ( assert ( alumno (codigo "cod"))) <Fact-4>

Se utilizan para enumerar los valores permitidos para un campo concreto

(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)) ))

CLIPS> ( assert (trabajador ( peso 2)))


[CSTRNCHK1] A literal slot value found in the assert command does not match the allowed values for slot peso. CLIPS> ( assert (trabajador (peso 25.9))) <Fact-2>

OBS:

( deftemplate s1(slot valor(allowed-values 1 2 3))) ( deftemplate s2(slot valor(allowed-symbols pepe juan)))


( deftemplate s2(slot valor ( type symbol) (allowed-symbols pepe juan)))

CLIPS> ( assert(s2(valor la)))


[CSTRNCHK1] A literal slot value found in the assert command does not match the allowed values for slot valor. CLIPS> ( assert(s2(valor 4))) <Fact-9>

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>*)

Donde: <nombre-de-la-definicion> <comentario> <hecho>

--> Un simbolo --> Un string

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>.

S-ar putea să vă placă și