Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures / lecture4.ppt
Скачиваний:
7
Добавлен:
06.06.2015
Размер:
370.69 Кб
Скачать

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; и т.д.

Соседние файлы в папке lectures