5.4 Построение пространства поиска



Построение пространства поиска осуществляется в результате доказательства конструкторов экземпляров классов и реализуется посредством построения новых экземпляров классов.

Последовательность действий, создающих пространство поиска и слоты отдельного экземпляра класса, называется «формированием» экземпляра класса.

Построение экземпляра класса (создание нового экземпляра класса) включает следующие этапы:

1.Формирование экземпляра класса.
2.Доказательство предикатов goal() во всех сформированных на первом этапе мирах.

Этапы формирования экземпляра класса и доказательства предикатов goal не зависят друг от друга и относятся к разным этапам построения процесса. Выполнение этих операций осуществляется в соответствии со следующими правилами:

1.При построении экземпляров классов используются копии определений классов, отличающиеся от соответствующих определений классов тем, что все переменные в составе определений атрибутов этих классов заменяются новыми уникальными именами.
2.Каждая автоматически исполняемая подцель goal объявляется актором.
3.Исполнение предикатов goal осуществляется в произвольном порядке. При этом, однако, при равных прочих условиях, предикат goal в мире В всегда доказывается раньше, чем в мире А, если мир В является вложенным по отношению к миру А.







5.4.1Исполнение конструкторов



Доказательство (исполнение) простого конструктора приводит к формированию нового экземпляра заданного класса С и включает следующие действия:

1.Построение пространства поиска экземпляра класса С. В состав пространства поиска включаются предложения самого класса С, затем (в соответствии с иерархией наследования) предложения его непосредственного предка D, предложения непосредственного предка класса D и так далее, пока не будет достигнут класс, не имеющий предка в иерархии наследования.

2.Построение слотов экземпляра класса.

Доказательство (исполнение) конструктора процесса приводит к построению нового процесса. В результате доказательства конструктора процесса, новый процесс устанавливается в состояние «объявленный». Исполнение конструктора процесса не приводит к построению пространства поиска созданного процесса. Построение соответствующего пространства поиска и слотов процесса осуществляется позже, в ходе «формирования» процесса.

Формирование процесса вызывается процессом, который является его создателем . Формирование процесса включает следующие действия:

1.Доказывается простой конструктор, заданный в составе конструктора процесса.

2.Определяются порты процесса, в соответствии с описателями портов, заданными в аргументах конструктора процесса и определениях соответствующих классов.

3.Проверяются текущие значения портов процесса и, в соответствии с правилами переключения состояний процесса «используемый» и «неиспользуемый» ,процесс переводится в состояние «используемый сформированный» или в состояние «неиспользуемый».

4.Процессу автоматически посылается инициализирующее потоковое сообщение.

В случае если формирование процесса заканчивается аварийной ситуацией, вызывается встроенный обработчик ошибок.

Доказательство (исполнение) конструктора резидента приводит к построению нового резидента. Доказательство конструктора резидента включает следующие действия:

1.Переменная, созданная в качестве начального значения слота процесса-владельца, инициализатором которого является конструктор резидента, объявляется защищающим портом резидента.

2.Все остальные общие переменные, заданные в составе конструктора резидента, объявляются простыми портами резидента.

3.Новый резидент начинает функционировать.




5.4.2Построение слотов



Одновременно с созданием каждого слота, если для него задан соответствующий инициализатор, создаётся его «начальное» значение:

• Значение терма, если инициализатором слота является терм или конструктор резидента.

• Некоторый мир, если инициализатором является конструктор мира.

• Значение другого слота, если инициализатором является атрибут.

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

Построение значения слота, инициализатором которого является конструктор, вызывает доказательство этого конструктора.

Если инициализатором слота является конструктор резидента, создаётся специальная переменная, общая для резидента и его владельца. Эта переменная становится начальным значением слота процесса-владельца, инициализатором которого является названный конструктор резидента.

Если инициализатором слота является конструктор резидента, в составе которого задан некоторый конструктор мира, указанный конструктор мира также доказывается.

Слоты, не имеющие инициализаторов, а также слоты, (взаимно-) рекурсивно заданные в качестве своих собственных инициализаторов, получают в качестве начальных значений уникальные общие переменные.

Все переменные, создаваемые в составе значений слотов, также являются общими.

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

Описатели портов, заданные в составе конструктора, а также в определении соответствующих классов, перекрывают друг друга аналогично тому, как осуществляется перекрытие инициализаторов слотов. Перекрытие описателей портов происходит независимо от перекрытия инициализаторов слотов.

Пример.
Перекрытие инициализаторов слотов и описателей портов.
Рассмотрим определение некоторых классов С, 'D' и 'Е':

class 'E':
suspending: a = 21; protecting: b = 25;
[
goal.
]
class 'D' specializing 'E':
protecting: a = 7;
[]
class 'C specializing 'D':
b = 8;
[]

В результате доказательства простого конструктора ('С, а=Х) будет построен некоторый мир, значения слотов которого а=Х, b=8. Переменная X будет объявлена защищающим портом.



Содержание