- •10.10.11 Лекция 4
- •Логическая семантика:
- •3. Теория невзаимодействующих программ.
- •Программа на языке CCP
- •Исполнение программы: исполнение вызова A(z: u)
- •Рекурсивные определения предикатов
- •Рекурсивное кольцо предикатов A1, A2,…, An:
- •Отношение “ ” на множестве вектор-графиков, является полной решеткой. Минимальный элемент пустой график.
- •Лемма 3.12. Пусть {Hm}m 0 возрастающая цепь вектор- графиков. Тогда : m 0Hm
- •Лемма 3.15. Функции GrS, GrP и GrC (3.33-3.35) графиков оператора суперпозиции, параллельного оператора
- •График GrC(P, Q) условного оператора
- •Структура рекурсивного кольца предикатов
- •Рекурсивное кольцо предикатов представим в виде:
- •Допустим, что для фиксированных значений u исполнение вызова D(u: v) завершается значениями набора
- •Теорема 3.1. При наличии в программе вызова вида ConsArray(x, B: A) предикат B
- •Допустим, программа на языке CCP содержит несколько рекурсивных
- •Рассмотрим общий случай, когда программа П может содержать переменные предикатного типа. Обозначим через
- •Однозначность предикатов
- •Лемма 3.19. Вызов C(…), где C переменная предикатного типа, является однозначным, если для
- •Имеется рекурсивных дерево колец (теорема 3.1). Для колец, являющихся листьями, однозначность следует из
- •4. Система правил доказательства корректности операторов
- •[P(x), Q(x, y)] спецификация программы S(x: y), P(x) предусловие, Q(x, y) постусловие.
- •Теорема 2.1 тождества спецификации и программы
- •Логика базисных операторов
- •Система правил декомпозиции доказательства корректности программы.
- •Условный оператор
- •Условный оператор (прод.)
10.10.11 Лекция 4
Предикатное программирование
Теория невзаимодействующих программ.
Язык исчисления вычислимых предикатов (прод2.)
Программа на языке CCP
Предикаты в качестве параметров предикатов Правила построения заместителей
Рекурсивные определения предикатов Пример программы
Лемма согласованности предикатов рекурсивного кольца Теорема о согласованности предикатов программы Однозначность предикатов Однозначность предикатов рекурсивного кольца
Теорема об однозначности предикатов
4. Система правил доказательства корректности программы
Правила для общего случая
Правила для вхождений операторов под квантором существования и в левой части
Логическая семантика:
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) если любой его вызов обладает свойством согласованности
3. Теория невзаимодействующих программ.
Язык исчисления вычислимых предикатов (прод2)
Программа на языке CCP
Определение предиката. В правой части ― оператор суперпозиции, параллельный оператор или условный оператор. Первичные конструкции ― вызовы предикатов. Имя предиката:
•имя базисного предиката;
•имя предиката, имеющего определение в программе;
•аргумент предиката имя переменной предикатного типа; в правой части определения предиката встречается данный вызов;
•имя переменной предикатного типа, являющейся результатом вызова ConsPred или ConsArray, находящегося в правой части того же определения, что и данный вызов.
Программа ― замкнутый набор определений предикатов ― вызываемые предикаты либо
базисные, либо имеют определение в программе.
Исполнение программы: исполнение вызова A(z: u)
s = newSect(z, u); |
(3.32) |
input(s[z]); runCall(s, A(z: u)); output(s[u])
Предикаты в качестве параметров предикатов
Генератор CONS(x, B: A) CONS есть ConsPred или ConsArray
Лемма 3.11. Имеется вызов A(z: u), где A переменная предикатного типа.
Тогда: ( B subs(A). cons(B)) cons(A). Доказательство следует из лемм 3.7, 3.8. □
Рекурсивные определения предикатов
depend(B, C) ― непосредственная зависимость B от C в
правой части определения B имеется вызов предиката C.
def(B, C) ― B определяется через предикат C существуют предикаты D1, D2, …, Dn (n > 0) такие, что B = D1, C = Dn и depend(Dj, Dj+1) (j = 1, …, n-1).
Определение предиката B рекурсивно def(B, B) rec(B) = {C | def(B, C) & def(C, B)} ― рекурсивное кольцо Лемма C rec(B) rec(B) = rec(C).
B косвенно зависит от C в правой части определения B имеется вызов предиката H(x, A: …) и C subs(A); H также зависит от C
ConsPred(x, B: A). Сложная форма рекурсии для предиката B: A вызывается в правой части определения B
! Сложные формы рекурсии запрещены
График предиката B(x: y) есть Gr(B) = {(x, y) | L(B(x: y))}. Как следствие, L(B(x: y)) (x, y) Gr(B). Представим графики оператора суперпозиции (3.16), параллельного оператора (3.19) и условного оператора (3.20), используя определения логической семантики операторов:
GrS(P, Q) = Gr(B(x: z); C(z: y)) = {(x, y) | z. (x, z) P & (z, y) Q}
(3.33)
GrP(P, Q) = Gr(B(x: y)||C(x: z)) = {(x, y, z) | (x, y) P & (x, z) Q}
(3.34)
GrC(P, Q) = Gr(if (b) B(x: y) else C(x: y)) = |
(3.35) |
{(b, x, y) | b & (x, y) P} {(b, x, y) | b & (x, y) Q}
Здесь графики P = Gr(B) и Q = Gr(C).
Рекурсивное кольцо предикатов A1, A2,…, An: |
|
Ai(xi: yi) Ki(xi: yi); i = 1…n; n > 0, |
(3.36) |
где xi и yi наборы переменных, Ki оператор суперпозиции, параллельный оператор или условный оператор. В операторах Ki могут встречаться вызовы предикатов A1, A2, …, An, а также вызовы других предикатов, не принадлежащих кольцу и определяемых вне кольца.
G1, G2,…, Gn графики предикатов A1, A2,…, An. По системе (3.36) строится система уравнений для графиков предикатов:
G = V(G) , |
(3.37) |
где G = (G1, G2,…, Gn) вектор графиков предикатов, V = (Gr(K1), Gr(K2),…, Gr(Kn)) вектор графиков
операторов. Здесь Gr(Kj)(xj: yj) (j = 1,…, n) рассматривается как Gr(Kj)(G1, G2,…, Gn); Gr(Kj) есть GrS, GrP или GrC.
G вектор-график. Gj = pr(j, G).
Отношение “ ” на множестве вектор-графиков, является полной решеткой. Минимальный элемент пустой график. Для произвольных вектор-графиков H и L истинно утверждение:
H L i=1..n. Hi Li (3.38)
Отношение “ ” для каждой из компонент вектор-графика является полной решеткой.
Рассмотрим цепь векторов-графиков {Gm}m 0: |
|
|
G0 = , Gm+1 = V(Gm), m 0 |
(3.39) |
|
Factorial(n: f) if (n = 0) f = 1 else f = n Factorial(n - 1) |
||
A0(n: f) |
A1( : c0, c1); A2(n, c0, c1: f) |
|
A1( : c0, c1) |
ConsIntZero( : c0) || ConsIntOne( : c1) |
|
A2(n, c0, c1: f) |
=(n, c0: b); A3(n, c1, b: f) |
|
A3(n, c1, b: f) |
if (b) =(c1: f) else A4(n, c1: f) |
|
A4(n, c1: f) |
-(n, c1: n1); A5(n, n1: f) |
|
A5(n, n1: f) |
A0(n1: f1); (n, f1: f) |
|
G = (G0, G2, G3, G4, G5 ).
A0(n: f) |
A1( : c0, c1); A2(n, c0, c1: f) |
|
A1( : c0, c1) |
ConsIntZero( : c0) || ConsIntOne( : c1) |
|
A2(n, c0, c1: f) |
=(n, c0: b); A3(n, c1, b: f) |
|
A3(n, c1, b: f) |
if (b) =(c1: f) else A4(n, c1: f) |
|
A4(n, c1: f) |
-(n, c1: n1); A5(n, n1: f) |
|
A5(n, n1: f) |
A0(n1: f1); (n, f1: f) |
|
G0 = , Gm+1 |
= V(Gm), m 0 |
(3.39) |
G31: 0, 1, true 1 |
|
|
G22: 0, 0, 1 1 |
|
|
G03: 0 1 |
|
|
G54: 1, 0 |
|
1 n1 = 0 как результат подстановки G04; |
G45: 1, 1 |
|
1 |
G36: 0, 1, true 1; G36: 1, 1, false 1; |
||
G27: 0, 0, 1 |
1; G27: 1, 0, 1 1; |
|
G08: 0 1; |
G08: 1 1; и т.д. |