Реификация (информатика)

Реификация в информатике — это процесс, посредством которого абстрактная идея о программе преобразуется в явную модель данных или иной объект, созданный в языке программирования. В системе создаётся вычислимый/адресуемый объект — ресурс — в качестве прокси для невычислимого/неадресуемого объекта. Благодаря реификации нечто ранее неявное, невыраженное и, возможно, невыразимое становится явно сформулированным и доступным для концептуальных (логических или вычислительных) манипуляций. Неофициально реификацию часто называют «превращением чего-либо в объект первого класса» в рамках конкретной системы. Некоторые аспекты системы могут быть реифицированы на этапе проектирования языка. Может применяться как пошаговая детализация на этапе проектирования системы. Реификация является одной из наиболее часто используемых техник концептуального анализа и представления знаний.

Рефлексивные языки программирования

В контексте языков программирования реификация — это процесс, посредством которого пользовательская программа или любой аспект языка программирования, ранее неявный в скомпилированной программе и системе выполнения, выражается в самом языке. Этот процесс делает его доступным для программы, которая может рассматривать все эти аспекты как обычные данные. Данные реификации причинно связаны с соответствующим реифицированным аспектом, так что изменение одного из них влияет на другой. Поэтому данные реификации всегда являются точным представлением соответствующего реифицированного аспекта. Данные реификации становятся объектом первого класса. Реификация реализована во многих языках: в ранних диалектах Lisp и современных диалектах Prolog программы рассматривались как данные, хотя причинная связь часто оставалась на усмотрение программиста. В Smalltalk-80 компилятор из исходного текста в байткод был частью системы выполнения с самых первых реализаций языка[1].

  • Язык программирования C реифицирует низкоуровневую деталь адресов памяти. Во многих языках программирования детали выделения памяти инкапсулируются компилятором и системой выполнения. В языке C адрес памяти реифицируется и доступен для прямой манипуляции другими конструкциями языка. Например, следующий код может использоваться при реализации драйвера устройства с отображением памяти. Указатель на буфер выступает прокси для адреса памяти 0xB8000000.
 char* buffer = (char*) 0xB8000000;
 buffer[0] = 10;

Реификация данных и уточнение данных

Реификация данных (пошаговая детализация) включает поиск более конкретного представления абстрактных типов данных, используемых в формальной спецификации.

Термин «реификация данных» используется в Венском методе разработки (VDM), тогда как большинство других специалистов называют это уточнением данных. Примером может служить шаг к реализации, при котором представление данных, не имеющее аналога в целевом языке реализации (например, множества), заменяется на то, что имеет аналог (например, отображения с фиксированными доменами, реализуемые массивами), или хотя бы на более близкое к нему (например, последовательности). Сообщество VDM предпочитает термин «реификация», а не «уточнение», поскольку процесс больше связан с конкретизацией идеи, чем с её уточнением[4].

В концептуальном моделировании

Реификация широко используется в концептуальном моделировании[5]. Реифицировать отношение — значит рассматривать его как сущность. Цель реификации отношения — сделать его явным, когда требуется добавить к нему дополнительную информацию. Рассмотрим тип отношения IsMemberOf(member:Person, Committee). Экземпляр IsMemberOf — это отношение, отражающее факт, что человек является членом комитета. На рисунке ниже показана примерная популяция отношения IsMemberOf в табличной форме. Персона P1 состоит в комитетах C1 и C2. Персона P2 состоит только в комитете C1.

undefined

Рассматривая отношение как сущность, можно сказать, что сущность реифицирует отношение, что называется реификацией отношения. Как и любая другая сущность, она должна быть экземпляром некоторого типа сущности. В данном примере тип сущности назван Membership. Для каждого экземпляра IsMemberOf существует ровно один экземпляр Membership, и наоборот. Теперь становится возможным добавить к исходному отношению дополнительную информацию. Например, можно выразить факт, что «персона p1 была номинирована в члены комитета c1 персоной p2». Реифицированное отношение Membership может быть использовано как источник нового отношения IsNominatedBy(Membership, Person).

В языке UML

undefined

UML предоставляет конструкцию класс-ассоциация для определения реифицированных типов отношений. Класс-ассоциация — это единый элемент модели, который одновременно является и ассоциацией[6], и классом[7].

Ассоциация и тип сущности, который её реифицирует, — это один и тот же элемент модели. Атрибуты не могут быть реифицированы.

В семантической паутине

RDF и OWL

В языках семантической паутины, таких как RDF и OWL, утверждение — это бинарное отношение. Оно используется для связывания двух индивидов или индивида и значения. Иногда приложениям требуется описывать другие RDF-утверждения, например, чтобы зафиксировать информацию о том, когда были сделаны утверждения или кто их сделал, что иногда называют информацией о происхождении (provenance). Например, может потребоваться выразить свойства отношения, такие как степень уверенности, важность или сила связи, релевантность и т. д.

Пример из раздела концептуального моделирования описывает конкретного человека с URIref person:p1, который является членом committee:c1. RDF-тройка для этого описания:

  person:p1   committee:isMemberOf   committee:c1 .

Рассмотрим необходимость сохранить ещё два факта: (i) зафиксировать, кто номинировал человека в \комитет (утверждение о самом членстве), и (ii) зафиксировать, кто добавил факт в базу данных (утверждение об утверждении).

Первый случай — это классическая реификация, как выше в UML: реифицировать членство и хранить его атрибуты и роли и т. д.:

 committee:Membership        rdf:type              owl:Class .
 committee:membership12345   rdf:type              committee:Membership .
 committee:membership12345   committee:ofPerson    person:p1 .
 committee:membership12345   committee:inCommittee committee:c1 .
 person:p2                   committee:nominated   committee:membership12345 .

