En informática , la reificación es el proceso por el cual una idea abstracta sobre un programa 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 reificación, algo que anteriormente era 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, la reificación a menudo se conoce como "hacer de algo un ciudadano de primera clase " dentro del alcance de un sistema particular. Algún aspecto de un sistema se puede reificar en el momento del diseño del lenguaje , lo que está relacionado con la reflexión en los lenguajes de programación. Se puede aplicar como un refinamiento gradual en el momento del diseño del sistema . La reificación es una de las técnicas de análisis conceptual y representación del conocimiento más utilizadas .
En el contexto de los lenguajes de programación , la reificación es el proceso por 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 expresan en el lenguaje mismo. 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 reificación están conectados causalmente con el aspecto reificado relacionado de tal manera que una modificación de uno de ellos afecta al otro. Por lo tanto, los datos de reificación son siempre una representación fiel del aspecto reificado 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 reificación, al menos parcialmente, se ha experimentado en muchos lenguajes hasta la fecha: en los primeros dialectos de Lisp y en los dialectos actuales de Prolog , 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 del texto fuente al bytecode ha sido parte del sistema de tiempo de ejecución desde las primeras implementaciones del lenguaje. [1]
char * buffer = ( char * ) 0xB8000000 ; buffer [ 0 ] = 10 ;
eval
orevaluate
que efectivamente materializa el intérprete del lenguaje.thisContext
en Smalltalk, que es una cosificación del bloque que se está ejecutando actualmente.eval
.La reificación de datos ( refinamiento gradual ) implica encontrar una representación más concreta de los tipos de datos abstractos utilizados en una especificación formal .
La reificación de datos es la terminología del Método de Desarrollo de Viena (VDM, por sus siglas en inglés) que la mayoría de las personas denominarían 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í tenga una contraparte (como mapas con dominios fijos que se puedan implementar mediante matrices), o al menos una que esté más cerca de tener una contraparte, como secuencias. La comunidad VDM prefiere la palabra "reificación" en lugar de "refinamiento", ya que el proceso tiene más que ver con la concreción de una idea que con su refinamiento. [4]
Para usos similares, véase Reificación (lingüística) .
La cosificación se utiliza ampliamente en el modelado conceptual . [5] Cosificar una relación significa verla como una entidad. El propósito de cosificar una relación es hacerla explícita, cuando se necesita 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
relación en forma de tabla. La persona P1 es miembro de los comités C1 y C2 . La persona P2 es miembro solo del comité C1 .
Sin embargo, el mismo hecho también podría considerarse como una entidad. Al considerar una relación como una entidad, se puede decir que la entidad cosifica la relación. Esto se denomina cosificación de una relación. Como cualquier otra entidad, debe ser una instancia de un tipo de entidad. En el presente ejemplo, el tipo de entidad se ha denominado 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 la fuente de una nueva relación IsNominatedBy(Membership, Person)
.
Para usos relacionados, consulte Reificación (representación del conocimiento) .
UML proporciona una construcción de clase de asociación para definir tipos de relaciones reificadas. La clase de asociación es un elemento de modelo único que es a la vez un tipo de asociación [6] y un tipo de clase. [7]
La asociación y el tipo de entidad que cosifica son el mismo elemento del modelo. Tenga en cuenta que los atributos no se pueden cosificar.
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 realizaron las declaraciones o quién las realizó, lo que a veces se denomina información de " procedencia ". A modo de ejemplo, es posible que queramos representar propiedades de una relación, como nuestra certeza sobre ella, la gravedad o la 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 más: (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: reificar 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é : dePersona persona : p1 . comité : membresía12345 comité : enComité comité : c1 . persona : p2 comité : nominado comité : membresía12345 .
Además, RDF proporciona un vocabulario integrado destinado a describir las sentencias RDF. Una descripción de una sentencia que utiliza este vocabulario se denomina cosificación de la sentencia. El vocabulario de cosificación RDF consta del tipo rdf:Statement
, y las propiedades rdf:subject
, rdf:predicate
, y rdf:object
. [8]
Utilizando el vocabulario de reificación, se daría una reificación de la declaración sobre la membresía de la persona asignando a la declaración un URIref tal que committee:membership12345
las declaraciones descriptivas se puedan escribir de la siguiente manera:
comité : membresía12345Stat rdf : tipo rdf : Declaración . comité : membresía12345Stat rdf : sujeto persona : p1 . comité : membresía12345Stat rdf : predicado comité : isMemberOf . comité : membresía12345Stat rdf : objeto comité : c1 .
Estas declaraciones indican 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 la declaración original está realmente identificada por committee:membership12345
, debería quedar claro al comparar la declaración original con la reificación que la reificación realmente la describe. El uso convencional del vocabulario de reificación RDF siempre implica describir una declaración utilizando cuatro declaraciones en este patrón. Por lo tanto, a veces se las denomina "cuadrado de reificación". [8]
Usando la reificación según esta convención, podríamos registrar el hecho de que person:p3
se agregó la declaración a la base de datos por
persona : p3 comité : addedToDatabase comité : membresía12345Estadísticas .
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 tenga el mismo sujeto, predicado y objeto. Esta convención particular se utiliza porque la reificación está destinada a expresar propiedades como fechas de composición e información de la fuente, como en los ejemplos dados anteriormente, y estas propiedades deben aplicarse a instancias específicas de triples. Tenga en cuenta que el triple descrito (subject predicate object)
en sí no está implícito en dicho cuádruple de reificación (y no es necesario que exista realmente en la base de datos). Esto también permite utilizar este mecanismo para expresar qué triples no se cumplen .
El poder del vocabulario de reificación en RDF está restringido por la falta de un medio integrado para asignar URIrefs a las 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 URIs a declaraciones RDF individuales, y luego hacer declaraciones adicionales sobre esas declaraciones individuales, usando sus URIs para identificarlas. [8]
En un mapa de temas XML (XTM), solo un tema puede tener un nombre o desempeñar un papel en una asociación. Se puede utilizar una asociación para hacer una afirmación sobre un tema, pero no se pueden hacer afirmaciones directamente sobre esa afirmación. Sin embargo, es posible crear un tema que materialice una construcción que no sea un tema en un mapa, lo que permite que la asociación se nombre y se trate como un tema en sí misma. [9]
En los lenguajes de la Web semántica, como RDF y OWL, una propiedad es una relación binaria que se utiliza para vincular a dos individuos o a un individuo y un valor. Sin embargo, en algunos casos, la forma natural y conveniente de representar ciertos conceptos es utilizar relaciones para vincular a un individuo con más de un individuo o valor. Estas relaciones se denominan relaciones n-arias . Algunos 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 para la reificación es crear una nueva clase explícita y n nuevas propiedades para representar una relación n -aria, convirtiendo una instancia de la relación que vincula a los n individuos en 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. [10]
: p1 a : Persona ; : tiene_membresía _ : membresía_12345 . _ : membresía_12345 a : Membresía ; : comité : c1 ; : nominado_por : p2 .
También es importante señalar que la reificación descrita aquí no es lo mismo que la "cita" que se encuentra en otros lenguajes. En cambio, la reificación describe la relación entre una instancia particular de un triple y los recursos a los que se refiere el triple. La reificación se puede leer intuitivamente como "este triple RDF habla sobre 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 .
Al describir rdf:subject
la declaración original, se dice que el sujeto de la declaración es el recurso (la persona) identificado por la URIref person:p1
. No se dice que el sujeto de la declaración sea la URIref misma (es decir, una cadena que comienza con ciertos caracteres), como lo haría una cita.