La cosificación es el proceso mediante el cual una idea abstracta sobre un programa de computadora se convierte en un modelo de datos explícito u otro objeto creado en un lenguaje de programación . Un objeto computable / direccionable (un recurso) se crea en un sistema como un proxy para un objeto no computable / direccionable. Por medio de la cosificación, algo que antes estaba implícito, no expresado y posiblemente inexpresable se formula explícitamente y se pone a disposición de la manipulación conceptual (lógica o computacional). De manera informal, a menudo se hace referencia a la cosificación como "hacer de algo un ciudadano de primera clase " dentro del alcance de un sistema en particular. Algún aspecto de un sistema puede cosificarse en el momento del diseño del lenguaje , lo cual está relacionado conReflexión en lenguajes de programación. Se puede aplicar como un refinamiento gradual en el momento del diseño del sistema . La cosificación es una de las técnicas de análisis conceptual y representación del conocimiento más utilizadas .
Lenguajes de programación reflectantes
En el contexto de los lenguajes de programación , la cosificación es el proceso mediante el cual un programa de usuario o cualquier aspecto de un lenguaje de programación que estaba implícito en el programa traducido y el sistema de tiempo de ejecución, se expresa en el propio lenguaje. Este proceso lo pone a disposición del programa, que puede inspeccionar todos estos aspectos como datos ordinarios . En los lenguajes reflexivos , los datos de cosificación están conectados causalmente con el aspecto cosificado relacionado, de modo que una modificación de uno de ellos afecta al otro. Por lo tanto, los datos de cosificación son siempre una representación fiel del aspecto cosificado relacionado [ aclaración necesaria ] . A menudo se dice que los datos de reificación se convierten en un objeto de primera clase [ cita requerida ] . La cosificación, al menos parcialmente, se ha experimentado en muchos idiomas hasta la fecha: en los dialectos Lisp tempranos y en los dialectos Prolog actuales , los programas se han tratado como datos, aunque la conexión causal a menudo se ha dejado a la responsabilidad del programador. En Smalltalk -80, el compilador desde el texto fuente hasta el código de bytes ha sido parte del sistema de tiempo de ejecución desde las primeras implementaciones del lenguaje. [1]
- El lenguaje de programación C reifica el detalle de bajo nivel de las direcciones de memoria . Muchos diseños de lenguajes de programación encapsulan los detalles de la asignación de memoria en el compilador y el sistema de tiempo de ejecución. En el diseño del lenguaje de programación C, la dirección de memoria se reifica y está disponible para la manipulación directa por otras construcciones del lenguaje. Por ejemplo, el siguiente código se puede utilizar al implementar un controlador de dispositivo asignado en memoria. El puntero del búfer es un proxy para la dirección de memoria 0xB800000.
char * buffer = ( char * ) 0xB800000 ; tampón [ 0 ] = 10 ;
- Los lenguajes de programación funcional basados en lambda-calculus reifican el concepto de una abstracción de procedimiento y una aplicación de procedimiento en la forma de expresión Lambda .
- El lenguaje de programación Scheme reifica las continuaciones (aproximadamente, la pila de llamadas).
- En C # , la reificación se usa para hacer que el polimorfismo paramétrico se implemente como genéricos como una característica de primera clase del lenguaje.
- En el lenguaje de programación Java , existen "tipos confiables" que están "completamente disponibles en tiempo de ejecución" (es decir, su información no se borra durante la compilación). [2]
- REBOL reifica el código como datos y viceversa.
- Muchos lenguajes, como Lisp , JavaScript y Curl , proporcionan un procedimiento
eval
oevaluate
que reifica efectivamente al intérprete de idiomas. - El marco Logtalk para Prolog ofrece un medio para explorar la reificación en el contexto de la programación lógica .
- Los lenguajes Smalltalk y Actor permiten la cosificación de bloques y mensajes , [3] que son equivalentes a las expresiones lambda en Lisp, y thisContext que es una cosificación del bloque de ejecución actual.
- Los lenguajes homoicónicos cosifican la sintaxis del propio lenguaje en forma de un árbol de sintaxis abstracto , típicamente junto con
eval
.
Reificación de datos frente a refinamiento de datos
La cosificación de datos ( refinamiento paso a paso ) implica encontrar una representación más concreta de los tipos de datos abstractos utilizados en una especificación formal .
La cosificación de datos es la terminología del Método de Desarrollo de Viena (VDM) que la mayoría de la gente llamaría refinamiento de datos. Un ejemplo es dar un paso hacia una implementación reemplazando una representación de datos sin una contraparte en el lenguaje de implementación previsto, como conjuntos, por una que sí tiene una contraparte (como mapas con dominios fijos que pueden implementarse mediante arreglos), o al menos uno que esté más cerca de tener una contraparte, como las secuencias. La comunidad VDM prefiere la palabra "reificación" a "refinamiento", ya que el proceso tiene más que ver con concretar una idea que con refinarla. [4]
Para usos similares, consulte Reificación (lingüística) .
En modelado conceptual
La cosificación se usa ampliamente en el modelado conceptual . [5] Reificar una relación significa verla como una entidad. El propósito de cosificar una relación es hacerla explícita, cuando sea necesario agregarle información adicional. Considere el tipo de relación IsMemberOf(member:Person, Committee)
. Una instancia de IsMemberOf
es una relación que representa el hecho de que una persona es miembro de un comité. La siguiente figura muestra un ejemplo de población de IsMemberOf
parentesco en forma tabular. La persona P1 es miembro de los comités C1 y C2 . La persona P2 es miembro del comité C1 únicamente.
El mismo hecho, sin embargo, también podría verse como una entidad. Al ver una relación como una entidad, se puede decir que la entidad cosifica la relación. A esto se le llama reificación de una relación. Como cualquier otra entidad, debe ser una instancia de un tipo de entidad. En el presente ejemplo, se ha nombrado el tipo de entidad Membership
. Para cada instancia de IsMemberOf
, hay una y solo una instancia de Membership
, y viceversa. Ahora, es posible agregar más información a la relación original. Como ejemplo, podemos expresar el hecho de que "la persona p1 fue nominada para ser miembro del comité c1 por la persona p2". La relación cosificada Membership
se puede utilizar como fuente de una nueva relación IsNominatedBy(Membership, Person)
.
Para usos relacionados, consulte Reificación (representación del conocimiento) .
En lenguaje de modelado unificado (UML)
UML proporciona una construcción de clases de asociación para definir tipos de relaciones cosificadas. La clase de asociación es un elemento de modelo único que es tanto un tipo de asociación como un tipo de clase. [6] La asociación y el tipo de entidad que reifica son ambos el mismo elemento del modelo. Tenga en cuenta que los atributos no se pueden cosificar.
En la web semántica
RDF y OWL
En los lenguajes de la Web Semántica , como Resource Description Framework (RDF) y Web Ontology Language (OWL), una declaración es una relación binaria. Se utiliza para vincular dos individuos o un individuo y un valor. Las aplicaciones a veces necesitan describir otras declaraciones RDF, por ejemplo, para registrar información como cuándo se hicieron las declaraciones o quién las hizo, lo que a veces se denomina información de " procedencia ". Como ejemplo, podemos querer representar propiedades de una relación, como nuestra certeza acerca de ella, la severidad o fuerza de una relación, la relevancia de una relación, etc.
El ejemplo de la sección de modelado conceptual describe a una persona en particular con URIref person:p1
, que es miembro de committee:c1
. El triple RDF de esa descripción es
persona : p1 comité : isMemberOf comité : c1 .
Considere almacenar dos hechos adicionales: (i) registrar quién nominó a esta persona en particular para este comité (una declaración sobre la membresía en sí), y (ii) registrar quién agregó el hecho a la base de datos (una declaración sobre la declaración).
El primer caso es un caso de reificación clásica como el anterior en UML: cosificar la membresía y almacenar sus atributos y roles, etc.
comité : Membresía rdf : tipo búho : Clase . comité : membresía12345 rdf : tipo comité : membresía . comité : membresía12345 comité : ofPersona persona : p1 . Comité : membership12345 comité : inCommittee comité : c1 . persona : p2 comité : nominado comité : membership12345 .
Además, RDF proporciona un vocabulario integrado destinado a describir declaraciones RDF. Una descripción de un enunciado que utiliza este vocabulario se denomina reificación del enunciado. El vocabulario RDF cosificación consiste en el tipo rdf:Statement
y las propiedades rdf:subject
, rdf:predicate
y rdf:object
. [7]
Usando el vocabulario de cosificación, se daría una cosificación de la declaración sobre la membresía de la persona asignando a la declaración un URIref, de committee:membership12345
modo que las declaraciones descriptivas se puedan escribir de la siguiente manera:
Comité : membership12345Stat RDF : Tipo de RDF : Declaración . comité : membresía12345Estat rdf : sujeto persona : p1 . comité : membresía12345Stat rdf : comité predicado : isMemberOf . comité : membresía12345Estat rdf : objeto comité : c1 .
Estas declaraciones dicen que el recurso identificado por URIref committee:membership12345Stat
es una declaración RDF, que el sujeto de la declaración se refiere al recurso identificado por person:p1
, el predicado de la declaración se refiere al recurso identificado por committee:isMemberOf
y el objeto de la declaración se refiere al recurso committee:c1
. Suponiendo que el enunciado original está realmente identificado por committee:membership12345
, debe quedar claro al comparar el enunciado original con la cosificación que la cosificación realmente lo describe. El uso convencional del vocabulario de reificación RDF siempre implica describir una declaración usando cuatro declaraciones en este patrón. Por lo tanto, a veces se les llama el "cuadrilátero de reificación". [7]
Usando la reificación de acuerdo con esta convención, podríamos registrar el hecho de que person:p3
agregó la declaración a la base de datos por
persona : comité p3 : addedToDatabase comité : membresía12345Stat .
Es importante señalar que en el uso convencional de la reificación, se supone que el sujeto de los triples de reificación identifica una instancia particular de un triple en un documento RDF particular, en lugar de un triple arbitrario que tiene el mismo sujeto, predicado y objeto. Esta convención particular se usa porque la reificación está destinada a expresar propiedades tales como fechas de composición e información de origen, como en los ejemplos ya dados, y estas propiedades deben aplicarse a casos específicos de triples. Tenga en cuenta que el triple descrito en (subject predicate object)
sí mismo no está implícito en tal cuadrante de reificación (y no es necesario que realmente exista en la base de datos). Esto también permite utilizar este mecanismo para expresar qué triples no se sostienen.
El poder del vocabulario de reificación en RDF está restringido por la falta de un medio incorporado para asignar URIrefs a declaraciones, por lo que para expresar información de "procedencia" de este tipo en RDF, uno tiene que usar algún mecanismo (fuera de RDF ) para asignar URI a declaraciones RDF individuales, luego haga más declaraciones sobre esas declaraciones individuales, utilizando sus URI para identificarlas. [7]
En mapas de temas
En un mapa de temas XML (XTM), solo un tema puede tener un nombre o desempeñar un papel en una asociación. Uno puede usar una asociación para hacer una afirmación sobre un tema, pero no puede hacer afirmaciones directamente sobre esa afirmación. Sin embargo, es posible crear un tema que reifica una construcción que no es un tema en un mapa, lo que permite que la asociación sea nombrada y tratada como un tema en sí mismo. [8]
relaciones n -arias
En los lenguajes de la Web Semántica, como RDF y OWL, una propiedad es una relación binaria que se utiliza para vincular dos individuos o un individuo y un valor. Sin embargo, en algunos casos, la forma natural y conveniente de representar ciertos conceptos es usar relaciones para vincular a un individuo con más de un individuo o valor. Estas relaciones se denominan relaciones n-arias . Los ejemplos son la representación de relaciones entre varios individuos, como un comité, una persona que es miembro del comité y otra persona que ha nominado a la primera persona para convertirse en miembro del comité, o un comprador, un vendedor y un objeto que se compró al describir la compra de un libro.
Un enfoque más general de la reificación es crear una nueva clase explícita yn nuevas propiedades para representar una relación n -aria, haciendo que una instancia de la relación que une a los n individuos sea una instancia de esta clase. Este enfoque también se puede utilizar para representar información de procedencia y otras propiedades para una instancia de relación individual. [9]
: p1 a : Persona ; : tiene_membresía _ : membresía_12345 . _ : Membership_12345 una : La membresía ; : comité : c1 ; : nominado_por : p2 .
Vs. cotización
También es importante señalar que la reificación descrita aquí no es la misma que la "cita" que se encuentra en otros idiomas. En cambio, la cosificación describe la relación entre una instancia particular de un triple y los recursos a los que se refiere el triple. La cosificación se puede leer intuitivamente como diciendo "este triple RDF habla de estas cosas", en lugar de (como en la cita) "este triple RDF tiene esta forma". Por ejemplo, en el ejemplo de reificación utilizado en esta sección, el triple:
comité : membresía12345 rdf : sujeto persona : p1 .
la descripción rdf:subject
de la declaración original dice que el sujeto de la declaración es el recurso (la persona) identificado por el URIref person:p1
. No establece que el tema de la declaración sea el URIref en sí mismo (es decir, una cadena que comienza con ciertos caracteres), como lo haría la cita.
Ver también
- Semántica denotacional
- Semántica formal de lenguajes de programación
- Evaluador meta-circular
- Metamodelado
- Metaobjeto
- Metaprogramación
- Normalización por evaluación
- Semántica operacional
- Reflexión (informática)
- Marco de descripción de recursos
- Auto-intérprete
- Mapas de temas
Referencias
- ^ J. Malenfant, M. Jacques y F.-N. Demers, un tutorial sobre la reflexión del comportamiento y su implementación Archivado el 28 de mayo de 2010 en la Wayback Machine.
- ^ La especificación del lenguaje Java, sección 4.7 , Java SE 7 Edition
- ^ "Bloques y cierres de Smalltalk" . C2.com. 2009-10-15 . Consultado el 9 de octubre de 2010 .
- ^ Formal Methods Europe, Preguntas frecuentes, parte 13 Archivado el 12 de marzo de 2005 en la Wayback Machine .
- ^ Antoni Olivé, Modelado conceptual de sistemas de información , Springer Verlag, 2007.
- ^ Lenguaje de modelado unificado, superestructura UML , Grupo de administración de objetos, 2007-11-02.
- ^ a b c "RDF Primer" . W3.org . Consultado el 9 de octubre de 2010 .
- ^ Introducción práctica a los mapas de temas. Archivado el 3 de febrero de 2009 en la Wayback Machine .
- ^ "W3C Definiendo las relaciones N-arias en la Web Semántica" . W3.org . Consultado el 9 de octubre de 2010 .