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 |