Кроме того, в RDF предусмотрен встроенный словарь для описания RDF-утверждений. Описание утверждения с помощью этого словаря называется реификацией утверждения. RDF-словарь реификации состоит из типа rdf:Statement и свойств rdf:subject, rdf:predicate и rdf:object[8].

Используя словарь реификации, реификацию утверждения о членстве можно задать, присвоив утверждению URIref, например committee:membership12345, чтобы описательные утверждения выглядели так:

 committee:membership12345Stat   rdf:type        rdf:Statement .
 committee:membership12345Stat   rdf:subject     person:p1 .
 committee:membership12345Stat   rdf:predicate   committee:isMemberOf . 
 committee:membership12345Stat   rdf:object      committee:c1 .

Эти утверждения говорят о том, что ресурс, идентифицируемый URIref committee:membership12345Stat, является RDF-утверждением, что субъект утверждения ссылается на ресурс person:p1, предикат — на ресурс committee:isMemberOf, а объект — на ресурс committee:c1. Если исходное утверждение действительно идентифицируется как committee:membership12345, то, сравнив исходное утверждение с реификацией, можно увидеть, что реификация действительно его описывает. Обычное использование RDF-словаря реификации всегда включает описание утверждения с помощью четырёх утверждений по этому шаблону. Поэтому их иногда называют «реификационным кортежем» (reification quad)[8].

Используя реификацию по этой схеме, можно зафиксировать факт, что person:p3 добавил утверждение в базу данных:

  person:p3    committee:addedToDatabase    committee:membership12345Stat .

Важно отметить, что при обычном использовании реификации субъект реификационных троек считается идентификатором конкретного экземпляра тройки в конкретном RDF-документе, а не произвольной тройки с теми же субъектом, предикатом и объектом. Эта конвенция используется потому, что реификация предназначена для выражения свойств, таких как дата создания и источник информации, и эти свойства должны относиться к конкретным экземплярам троек. Сама описываемая тройка (subject predicate object) не подразумевается такой реификацией (и не обязательно должна реально существовать в базе данных). Это позволяет использовать данный механизм и для выражения того, какие тройки не существуют.

Возможности словаря реификации в RDF ограничены отсутствием встроенного механизма присваивания URI отдельным утверждениям, поэтому для выражения информации о происхождении такого рода в RDF необходимо использовать внешний механизм для присвоения URI отдельным RDF-утверждениям, а затем делать дополнительные утверждения об этих утверждениях, используя их URI для идентификации[8].

В Topic Maps

В (XTM) только тема может иметь имя или играть роль в ассоциации. Можно использовать ассоциацию для утверждения о теме, но нельзя напрямую делать утверждения об этом утверждении. Однако возможно создать тему, которая реифицирует не-тематическую конструкцию в карте, что позволяет ассоциации быть именованной и рассматриваться как тема сама по себе[9].

n-арные отношения

В языках семантической паутины, таких как RDF и OWL, свойство — это бинарное отношение, связывающее двух индивидов или индивида и значение. Однако в некоторых случаях естественным и удобным способом представления определённых концепций является использование отношений, связывающих индивида с более чем одним индивидом или значением. Такие отношения называются n-арными отношениями. Примеры — представление отношений между несколькими индивидами, например, комитетом, человеком — членом комитета и другим человеком, который номинировал первого в члены комитета, или покупателем, продавцом и объектом покупки при описании покупки книги.

Более общий подход к реификации — создание явного нового класса и n новых свойств для представления n-арного отношения, делая экземпляр отношения, связывающий n индивидов, экземпляром этого класса. Этот подход также может использоваться для представления информации о происхождении и других свойств для отдельного экземпляра отношения[10].

 :p1
      a       :Person ;
      :has_membership _:membership_12345 .
 _:membership_12345
      a       :Membership ;
      :committee :c1;
      :nominated_by :p2 .

В отличие от цитирования

Также важно отметить, что описанная здесь реификация не совпадает с «цитированием», встречающимся в других языках. Вместо этого реификация описывает отношение между конкретным экземпляром тройки и ресурсами, на которые она ссылается. Реификацию можно интуитивно прочитать как «эта RDF-тройка говорит об этих вещах», а не (как при цитировании) «эта RDF-тройка имеет такую форму». В приведённом выше примере реификации тройка:

  committee:membership12345   rdf:subject   person:p1 .

описывая rdf:subject исходного утверждения, говорит, что субъект утверждения — это ресурс (человек), идентифицируемый URIref person:p1. Она не утверждает, что субъект утверждения — это сам URIref (то есть строка, начинающаяся с определённых символов), как было бы при цитировании.

См. также

Примечания

  1. J. Malenfant, M. Jacques and F.-N. Demers, A Tutorial on Behavioral Reflection and its Implementation Архивировано 28 мая 2010 года.
  2. The Java Language Specification, section 4.7, Java SE 7 Edition
  3. Smalltalk Blocks And Closures. C2.com (15 октября 2009). Дата обращения: 9 октября 2010.
  4. Formal Methods Europe, Frequently Asked Questions, part 13 Архивировано 12 марта 2005 года..
  5. Antoni Olivé, Conceptual Modeling of Information Systems, Springer Verlag, 2007.
  6. Associations // Unified Modeling Language 2.5.1. — Object Management Group Standards Development Organization (OMG SDO), December 2017. — P. 199.
  7. Classes // Unified Modeling Language 2.5.1. — Object Management Group Standards Development Organization (OMG SDO), December 2017. — P. 194.
  8. 1 2 3 RDF Primer. W3.org. Дата обращения: 9 октября 2010.
  9. Practical Introduction into Topic Maps Архивировано 3 февраля 2009 года..
  10. W3C Defining N-ary relations on Semantic Web. W3.org. Дата обращения: 9 октября 2010.