- •03.10.11 Лекция 3
- •Структура множества программ.
- •2. Класс объектно-ориентированных программ.
- •3. Класс простых процессов.
- •4.Математические основы
- •Отношения порядка
- •a S ― наименьший (наибольший) элемент S Ds S. a s ( s
- •Наименьшая неподвижная точка
- •m 0am lub {am}m 0 ― наименьшая верхняя грань цепи
- •3. Теория невзаимодействующих программ.
- •Исчисление вычислимых предикатов ― множество вычислимых формул языка исчисления предикатов
- •Система типов данных
- •Множество подмножеств конечного типа X:
- •Произвольный тип либо примитивный, либо вводится следующим определением:
- •Рекурсивные типы данных
- •Запрещается рекурсия
- •Логическая и операционная семантика
- •Структура программы на языке CCP
- •Логическая семантика вызова и определения предиката :
- •Вызов предиката
- •Пусть истинно A(z: u). Тогда в соответствии с определением A(x: y) K(x: y)
- •Оператор суперпозиции
- •Допустим, исполнение H(x: y) завершается вычислением y. Докажем истинность H(x: y). Исполнение пары
- •Параллельный оператор
- •Условный оператор
- •Допустим, исполнение H(b, x: y) завершается вычислением y, т.е. исполнение оператора (3.22) завершается
- •Конструктор предиката
- •Лемма 3.7. Пусть имеется вызов ConsPred(x, B: A), причем Cons(B) истинно. Тогда истинно
- •Конструктор массива
- •Доказательство. Пусть истинно Cons(B). Зафиксируем x. В соответствии с (3.30) после исполнение оператора
Логическая семантика вызова и определения предиката :
L(φ(d: e)) φ(d, e) , где φ ─ имя предиката
L(A(x: y) K(x: y)) A(x, y) L(K(x: y))
Операционная семантика: метапрограмма
Метаязык. Память – набор секций. Секция памяти – набор переменных и их значений: аргументы, результаты, локалы.
s[a] – значение переменной с именем a в секции s s[x] – набор значений для набора имен x в секции s
s[a] := v – оператор присваивания значения v переменной a в секции s s[x] := w – групповое присваивание набора значений w набору
переменных x в секции s
s = newSect(A) – создание в памяти новой секции s для определения
предиката с именем A
runCall(s, φ(d: e)) – исполнение вызова φ(d: e)
runStat(s, K(x: y)) – исполнение оператора K(x: y) правой части |
|
Значение переменной предикатного типа – |
(имя |
предиката, набор значений части аргументов) |
|
Например, (A, z~), для A(z, t: y) K(z, t: y), где t не пусто. |
|
s[C] = (A, z~) предикат A является заместителем переменной C предикатного типа.
subs(C) множество заместителей переменной C. A subs(C)
H(x: y) есть вызов предиката или оператор.
RUN(H, x, y) любое исполнение H(x: y) для значений набора x завершается со значениями набора y.
Свойство согласованности Cons(H)
x y L(H(x: y)) RUN(H, x, y) |
(4.11) |
Предикат A обладает свойством согласованности Cons(A) если любой его вызов обладает свойством согласованности
Вызов предиката
Вызов |
A(z: u) |
(3.12) |
|
A(x: y) K(x: y) |
(3.13) |
q текущая секция
Процедура runCall(q, A(z: u)) абстрактного процессора:
|
s = newSect(A); |
(3.14) |
|
s[x] := q[z]; |
|
|
runStat(s, K(x: y)); |
|
|
q[u] := s[y]; |
|
Свойства: |
x = z & u = y |
(3.15) |
Лемма 3.2. Пусть имеется определение (3.13) для предиката
A. Тогда Cons(K) Cons(A).
Доказательство проводится для вызова A(z: u). Пусть истинно Cons(K). Докажем истинность Cons(A).
Зафиксируем значения наборов z и u. Пусть истинно A(z: u).
Пусть истинно A(z: u). Тогда в соответствии с определением A(x: y) K(x: y) истинна формула K(z: u). Из этого следует, что все исполнения K(z: u) для набора z завершаются получением набора u. Рассмотрим исполнение A(z: u) по программе (3.14). В соответствии с (3.15) справедливы равенства x = z и u = y. Поэтому все исполнения K(x: y) завершаются получением y. Тогда исполнение последовательности (3.14), а значит и исполнение A(z: u), завершается получением значений набора u, что доказывает первую часть свойства Cons(A).
Пусть исполнение A(z: u) для набора z завершается получением набора u. Тогда завершается исполнение тела (3.14), в частности, исполнение K(x: y) завершается получением y. Поскольку в соответствии с (3.15) реализуется x = z и u = y, то исполнение K(z: u) завешается вычислением набора u. Из Cons(K) следует, что K(z: u)
истинно. Тогда из определения A(x: y) K(x: y) следует истинность A(z: u), что доказывает вторую часть свойства Cons(A). □
Оператор суперпозиции
A(x: y) B(x: z); C(z: y) |
|
(3.16) |
L(B(x: z); C(z: y)) z. (B(x, z) & C(z, y)) |
(3.17) |
|
Процедура runStat(s, K(x: y)) абстрактного процессора: |
|
|
runCall(s, B(x: z)); |
|
(3.18) |
runCall(s, C(z: y)) |
|
|
z набор локальных переменных |
секции s |
|
Лемма 3.3 Cons(B) & Cons(C) Cons(H), где H обозначает B(x: z); C(z: y).
Доказательство. Пусть истинно Cons(B) и Cons(C). Докажем истинность Cons(H). Зафиксируем значения x и y. Пусть истинна H(x: y), т.е. истинна правая часть (3.17). Для некоторого z будут истинны B(x: z) и C(z: y). Из Cons(B) и Cons(C) следует, что исполнение B(x: z) завершается получением набора z, а исполнение C(z: y) вычислением набора y. Поэтому исполнение операторов (3.18), а значит и H(x: y), завершается вычислением y. Это доказывает первую часть истинности Cons(H).
Допустим, исполнение H(x: y) завершается вычислением y. Докажем истинность H(x: y). Исполнение пары операторов (3.18) завершается вычислением y. В частности, завершается первый оператор runCall(s, B(x: z)). Тогда существует некоторый набор z, являющийся результатом исполнения. Таким образом, для некоторого z исполняются вызовы B(x: z) и C(z: y). Из Cons(B) и Cons(C) следует истинность B(x: z) и C(z: y). Следовательно, истинна правая часть (3.18) и H(x: y). □
Параллельный оператор
A(x: y, z) B(x: y) || C(x: z) |
(3.19) |
x, y и z произвольные непересекающиеся наборы переменных, причем x может быть пустым.
Если B или C есть имя переменной предикатного типа, то это имя входит в набор x.
Логическая семантика параллельного оператора:
L(B(x: y) || C(x: z)) B(x, y) & C(x, z)
Процедура runStat(s, K(x: y)) абстрактного процессора: runCall(s, B(x: y)) ||
runCall(s, C(x: z))
Лемма 3.4. Cons(B) & Cons(C) Cons(H), где H обозначает B(x: y) || C(x: z).
Условный оператор
A(b, x: y) if (b) B(x: y) else C(x: y) |
(3.20) |
L(if (b) B(x: y) else C(x: y)) (b B(x, y)) ( b C(x, y)) (3.21)
Процедура runStat(s, K(x: y)) абстрактного процессора:
if (s[b]) runCall(s, B(x: y)) else runCall(s, C(x: y)) |
(3.22) |
Лемма 3.5. Cons(B) & Cons(C) Cons(H), где H(b, x: y) обозначает if (b) B(x: y) else C(x: y).
Доказательство. Пусть истинно Cons(B) и Cons(C). Докажем истинность Cons(H). Зафиксируем значения b, x и y. Пусть истинна H(b, x: y). Тогда в соответствии с (3.21) истинны формулы b B(x, y) и b C(x, y). Рассмотрим случай, когда значение b истинно. Тогда истинна формула B(x, y). Из Cons(B) следует, что исполнение вызова B(x: y) завершается получением набора y. Поэтому исполнение оператора (3.22), а значит и H(b, x: y), завершается вычислением y. Это доказывает первую часть свойства Cons(H) для истинного значения b. Доказательство в случае ложного значения b проводится аналогично.
Допустим, исполнение H(b, x: y) завершается вычислением y, т.е. исполнение оператора (3.22) завершается вычислением y. Докажем истинность H(b, x: y). Пусть b истинно. Тогда исполнение вызова B(x: y) завершается получением набора y. Из Cons(B) следует истинность B(x: y). Тогда истинны формулы b B(x, y) и b C(x, y), поскольку b истинно. Следовательно, истинна правая часть (3.21) и H(b, x: y). Доказательство истинности H(b, x: y) в случае ложного значения b проводится аналогично. □
Конструктор предиката
Базисный предикат ConsPred(x, B: A), x набор переменных, B имя предиката, A имя переменной предикатного типа. B не ConsPred и не ConsArray
L(ConsPred(x, B: A)) |
y z. (L(A(y: z)) L(B(x, y: z))) |
(3.23) |
Процедура runCall(s, ConsPred(x, B: A)) абстрактного |
|
|
процессора: |
|
|
s[A] := pVal(B, s[x]) |
(3.24) |
|
pVal(B, x~) = (C, (t~, x~)) |
(3.25) |
|
где s[B] = (C, t~) для переменной B; |
|
|
C=B и t~ = для имени предиката B |
|
|
Пусть q[A]=(D, p). |
Операционная семантика A(y: z) : |
|
runCall(q, A(y: z)) runCall(q, D(p, y: z)). |
|
|
Лемма 3.6. Cons(B) Cons(ConsPred). |
|
|
Доказательство. |
|
|
L(A(y: z)) L(B(x, y: z)) L(C(t~, x, y: z)) |
|
RUN(C(t~, x, y: z)) RUN(B( x, y: z)) RUN(A(y: z))