Теория вычислений Д. Скотта

Напомним, что теория вычислений Д. Скотта была создана до появления большинства современных языков программирования, а именно в конце 60-х годов.

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

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

9.3.1. Последовательность изложения теории вычислений Д. Скотта

Для построения теории вычислений необходимо:

1) перечислить так называемые стандартные домены, (домены наиболее часто используемые в рамках данной формализации);

2) после перечисления стандартных доменов необходимо определить так называемые конечные домены (домены, элементы которых можно перечислить явным образом);

3) после перечисления доменов перейдем к определению конструкторов доменов, под которыми понимаются операции построения новых доменов на основе имеющихся. Иначе говоря, определим способы комбинирования доменов.

4) перечислив основные типы элементарных доменов, перейдем к их комбинированию посредством конструкторов.

Заметим, что, подобно ламбда-исчислению и комбинаторной логике, теория вычислений обладает весьма лаконичным набором способов комбинирования доменов.

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

 

9.3.2. Определения способов комбинирования доменов

Опр. 1. Под функциональным пространством из домена D1 в домен D2 будем понимать домен [D1->D2], содержащий всевозможные функции с областью определения из домена D1 и областью значений из домена D2 :

[D1 -> D2] = {f | f : D1 -> D2}.

Опр. 2. Под декартовым (или, иначе, прямым) произведением доменов

D1, D2, ... Dn будем понимать домен всевозможных n-ок вида

[D1 × D2 × ... × Dn]= {(d1 × d2 × ... × dn) | d1 Î D1, d2 Î D2, dn Î Dn ...,}.

Опр. 3. Под последовательностью D* будем понимать домен всевозможных конечных последовательностей вида d=(d1,d2,...,dn) из элементов d1,d2,...,dn,... домена D, где n>0.

Опр. 4. Под дизъюнктной суммой будем понимать домен с определением

[D1+D2+...+Dn]={ (di, i) | di Î Di, 0<i<n+1 },

где принадлежность элементов di компонентам Di однозначно устанавливается специальными функциями принадлежности.

 

9.4. Формализация семантики языка функционального программирования SML

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

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

1. Язык SMalL содержит множество выражений E, которые формализуются посредством БНФ в следующем виде:

E ::= true | false | 0 | 1 | I | -E |

E1==E2 | E1+E2

Заметим, что выражения включают логические (true и false) и целочисленные (в ограниченном объеме: 0 и 1) константы, множество идентификаторов (I), а также операции отрицания (-E), сравнения (E1==E2) и сложения (E1+E2).

2. Кроме того, язык SMalL содержит множество команд С, которые формализуются посредством БНФ в следующем виде:

С ::= I=E | if (E) C1 else C2 |

while(E) C | C1;C2

Отметим, что команды включают присваивание (I=E), условие

(if (E) C1 else C2), цикл с предусловием (while(E) C), а также последовательность команд (C1;C2).

Деление синтаксиса языка SMalL на выражения и команды во многом является условным и служит иллюстративным целям.

Как уже отмечалось, в качестве математической формализации, моделирующей семантику языков программирования (в частности, языка SMalL), будет использоваться теория вычислений Д. Скотта.

 

9.4.1. Порядок построения формальной модели семантики языка программирования SMalL согласно ранее представленному формальному описанию синтаксиса языка в терминах БНФ

1. Прежде всего, необходимо дать определение синтаксических доменов (т.е. доменов, характеризующих основные синтаксические категории) для идентификаторов (домен Ide), выражений (домен Exp) и команд (домен Com).

2. Следует представить определение вычислительной модели на основе синтаксических доменов.

3. Необходимо перейти к определению семантических функций (E для домена Exp, C для домена Com и т.д.), которые отображают синтаксические конструкции языка программирования в соответствующие им семантические представления.

4. Следует сформулировать определение семантических предложений в терминах смены состояний программы.

Заметим, что при выполнении программы (в частности, написанной на языке программирования SMalL) происходит изменение состояния памяти (m, memory), которое в простейшем случае характеризует соответствие идентификаторов и значений (то есть, по сути, связывание переменной со значением), либо имеет значение unbound (характеризующее отсутствие связи идентификатора со значением, т.е. аналог свободной переменной).

В соответствии с намеченной схемой рассуждений перейдем к описанию синтаксических доменов, которые в полной мере определяют синтаксис языка SMalL:

Ide = {I | I - идентификатор};

Com = {C | C - команда};

Exp = {E | E - выражение}.

Совокупность всех возможных идентификаторов языка SMalL организуем в домен Ide, команд - в домен Com, и, наконец, выражений - в домен Exp.

 

9.4.2. Вычислительная модель на основе состояний программы языка SMalL

Для наглядности она представлена в виде следующей таблицы 9.1:

Таблица 9.1. Вычислительная модель на основе состояний программы языка SMalL

Параметр Домен Соотношение
Состояние State (s) State=Memory
Память Memory (m) Memory = Ide -> [Value+{unbound}]
Значение Value (v) Value=Int+Bool

Заметим, что состояние программы в произвольный момент времени определяется состоянием "памяти" абстрактной машины той или иной формы. При этом под памятью понимается отображение из домена идентификаторов в домен значений (т.е. аналог связывания переменной со значением в ламбда-исчислении). Для корректной обработки исключительных ситуаций, возникающих в случае свободных переменных, вводится дополнительный элемент unbound. Домен значений представляет собой дизъюнктную сумму доменов, содержащих существующие в языке SMalL типы Int и Bool.

 

9.5. Описание семантических предложений