7.2 Общие переменные
Будем говорить, что актор Р «использует» переменную V
(или что переменная V «соответствует», «принадлежит» актору Р), если переменная
V входит в состав подцели доказательства Р или какой-либо другой подцели
доказательства Q, построенной в ходе:
• текущего доказательства подцели Р, если исполнение актора
ещё не закончено,
• последнего завершившегося успехом доказательства актора Р,
если исполнение актора закончено, и он не является нейтральным,
не считая тех подцелей доказательства Q, которые были
построены в ходе доказательства акторов, вложенных по отношению к Р.
«Общей» называется переменная, которая используется
(или может быть использована) несколькими акторами. Каждый актор хранит свои
собственные («локальные») значения общих переменных.
Актуальными значениями общих переменных некоторого процесса
называются значения, которые можно получить, унифицировав локальные значения всех
общих переменных, соответствующих активным акторам этого процесса.
Во время унификации термов (в ходе исполнения процесса G)
происходит замена тех (и только тех) вхождений переменных, которые соответствуют
активным акторам (процесса G). Таким образом, локальные значения общих переменных
любого активного актора процесса всегда равны актуальным значениям общих переменных
этого процесса.
Производными значениями общих переменных некоторого процесса
называются значения, которые можно получить (если они существуют), унифицировав
локальные значения общих переменных всех активных и доказанных акторов этого процесса.
В случае если общая переменная процесса (например, некоторый порт процесса) не
соответствует ни одному из активных или доказанных акторов, её производным значением
считается анонимная переменная «_».
Акторы процесса считаются согласованными между собой, если:
1. Все акторы, принадлежащие процессу, хотя бы один раз были доказаны.
2. Существуют производные значения общих переменных этого процесса.
«Фиксированными» значениями общих переменных называются
значения этих переменных, в составе которых все несвязанные переменные заменены
спейсером #. «Фиксированием» терма называется заменена спейсером всех несвязанных
переменных в составе терма. В соответствии с семантикой Акторного Пролога,
фиксирование не распространяется на переменные в составе миров, являющихся
компонентами фиксируемого терма.
Глобальными операциями (с общими переменными) называются
операции, в которых используются локальные значения, принадлежащие активным и
доказанным акторам некоторого процесса — сопоставление локальных значений общих
переменных, актуализация производных значений общих переменных, передача потоковых
сообщений из процесса.
В случае если некоторая общая переменная используется для
передачи потоковых сообщений между процессами, в соответствие этой переменной ставятся:
1. «Глобальное» значение — некоторый терм.
2. Сорт текущего глобального значения — вспомогательное логическое значение: «защищенное» или «незащищённое».
3. Производитель текущего глобального значения — процесс, построивший текущее глобальное значение.
Эти атрибуты являются едиными для всех процессов,
передающих и принимающих потоковые сообщения через рассматриваемую переменную.
Считается, что изначально глобальное значение общей
переменной равно пустому значению сорта «незащищённое», производителем которого
является некоторый (уникальный) процесс, не совпадающий ни с одним из процессов
программы.
7.2.1 Построение общих переменных
Общие переменные создаются автоматически в составе значений слотов во время формирования экземпляров классов.
При построении общих переменных выполняются следующие правила:
- Если в составе инициализатора аргумента конструктора
(явным образом) задан атрибут, то в качестве соответствующего ему значения
слота берётся начальное значение этого слота (созданное во время построения слота),
вместе с соответствующими ему общими переменными.
- Если в определении атрибутов класса в составе
некоторого инициализатора аргумента некоторого конструктора явным образом задана
некоторая переменная X, то в качестве значения X берётся соответствующая ей общая
переменная, созданная в ходе построения слотов экземпляра класса.
Примечание. Указанные правила построения общих переменных
выполняются даже в том случае, если значение рассматриваемого слота или переменной
ранее уже было конкретизировано в каких-либо акторах.
Содержание