Acceso atributos dentro del método Dentro de un método se puede acceder directamente a los atributos: ?self: y (bind ?self: ) CLIPS>(clear) CLIPS> (defclass A (is-a USER) (role concrete) (slot atr-1 (default 1)) (slot atr-2 (default 2))) CLIPS> (defmessage-handler A print-todos-slots () (printout t ?self:atr-1 “ “ ?self:atr-2 crlf)) CLIPS>(make-instance a of A) [a] CLIPS>(send [a] print-todos-slots) 1 2 CLIPS>(defmessage-handler A set-atr-1 (?valor) (bind ?self:atr-1 ?valor)) CLIPS> (send [a] set-atr-1 34) 34
Funciones genéricas Una función genérica puede examinar la clase de sus argumentos En el cuerpo de los métodos se pueden enviar mensajes a los argumentos que son instancias de alguna clase. Permite la sobrecarga de operadores CLIPS>(clear) CLIPS> (defmethod + ((?a STRING) (?b STRING)) (str-cat ?a ?b)) CLIPS>(+ 1 2) 3 CLIPS> (+ “Ho” “la”) “Hola” CLIPS> (+ “Cara” “co” “la”) [GENREXE1] No applicable methods for +. FALSE
Facets Los facets describen características de los slots: Tipo del slot: Multislot o slot. Valor por defecto (default ) Storage: (storage shared) o (storage local)
Acces: read-write, read-only, e initialize-only.
Inheritance: (propagation inherit) o (propagation non-inherit)
Source: (source exlusive) o (source composite)
Pattern-Match Reactivity: (pattern-match reactive) o (pattern-match non-reactive)
Sólo se puede dar valor por default en la definición de clase Como read-only, pero también se puede dar valor con init y make-instance. Sólo las instancias de la clase tendrán los slots Hereda facets del padre Hereda facets del padre y SUPERCLASES
Visibility: (visibility public) o (visibility private).
Create-accessor: Si se especifica read, writer o read-writer crea los métodos primarios get- y put-.
Override Message: Permite que se utilice un método específico al utilizar la forma estándar de acceder slots.
Los manejadores de mensajes de subclases pueden acceder al slot Por defecto, make-instance, initialize-instance, etc. ponen valor Con put-. Se puede especificar otro método.
Objetos y reglas Los patrones con objetos son como los patrones con hechos, excepto en: Las reglas sólo pueden reconocer clases de objetos que han sido definidas antes que las reglas. Una clase y cualquiera de los slots que es reconocido debe de ser “reactivo”. -> (Que cuando se produzca algún cambio en sus atributos se entere el motor de inferencia). Un Patrón que reconoce una superclase, reconocerá las instancias de una subclase A diferencia de los hechos, los cambios en los slots son locales y no afectan a ninguna regla que explícitamente no tenga un patrón con ese slot. Una instancia debe de ser reactiva para que sea reconocida Se permiten restricciones especiales sobre el nombre y la clase (is-a, name).
Ejemplos objetos y reglas CLIPS> (make-instance [oc1] of POSESION) [i1] CLIPS> (make-instance [oc2] of UTILITARIO) [oc2] CLIPS> (send [oc1] put-value 100) CLIPS> (defrule muestra–valores-con-valor ?oi <- (object (is-a POSESION) (valor ?x&:(> ?x 0))) => (printout t (instance-name ?oi) “ tiene un valor de “ ?x clrf)) CLIPS>(run) [oc1] tiene un valor de 100 CLIPS> (send [oc1] put-value 36) 36 CLIPS> (send [oc2] put-value 99) 99 CLIPS> (run) [oc2] tiene un valor de 99 [oc1] tiene un valor de 36
Preguntas y Acciones sobre conjuntos de instancias (TELL & ASK) COOL permite obtener y realizar acciones sobre conjuntos de instancias que cumplen ciertas propiedades (instance-set queries y distributed actions)
Ejemplos Instance-set Ejemplo
(defclass PERSONA (is-a USER) (role ab
Vinculación dinámica de manejadores que acceden a slots. Los manejadores que acceden directamente a slots se vinculan estáticamente.
(defclass A (is-a USER) (slot foo (create-accessor read)))
(defclass B (is-a USER) (role concrete) (slot foo))
CLIPS>(make-instance b of B) [b] CLIPS>(send [b] get-foo) ¡Error!, La referencia estática al slot foo de la clase A no se aplica a [b] de B
(defclass A (is-a USER) (slot foo (create-accessor read)))
(defmessage-handler A get-foo () (dynamic-get foo))
(defclass B (is-a USER) (role concrete) (slot foo (visibility public)))
CLIPS>(make-instance b of B) [b] CLIPS>(send [b] get-foo) NIL CLIPS>
¡Ojo si la clase redefine el slot!
Página anterior | Volver al principio del trabajo | Página siguiente |