рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Рекурсивные определения предикатов

Рекурсивные определения предикатов - раздел Программирование, Предикатное программирование Для Определяемых Предикатов B И C Отношение Depend(B, C) Обозначает Непоср...

Для определяемых предикатов B и C отношение depend(B, C) обозначает непосредственную зависимость B от C, если в правой части определения B имеется вызов предиката C. Предикат B определяется через предикат C, def(B, C), если существуют предикаты D1, …, Dn (n > 1) такие, что B = D1, C = Dn и depend(Dj, Dj+1) (j = 1, …, n - 1).

Определение предиката B рекурсивно, если истинно отношение def(B, 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(x, A: …) определяет также зависимость между предикатами H и C, так как предикат C вызывается в правой части определения H. Косвенная зависимость предикатов может оказаться источником рекурсии. В частности, при наличии генератора CONS(x, B: A) рекурсия для предиката B может быть обусловлена вызовом предиката A в правой части определения предиката B. В данной работе запрещаются сложные формы рекурсии, поскольку для построения реальных алгоритмов в них нет необходимости. Далее мы рассматриваем рекурсию на базе непосредственной зависимости предикатов.

График предиката B(x:y) есть Gr(B) = {(x, y) | LS(B(x:y))}. Как следствие, LS(B(x:y)) º (x, y) Î Gr(B). Представим графики оператора суперпозиции (4.16), параллельного оператора (4.19) и условного оператора (4.20), используя определения логической семантики операторов:

GrS(P, Q) = Gr(B(x: z); C(z: y)) = {(x, y) | $z. (x, z) Î P & (z, y) Î Q} ; (4.33)

GrP(P, Q) = Gr(B(x: y) || C(x: z)) = {(x, y, z) | (x, y) Î P & (x, z) Î Q} ; (4.34)

GrC(P, Q) = Gr(if (b) B(x: y) elseC(x: y)) = {(b, x, y) | b & (x, y) Î P} È (4.35)

{(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, (4.36)

где xi и yi - наборы переменных, Ki - оператор суперпозиции (4.16), параллельный оператор (4.19) или условный оператор (4.20). В операторах Ki могут встречаться вызовы предикатов A1, A2,…, An, а также вызовы других предикатов, не принадлежащих кольцу и определяемых вне кольца.

Обозначим графики предикатов A1, A2,…, An через G1, G2,…, Gn соответственно. По системе определений (4.36) строится система уравнений для графиков предикатов:

G = V(G) , (4.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 определяет множество значений вида (x1, y1, x2, y2, …, xn, yn) и является графиком, называемым вектор-графиком. График Gj есть j-я компонента (проекция) вектор-графика G, т. е. Gj = pr(j, G).

Отношение включения “Í”, определенное на множестве вектор-графиков, является полной решеткой [4; 5]. Минимальным элементом решетки является пустой график Æ. Для произвольных вектор-графиков H и L истинно утверждение

H Í L º "i=1..n. Hi Í Li . (4.38)

Отношение “Í” для каждой из компонент вектор-графика является полной решеткой.

Рассмотрим цепь векторов-графиков {Gm}m³0, определяемую следующим образом:

G0 = Æ, Gm+1 = V(Gm), m ³ 0 . (4.39)

Естественно ожидать, что предел последовательности {Gm}m³0 (если он существует) даст нам неподвижную точку - решение системы G = V(G). Построение неподвижной точки рассмотрим на примере следующей программы для вычисления факториала натурального числа n:

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) [16] ;

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); предикат A1 не входит в кольцо. Проследим несколько шагов построения неподвижной точки, где шаг соответствует переходу от Gm к Gm+1. Вначале G0 = Æ, т. е. каждый из шести графиков пуст. Подставляя эти значения графиков в правые части определений, получим значения графиков на первом шаге, остающиеся пустыми, кроме G31, которому присваивается первая альтернатива условного оператора. Анализируя предыдущие определения, получим значение графика G31:0, 1, true® 1. На втором шаге изменится только значение графика G2, на третьем - G0. В итоге получаем следующую цепочку модификаций, в которой на каждом шаге мы указываем лишь изменившиеся компоненты вектора G :

G31: 0, 1, true® 1;

G22: 0, 0, 1® 1;

G03: 0® 1;

G54: 1, 0® 1 - параметр n1 = 0 как результат подстановки G03;

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

Лемма 4.12. Пусть {Hm}m³0 - возрастающая цепь вектор-графиков. Тогда для наименьшей верхней грани цепи (см. разд. 3.1) справедливо равенство

Èm³0Hm = (Èm³0 H1m, …, Èm³0 Hnm) .

Лемма 4.13. Пусть {Hm}m³0 - возрастающая цепь вектор-графиков и H~ = Èm³0Hm. Пусть w Î H~, где w - набор вида (x1, y1, x2, y2, …, xn, yn). Тогда $k "m³k. w Î Hm.

Доказательство от противного. Допустим, что для всех k набор w не принадлежит вектор-графику Hk. Определим вектор-график H#, совпадающий с H~ всюду, за исключением набора w, который ему не принадлежит. Предикат H# является верхней гранью последовательности {Hm}m³0, причем H# Í H~ и H# ¹ H~, а тогда грань H~ не является минимальной, что приводит к противоречию. □

Замечание. Лемма верна и для возрастающей цепи обычных графиков {Hjm}m³0.

Лемма 4.14. Вектор-функция V, составленная из непрерывных функций Vi (i = 1, …, n), является непрерывной. Понятие непрерывности функций определено в разд. 3.1.

Доказательство. Пусть {Hm}m³0 - возрастающая цепь вектор-графиков. В соответствии с леммой 4.12 имеет место цепочка равенств:

Èm³0V(Hm) = Èm³0(V1(Hm), …, Vn(Hm)) = (Èm³0V1(Hm), …, Èm³0Vn(Hm)) = = (V1(Èm³0Hm), …, Vn(Èm³0Hm)) = V(Èm³0Hm). □

Лемма 4.15. Функции GrS, GrP и GrC (4.33-4.35), определяющие соответственно графики оператора суперпозиции, параллельного оператора и условного оператора, непрерывны относительно вхождений графиков P и Q.

Доказательство. Докажем непрерывность функции GrS(P, Q) для оператора суперпозиции. Пусть {Hm}m³0 - возрастающая цепь вектор-графиков. Здесь H вырождается в набор (P, Q). Необходимо доказать, что GrS(Èm³0(P, Q)m) = Èm³0 GrS((P, Q)m). Это эквивалентно GrS(Èm³0Pm, Èm³0Qm) = Èm³0 GrS(Pm, Qm) при условии, что {Pm}m³0 и {Qm}m³0 - возрастающие цепи графиков предикатов. Итак, требуется доказать:

{(x, y) | $z. (x, z) Î Èm³0Pm & (z, y) Î Èm³0Qm} = Èm³0{(x, y)|$z. (x, z) Î Pm & (z, y) Î Qm}.

Пусть (x, y) принадлежит множеству в левой части. Тогда для некоторого z0 истинны (x, z0) Î Èm³0Pm и (z0, y) Î Èm³0Qm. В соответствии с леммой 4.13 существует такое k, что (x, z0) Î Pk и (z0, y) Î Qk. Далее, очевидно, (x, y) принадлежит правой части равенства.

Нетрудно показать, что {(x, y)|$z. (x, z) Î Pm & (z, y) Î Qm}m³0 - возрастающая цепь графиков. Допустим, (x, y) принадлежит наименьшей верхней грани этой цепи, т. е. правой части равенства. Принадлежность (x, y) множеству в правой части доказывается применением леммы 4.13.

Доказательство непрерывности функций GrP и GrC проводится аналогично.□

График GrC(P, Q) условного оператора if (b) B(x: y) elseC(x: y) не является непрерывным относительно вхождения переменной b [17]. Поэтому вхождение b не может быть источником рекурсии. Ограничение: допустим, значение переменной b является результатом вызова E(…: b…). Предикат, правой частью которого является условный оператор, и предикат E не могут входить в одно и то же рекурсивное кольцо.

Допустим, система (4.36) определений кольца предикатов не использует сложные формы рекурсии и удовлетворяет отмеченному ограничению. Из лемм 4.14 и 4.15 следует, что вектор-график операторов V в системе уравнений G = V(G) для графиков кольца предикатов является непрерывным. В соответствии с теоремой Клини о неподвижной точке (см. разд. 3.1 и [4, 7]) решение системы G = V(G) есть G = lfp(V) = Èm³0Gm, где G0 = Æ, Gm+1 = V(Gm), m ³ 0 (т. е. цепь (40)), lfp(V) - наименьшая неподвижная точка (least fixed point) вектор-графика операторов V.

Пусть рекурсивный предикат D(z:u) принадлежит кольцу (4.36), т. е. D = Aj для некоторого j. Логическая семантика предиката D определяется следующим образом:

LS(D(z:u)) @ (z,u) Î pr(j, Èm³0Gm) . (4.40)

Систему (4.36) определений кольца предикатов запишем в векторном виде: A º K(A), где A = (A1, A2,…, An); K = (K1, K2,…, Kn). Определим цепь векторов предикатов {Am}m³0 :

A0 º Ф, Am+1 º K(Am), m ³ 0, (4.41)

где Ф @ (F, F, …, F) - вектор тотально ложных предикатов. Цепь {Am}m³0 соответствует цепи (4.39) вектор-графиков {Gm}m³0, поскольку Gm = (Gr(Am1), Gr(Am2),…, Gr(Amn)).

Рассмотрим подробнее структуру рекурсивного кольца предикатов. Пусть предикат D принадлежит кольцу и имеет определение, в правой части которого вызываются предикаты B и C. Тогда один из предикатов (или оба) принадлежат кольцу. В противном случае предикат D не будет принадлежать кольцу. В соответствии с определением последовательности {Am}m³0 и цепи (4.39) D0 = F. Далее, D1 = F, если D имеет определение в виде оператора суперпозиции или параллельного оператора, поскольку конъюнкция двух вызовов предикатов, из которых один ложный, дает ложный предикат. Если D имеет определение в виде условного оператора, а вызываемые предикаты B и C оба принадлежат кольцу, то также имеем D1 = F. Если во всех условных операторах, используемых в определениях предикатов кольца, оба вызываемых предиката принадлежат кольцу, то решением системы (4.36) является набор тождественно ложных предикатов. Поэтому в дальнейшем будем считать, что в системе (4.36) имеется по крайней мере один предикат с определением в виде условного оператора, причем в правой части один вызываемый предикат принадлежит кольцу, а другой - нет.

Рекурсивное кольцо предикатов (4.36) представим в виде

A º K(A1, A2,…, An, E1, E2,…, Es) . (4.42)

Здесь E1, E2,…, Es, s > 0, - предикаты, используемые в правых частях определений (4.36), но не принадлежащих данному кольцу.

Лемма 4.16. Предположим, что предикаты E1, E2,…, Es, используемые в системе (4.42), обладают свойством согласованности. Тогда рекурсивные предикаты A1, A2,…, An кольца (4.42) обладают свойством согласованности.

Доказательство. Пусть D(u:v) - рекурсивный предикат кольца, т. е. D = Aj для некоторого j. Докажем истинность Cons(D). Зафиксируем значения наборов u и v.

Допустим, D(u:v) истинно, и докажем, что исполнение вызова D(u:v) на выбранных значениях набора u завершается вычислением значений набора v. В соответствии с (4.40) (u,v) Î pr(j, G). Существует w Î G такой, что (u,v) = pr(j, w). По лемме 4.13 существует k такой, что w Î Gk. Доказательство реализуется индукцией по k. Рассмотрим случай k = 1, т. е. w Î G1. Единственная возможность: правая часть определения D имеет вид условного оператора if (b) B(u:v) elseC(u:v), причем значение b выбирает предикат B или C, не принадлежащий кольцу; в противном случае D(u:v) будет ложным. Поскольку выбранный предикат (B или C) обладает свойством согласованности, то его исполнение (а значит, и исполнение D) завершается вычислением набора u, что завершает доказательство для k = 1. При доказательстве для произвольного k > 1 будем использовать индукционное предположение: если предикат кольца P(t: q) истинен для наборов t и q, и (t, q) является соответствующим поднабором некоторого w1 Î Gm при m < k, то исполнение предиката P на наборе t завершается набором q. Рассмотрим случай, когда правая часть определения D имеет вид оператора суперпозиции B(u:z); C(z:v). Истинность D(u:v) определяет истинность $z. B(u:z) & C(z:v). Допустим, предикат B принадлежит кольцу и B = Ai. Тогда для некоторого z0 истинно (u,z0) Î pr(i, Gk-1), иначе в соответствии с определением (4.33) для GrS получим: (u,v) Ï pr(j, Gk), что приводит к противоречию. В соответствии с индукционным предположением, исполнение B(u:z0) завершается получением набора z0. Нетрудно доказать истинность C(z0,v). Далее, если предикат C принадлежит кольцу, то аналогичным образом, набор (z0,v) должен входить в Gk-1 для предиката C и, по индуктивному предположению, исполнение вызова C(z0,v) завершается вычислением набора v. Как следствие, исполнение D(u:v) завершается набором v, что доказывает первую часть истинности Cons(D). Если предикат B или C не принадлежит кольцу, т. е. находится среди E1, E2,…, Es, то используется свойство согласованности этих предикатов. Доказательство для случаев, когда предикат D определяется в виде параллельного или условного оператора, является более простым.

Допустим, что для фиксированных значений u исполнение вызова D(u:v) завершается выбранными значениями набора v. Докажем истинность D(u:v). Совокупность исполняемых вызовов предикатов имеет форму дерева вызовов. Вершина дерева - вызов предиката с конкретными значениями аргументов и результатов вызова. Начальной вершиной является вызов D(u:v). Листья дерева - вызовы предикатов E1, E2,…, Es. Два вызова связаны дугой, если второй вызов исполняется в теле определения предиката для первого вызова. Доказательство проводится индукцией по высоте k дерева. Пусть высота k = 1. Это возможно лишь в случае, когда правая часть определения D имеет вид условного оператора if (b) B(u:v) elseC(u:v), а предикат (B или C), соответствующий исполняемому вызову, является одним из E1, E2,…, Es. Из согласованности этих предикатов следует истинность исполняемого вызова, а значит, и истинность D(u:v).

Будем использовать следующее индукционное предположение: если вызов P(t: q) является вершиной дерева вызовов, высота m поддерева, определяемого вызовом P(t: q), меньше k, и исполнение вызова на наборе t завершается вычислением набора q, то P(t: q) истинно. Рассмотрим случай, когда правая часть определения D имеет вид оператора суперпозиции B(u:z); C(z:v). Допустим, что исполнение вызова B(u:z) (при исполнении D(u:v)) завершилось вычислением набора z1. Если B является одним из E1, E2,…, Es, то вызов B(u:z1) является истинным. Допустим, B принадлежит кольцу. Вызов B(u:z1) определяет поддерево в дереве вызовов с высотой m = k - 1. В соответствии с индукционным предположением, вызов B(u:z1) является истинным. Аналогично доказывается истинность вызова C(z1:v). Как следствие, истинна формула $z. B(u:z) & C(z:v), что определяет истинность D(u:v). Доказательство для случаев, когда предикат D определяется в виде параллельного или условного оператора, проводится аналогично. □

Теорема 4.1. Допустим, что при наличии в программе вызова вида ConsArray(x, B: A) предикат B определяет однозначную всюду определенную функцию. Допустим, что для всякого другого базисного предиката j языка CCP реализуется свойство согласованности Cons(j). Пусть имеется программа на языке CCP, и ее исполнение реализуется вызовом предиката D(u:v). Тогда истинно Cons(D).

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

Рассмотрим случай, когда программа не содержит рекурсивно определяемых предикатов. Пусть предикат D имеет определение в виде оператора суперпозиции (4.16), параллельного оператора (4.19) или условного оператора (4.20). В соответствии с леммами 4.3, 4.4 и 4.5 достаточно установить свойство согласованности для предикатов B и C, вызываемых в правой части определения. Если эти предикаты базисные, то для них это свойство является условием теоремы. Если один из них определяемый, то его полное замкнутое определение представляется частью программы меньшего размера, что позволяет применить доказательство по индукции.

Допустим, программа на языке CCP содержит несколько рекурсивных колец предикатов. Пусть кольцо a определяется системой (4.42). Кольцо a зависит от кольца b, если один из предикатов E1, E2,…, Es принадлежит другому кольцу b. Рекурсивные кольца образуют граф. Вершинами являются кольца, а дугами - отношения зависимости колец. Допустим, что имеется цикл в графе колец. Нетрудно доказать, что предикаты разных колец, находящихся на цикле, должны принадлежать одному кольцу. Следовательно, граф не имеет циклов и является деревом.

Докажем свойство согласованности для предикатов произвольного рекурсивного кольца a, определяемого системой (4.42). Рассмотрим различные пути от a до листьев дерева колец. Пусть k - максимальная длина пути по этому набору путей. Доказательство проводится индукцией k. При k = 0 предикаты E1, E2,…, Es не являются рекурсивно определяемыми и, следовательно, обладают свойством согласованности. По лемме 4.16 предикаты кольца обладают свойством согласованности. Предположим, что свойство согласованности доказано для колец с длиной пути m = k - 1, и докажем его для кольца a. Рассмотрим предикат Ej (j = 1, …, s). Пусть Ej принадлежит рекурсивному кольцу b. Из кольца a имеется дуга в кольцо b. Поэтому максимальная длина пути для b по крайней мере на единицу меньше, чем k. По индуктивному предположению предикаты кольца b обладают свойством согласованности. Таким образом, предикаты E1, E2,…, Es обладают свойством согласованности. Свойство согласованности предикатов кольца a следует из леммы 4.16.

Рассмотрим общий случай, когда программа П может содержать переменные предикатного типа. Обозначим через SUBS(П) набор предикатов, являющийся объединением множеств заместителей для всех переменных предикатного типа в программе П. Для набора предикатов M из П обозначим через П[M] минимальную программу, являющуюся частью П и содержащую определения предикатов набора M. Пусть П0 = П, Пj+1 = Пj[SUBS(Пj)], j = 0, 1, 2, …. Докажем, что при некотором k программа Пk ¹ Æ, а Пk+1 = Æ. Допустим обратное, т. е. существует такое k, что Пk ¹ Æ и Пk+1 = Пk. Пусть Пk построено на базе заместителей B1, B2,…, Bn; n > 0. Тогда Пk содержит вызовы генераторов CONS(x, B1:A1), …, CONS(x, Bn:An). Допустим, CONS(x, B1:A1) встречается в программе Пk[{B1}]. В этой программе должен встречаться вызов C(…), где C - переменная предикатного типа и значение C получено от A1 через параметры вызовов; если это не так, то генератор становится ненужным и может быть исключен из программы. Поскольку вызов C(…) доступен при исполнении тела предиката B1, то получаем рекурсивный вызов B1 через вызов C(…)- это сложная форма рекурсии, которая запрещена. Поэтому CONS(x, B1:A1) не может встречаться в программе Пk[{B1}]. Пусть он встречается в Пk[{B2}]. Тогда из тела предиката B2 через некоторый косвенный вызов C(…) вызывается предикат B1. Если CONS(x, B2:A2) встречается в Пk[{B1}], то получим сложную форму рекурсии. Поэтому генератор CONS(x, B2:A2) может быть доступен только из третьего предиката, например, B3. Продолжая анализ для предикатов B3 и далее, получим цепочку предикатов, которая неизбежно замкнется, что приведет к сложной форме рекурсии. Получили противоречие.

Итак, Пk ¹ Æ и Пk+1 = Æ. Программа Пk не содержит переменных предикатного типа. Для этого случая теорема доказана. Тогда предикаты B1, B2,…, Bn, входящие в SUBS(Пk-1), обладают свойством согласованности. В соответствии с леммой 4.11 любой вызов вида C(…) в программе Пk-1, где C - переменная предикатного типа, обладает свойством согласованности. Доказательство теоремы, представленное выше, может быть повторено для программы Пk-1, поскольку согласно принятым ограничениям вызов вида C(…) не может участвовать в рекурсии. Доказательство теоремы для произвольной программы Пi, i = k - 1, …, 0, проводится по индукции. □

– Конец работы –

Эта тема принадлежит разделу:

Предикатное программирование

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ... Факультет информационных технологий...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Рекурсивные определения предикатов

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Новосибирск
  УДК 004.432.42 ББК 22.183.492 Ш 427   Шелехов В. И. Предикатное программирование: Учеб. пособие / Новосиб. гос. ун-т. Новосибирск, 2009

Язык исчисления вычислимых предикатов,
его логическая и операционная семантика .......................................................... 27 4.1. Структура программы на языке CCP ...............................

Семантика языка предикатного программирования.
Методы доказательства корректности предикатных программ ...................... 47 5.1. Язык P1: подстановка определения предиката на место вызова .........................

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

Автоматическая вычислимость
Развитие средств вычислений сопровождается все большей степенью автоматизации вычислений. Потребность в проведении сложных и длительных расчетов привела человека к необходимости создания и совершен

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

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

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

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

Логическая семантика языка программирования
Всякая программа содержит логику. Это, например, бизнес-логика, извлекаемая нетривиальным анализом из текста программы в процессе реинжиниринга программы [16]. Это также логические формулы, получае

Модель корректности программы
Рассмотрим программу с предикатной спецификацией на языке, для которого можно построить логическую семантику. Программа со спецификацией представляется в виде тройки Хоара: {P(x)} S {Q(x,

Система правил вывода программы из спецификации
Понятие корректности программы, введенное в разд. 2.3, состоит из трех условий (2.7–2.9). Главным из них является условие (2.7) соответствия программы и спецификации, согласно которому постусл

Однозначность предикатов
Предикат H(x, y) является однозначным в области X для набора переменных x, если он определяет функцию, отображающую значения набора x в значения набора y. Должно быть истинным следующее усло

Теорема тождества спецификации и программы
Теорема определяет условия, при которых программа может быть выведена из спецификации. Теорема 2.1 тождества спецификации и программы. Рассмотрим программу со специфи

Отношения порядка
R называется бинарным отношением на множестве D, если R Í D ´ D. Утверждение (a, b) Î R принято записывать в виде a R b. Для произвольного отношения R используются следующ

Наименьшая неподвижная точка
Далее будем считать, что (D, ⊑, ⊥) – полная решетка с наименьшим элементом, т. е. "a Î D. ⊥⊑ a. Пусть F: D→D - произвольная тотальная (т. е. всюду

Математическая индукция
Математическая индукция – это метод доказательства некоторого утверждения P(n) для всех значений натурального параметра n; n = 0, 1, 2, … . Доказательство проводится по следующей схеме.

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

Структура программы на языке CCP
Язык CCP (Calculus of Computable Predicates) - язык исчисления вычислимых предикатов, определяющий множество вычислимых формул исчисления предикатов. К языку предъявляются два требования: по

Система типов данных
Любая переменная характеризуется некоторым типом. Язык CCP является бестиповым в том смысле, что типы переменных не указываются в программе, однако их можно однозначно определить по программе. Сист

Логическая и операционная семантика языка CCP
Логическая семантика есть функция LS, сопоставляющая каждой конструкции S языка CCP некоторую формулу LS в исчислении предикатов, т. е. LS(S) = LS. Пусть j(d:

Семантика вызова предиката
Пусть имеется вызов предиката A(z:u) . (4.12) Здесь A есть имя предиката или имя переменной предикатного типа; z - возможно пустой набор имен переменных; u - непу

Конструктор предиката
Конструктор предиката является базисным предикатом ConsPred(x, B: A), где x - возможно пустой набор переменных; B - имя предиката; A - имя переменной предикатного типа. Значением п

Конструктор массива
Конструктор массива является базисным предикатом ConsArray(x, B: A), где x - возможно пустой набор переменных, B - имя предиката, отличное от ConsPred и ConsArray. Значением переме

Программа
Программа на языке CCP состоит из конечного набора определений предикатов. Для каждого определения правой частью является оператор суперпозиции (4.16), параллельный оператор (4.19) или услов

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

Методы доказательства корректности рекурсивных программ
Рассмотрим следующую конкретизацию системы (4.36) определений рекурсивного кольца предикатов A1, A2,…, An: Aj(t, xj:

Лексемы
Текст программы представлен в виде последовательности строк символов. Переход на новую строку эквивалентен символу «пробел». Программа может содержать комментарии, текст которых считается не принад

Определение предиката
ОПРЕДЕЛЕНИЕ-ПРЕДИКАТА ::= ИМЯ-ПРЕДИКАТА ОПИСАНИЕ-ПРЕДИКАТА ИМЯ-ПРЕДИКАТА ::= ИДЕНТИФИКАТОР Значением ОПИСАНИЯ-ПРЕДИКАТА является предикат, обозначаемый именем предиката.

Спецификация предиката
Предикат, используемый в программе, должен иметь определение предиката. Если предикат определяется в другом модуле программы, то предикат может быть представлен своей спецификацией. СПЕЦИФ

Вызов предиката
Элементарным оператором программы является вызов предиката. ВЫЗОВ-ПРЕДИКАТА ::= ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ | ВЫЗОВ-ПРЕДИКАТА-ГИПЕРФУНКЦИИ ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ ::=

Программа
Программа состоит из одного или нескольких модулей. Модуль определяет независимую часть программы. ОПИСАНИЕ-МОДУЛЯ ::= [ЗАГОЛОВОК-МОДУЛЯ] СПИСОК-ОПИСАНИЙ ЗАГОЛОВОК-МОДУЛЯ ::=

Выражения
ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ ::= КОНСТАНТА | ПЕРЕМЕННАЯ | АГРЕГАТ | ИМЯ-ПРЕДИКАТА | ГЕНЕРАТОР-ПРЕДИКАТА | ВЫЗОВ-ФУНКЦИИ | ( ВЫРАЖЕНИЕ ) | ИМЯ-ТИПА |

Описание типа массива
ИЗОБРАЖЕНИЕ-ТИПА-МАССИВА ::= array ( ИЗОБРАЖЕНИЕ-ТИПА-ЭЛЕМЕНТА , ИЗМЕРЕНИЯ-МАССИВА ) ИЗОБРАЖЕНИЕ-ТИПА-ЭЛЕМЕНТА ::= ИЗОБРАЖЕНИЕ-Т

Вырезка массива
ВЫРЕЗКА-МАССИВА ::= ВЫРАЖЕНИЕ-МАССИВ [ СУЖЕННЫЙ-НАБОР-ТИПОВ-ИНДЕКСОВ ] ВЫРАЖЕНИЕ-МАССИВ ::= ВЫРАЖЕНИЕ СУЖЕННЫЙ-НАБОР-ТИПОВ-ИНДЕКСОВ ::=

Определение массива
ОПРЕДЕЛЕНИЕ-МАССИВА ::= ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА | АГРЕГАТ-МАССИВ | ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ ::=

Объединение массивов
Операндами операции «+» объединения массивов: ВЫРАЖЕНИЕ-МАССИВ + ВЫРАЖЕНИЕ-МАССИВ являются выражения, значениями которых являются массивы. Объединяемые массивы до

Формулы
Формулы, используемые в качестве предусловий и постусловий предикатов, есть формулы типизированного исчисления предикатов высших порядков. Подформула, входящая в предусловие или постусловие, может

Процессы
Для большинства программ можно построить спецификацию в виде предусловия и постусловия. Однако не всякую программу можно специфицировать таким образом. Имеется класс программ реального времени, в ч

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

Технология предикатного программирования
Типичный способ реализации языка программирования заключается в реализации транслятора с языка программирования на язык команд целевой ЭВМ или на некоторый другой реализованный язык программировани

Подстановка определения предиката на место вызова
Пусть A(x: y) { S } - определение предиката на императивном расширении языка P, а A(e: z) - вызов предиката в теле некоторого другого предиката B. Здесь x, y, z обозначают списки переменных, а e -

Замена хвостовой рекурсии циклом
Подстановка определения нерекурсивного предиката на место вызова является эффективной при наличии в программе одного вызова. Подстановка определения рекурсивного предиката усложняет программу и поэ

Склеивание переменных
Трансформация склеивания переменных есть замена в определении предиката нескольких переменных одной. Трансформация определяет список имен переменных. Переменные из указанного списка переменн

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

Трансформация кодирования структурных объектов
Трансформация кодирования структурных объектов реализует представление используемых в программе структурных типов (списков, деревьев и др.) посредством структур более низкого уровня, таких к

Гиперфункции
Пример 7.2. Допустим, для списка s целых чисел требуется извлечь второй элемент и присвоить переменной e. Список может содержать менее двух элементов. Логическая переменная exist =

Else break
} } }; Подставим определения предикатов взятьЧисло и перваяЦифра на место вызовов. Проведем очевидные упрощения. Сумма(string s, nat

Else break
} }; Далее, поскольку внутренний цикл в теле предиката Сумма не имеет нормального выхода, можно заменить оператор #2 на break и убрать скобки оператора продолжени

Else break
} n = n + v } } На четвертом этапе применяется трансформация кодирования строки s вырезкой массива. При этом разные значения списка s представляются вырезками од

Else break
} n = n + v } Можно обнаружить следующий недостаток программы (7.39): если строка s завершается цифрой, то проверка исчерпания строки реализуется

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги