Descargar

Representación estructurada – Integración de paradigmas (página 3)

Enviado por Pablo Turmero


Partes: 1, 2, 3
edu.red

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

edu.red

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

edu.red

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

edu.red

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.

edu.red

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

edu.red

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

edu.red

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)

edu.red

Ejemplos Instance-set Ejemplo

(defclass PERSONA (is-a USER) (role ab edu.red

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!

Partes: 1, 2, 3
 Página anterior Volver al principio del trabajoPágina siguiente