Обзор методов
доказательств

1. Операторные схемы
Оператор – это часть алгоритма, всегда
выполняющая одни и те же вычисления над значениями
некоторых из переменных – аргументов оператора.
Пример 1. Отыскание минимума m функции f для
целых значений аргумента от 1 до n.
Рассмотрим алгоритм решения поставленной задачи.
1. Выполнить начальные присваивания: m = f(1), i = 2.
2. Если i > n, то перейти к шагу 7.
3. Выполнить присваивание u = f(i).
4. Если u ≥ m, то перейти к шагу 6.
5. Выполнить присваивание m = u.
6. Выполнить присваивание i = i + 1 и перейти к шагу 2.
7. Вывести на экран m.
Обозначим каждый из приведенных операторов (1 – 7) S1,
S2, S3, S4, S5, S6, S7.
n

i

S1

m

i

S2

S3

m

i

u

m

u

i

S4

S6

u

i

S5

S7

m
Операторная схема алгоритма отыскания минимума целочисленной функции
При представлении операторной схемы
опираются на теоретико-множественное
описание, согласно которому она задается
пятеркой <U, V, A, R, T>, где
• U = {S1, …, Sm} – множество операторов Sj,
• V = {x1, …, xn} – множество переменных xi,
• A ⊆ V × U – отношение «быть аргументом» (xi A
Sj),
• R ⊆ U × V – отношение «быть результатом» (Sj R
xi),
• T ⊆ U × U – отношение между операторомпредшественником и оператором-преемником (Sj
T Sk), т.е. множество возможных переходов.
Входом операторной схемы назовем
оператор Sin со свойствами:1) Sin не имеет
аргументов,2) Sin не имеет
предшественников.
Выход операторной схемы – это
оператор Sout со свойствами:1) Sin не имеет
результатов,
2) Sin не имеет преемников.
Схема объединяет в себе
ориентированные графы всех трех
отношений A, R, T. Граф <U ∪ V, A ∪ R> –
двудольный. Тип (U или V) начала и конца
каждой дуги определяет, какому из
отношений соответствует эта дуга. Граф <
U, T > будем называть графом переходов.
Граф переходов должен удовлетворять
следующему условию связности: любая вершина
(оператор) должна быть достижима из входа.
В теории операторных схем
рассматриваются следующие основные
проблемы:
- оценка трудоемкости алгоритма;
- методы исследования свойств алгоритма
(например, завершаемость и связь между
аргументами и результатами схемы в целом);
- экономия памяти (преобразования схемы,
связанные с переобозначением переменных);
- эквивалентность операторных схем при
преобразованиях, меняющих порядок
исполнения операторов.
Свойство алгоритма (программы) – это
некоторое утверждение о состоянии его
переменных, т.е. о совокупности значений
переменных из множества V. Утверждение
о состоянии – это предикат, определенный
на множестве состояний W, т.е.
отображение множества W в множество
BV = {true, false} логических значений.
Состояния будем обозначать буквами w,
…, предикаты – буквами p, q, …
(возможно, со штрихами и индексами).
Таким образом, если w – это состояние (w
∈ W), то p(w) – логическое значение (p(w)
∈ BV).
Операторы преобразуют некоторым
способом состояния. Состояние, в котором
исполняется оператор, определяет дугу графа
T, по которой происходит переход к
следующему исполняемому оператору. Таким
образом, о состояниях и их свойствах, т.е. о
предикатах, которым удовлетворяют
состояния, целесообразно говорить не во
время исполнения операторов, а в
промежутках между исполнением операторапредшественника и оператора-преемника.
Поэтому предикаты естественно сопоставлять
дугам графа переходов – размечать их этими
предикатами. Пусть дуге ai сопоставлен
предикат pi. Совокупность всех предикатов pi
назовем предикатной разметкой дуг схемы.
Потребуем, чтобы из единственного
входа Sin операторной схемы исходила
лишь одна дуга ain к некоторому
другому оператору, с исполнения
которого и начинается
преобразование состояний (например,
оператор Sin может быть оператором
ввода исходных данных,
определяющим тем самым начальное
состояние). Этой дуге сопоставляется
предикат pin, называемый начальным
предикатом.
Состояния, вырабатываемые
оператором Sin, которые
удовлетворяют начальному
предикату pin будем называть
допустимыми начальными
состояниями. Аналогично,
потребуем, чтобы в выход Sout
операторной схемы заходила
единственная дуга, которой
сопоставляется заключительный
предикат pout.
Пара предикатов (pin, pout) называется
спецификацией алгоритма (программы), а
доказательство того, что его исполнение,
начавшееся в допустимом начальном
состоянии, завершается в состоянии,
удовлетворяющем предикату pout, –
доказательством правильности алгоритма
(по отношению к данной спецификации).
Обозначим через p(S) дизъюнкцию
предикатов, сопоставленных всем дугам,
заходящим в оператор S.
Если некоторый оператор Sj
начинает исполняться в состоянии w,
удовлетворяющем дизъюнкции p(Sj), в
результате его исполнения
вырабатывается состояние w1 и
происходит переход по дуге ai,
исходящей из Sj, причем состояние w1
удовлетворяет предикату pi,
сопоставленному дуге ai, то будем
говорить, что данное исполнение
оператора S корректно (по
отношению к данной разметке).
Теорема 1. Пусть про каждый оператор Sj
операторной схемы (кроме ее входа и выхода)
известно, что каждое его исполнение корректно по
отношению к выбранной разметке. Пусть a0 = aiт, a1,
… - последовательность (конечная или
бесконечная) дуг, соответствующая некоторому
исполнению алгоритма, представленного схемой,
причем состояние w0 после исполнения оператора
Sin допустимо, т.е. удовлетворяет предикату pin,
сопоставленному дуге ain. Тогда состояние,
соответствующее любой дуге ai этой
последовательности, удовлетворяет предикату pi,
сопоставленному этой дуге. В частности, если эта
последовательность конечна и завершается дугой
an = aout, заходящей в оператор Sout, то состояние
в момент перехода по этой дуге удовлетворяет
Предикаты, сопоставляемые дугам,
зацикливающим схему (в приведенном выше примере
это дуга, соединяющая операторы S6 и S2), принято
называть инвариантами циклов. В правильном
подборе инвариантов циклов состоит суть
доказательства свойств алгоритмов (и программ).
Теорема 2. Пусть для операторной схемы задана
предикатная разметка дуг и найдена функция
состояния F с целочисленными значениями, такая,
что: 1) для каждого оператора S и для каждого
состояния w, удовлетворяющего предикату p(S),
верно, что F(w1) < F(w), где w1 – состояние,
вырабатываемое оператором S в состоянии w; 2) для
каждой дуги ai верно, что pi ⊃ F(w) ≥ 0, где w – текущее
состояние при прохождении дуги ai; 3) соблюдаются
условия теоремы 1. Тогда алгоритм, начинающий
работу из допустимого состояния w0, завершается за
конечное число шагов.
Теорема 3. Пусть для операторной схемы
задана предикатная разметка дуг и найдена
функция состояния F с целочисленными
значениями, такая, что: 1) для каждого
оператора S и для каждого состояния w,
удовлетворяющего предикату p(S), верно, что
F(w1) ≤ F(w), где w1 – состояние,
вырабатываемое оператором S в состоянии w;
2) для каждого простого контура графа
переходов схемы можно указать такой
оператор S, через который проходит этот
контур, что F(w1) < F(w); 3) для каждой дуги ai
верно, что pi ⊃ F(w) ≥ 0, где w – состояние, в
котором проходится эта дуга; 4) соблюдаются
условия теоремы 1. Тогда алгоритм,
начинающий работу в допустимом состоянии
w0, завершается за конечное число шагов.

лекция 2

  • 1.
  • 2.
    Оператор – эточасть алгоритма, всегда выполняющая одни и те же вычисления над значениями некоторых из переменных – аргументов оператора. Пример 1. Отыскание минимума m функции f для целых значений аргумента от 1 до n. Рассмотрим алгоритм решения поставленной задачи. 1. Выполнить начальные присваивания: m = f(1), i = 2. 2. Если i > n, то перейти к шагу 7. 3. Выполнить присваивание u = f(i). 4. Если u ≥ m, то перейти к шагу 6. 5. Выполнить присваивание m = u. 6. Выполнить присваивание i = i + 1 и перейти к шагу 2. 7. Вывести на экран m. Обозначим каждый из приведенных операторов (1 – 7) S1, S2, S3, S4, S5, S6, S7.
  • 3.
    n i S1 m i S2 S3 m i u m u i S4 S6 u i S5 S7 m Операторная схема алгоритмаотыскания минимума целочисленной функции
  • 4.
    При представлении операторнойсхемы опираются на теоретико-множественное описание, согласно которому она задается пятеркой <U, V, A, R, T>, где • U = {S1, …, Sm} – множество операторов Sj, • V = {x1, …, xn} – множество переменных xi, • A ⊆ V × U – отношение «быть аргументом» (xi A Sj), • R ⊆ U × V – отношение «быть результатом» (Sj R xi), • T ⊆ U × U – отношение между операторомпредшественником и оператором-преемником (Sj T Sk), т.е. множество возможных переходов.
  • 5.
    Входом операторной схемыназовем оператор Sin со свойствами:1) Sin не имеет аргументов,2) Sin не имеет предшественников. Выход операторной схемы – это оператор Sout со свойствами:1) Sin не имеет результатов, 2) Sin не имеет преемников. Схема объединяет в себе ориентированные графы всех трех отношений A, R, T. Граф <U ∪ V, A ∪ R> – двудольный. Тип (U или V) начала и конца каждой дуги определяет, какому из отношений соответствует эта дуга. Граф < U, T > будем называть графом переходов.
  • 6.
    Граф переходов долженудовлетворять следующему условию связности: любая вершина (оператор) должна быть достижима из входа. В теории операторных схем рассматриваются следующие основные проблемы: - оценка трудоемкости алгоритма; - методы исследования свойств алгоритма (например, завершаемость и связь между аргументами и результатами схемы в целом); - экономия памяти (преобразования схемы, связанные с переобозначением переменных); - эквивалентность операторных схем при преобразованиях, меняющих порядок исполнения операторов.
  • 7.
    Свойство алгоритма (программы)– это некоторое утверждение о состоянии его переменных, т.е. о совокупности значений переменных из множества V. Утверждение о состоянии – это предикат, определенный на множестве состояний W, т.е. отображение множества W в множество BV = {true, false} логических значений. Состояния будем обозначать буквами w, …, предикаты – буквами p, q, … (возможно, со штрихами и индексами). Таким образом, если w – это состояние (w ∈ W), то p(w) – логическое значение (p(w) ∈ BV).
  • 8.
    Операторы преобразуют некоторым способомсостояния. Состояние, в котором исполняется оператор, определяет дугу графа T, по которой происходит переход к следующему исполняемому оператору. Таким образом, о состояниях и их свойствах, т.е. о предикатах, которым удовлетворяют состояния, целесообразно говорить не во время исполнения операторов, а в промежутках между исполнением операторапредшественника и оператора-преемника. Поэтому предикаты естественно сопоставлять дугам графа переходов – размечать их этими предикатами. Пусть дуге ai сопоставлен предикат pi. Совокупность всех предикатов pi назовем предикатной разметкой дуг схемы.
  • 9.
    Потребуем, чтобы изединственного входа Sin операторной схемы исходила лишь одна дуга ain к некоторому другому оператору, с исполнения которого и начинается преобразование состояний (например, оператор Sin может быть оператором ввода исходных данных, определяющим тем самым начальное состояние). Этой дуге сопоставляется предикат pin, называемый начальным предикатом.
  • 10.
    Состояния, вырабатываемые оператором Sin,которые удовлетворяют начальному предикату pin будем называть допустимыми начальными состояниями. Аналогично, потребуем, чтобы в выход Sout операторной схемы заходила единственная дуга, которой сопоставляется заключительный предикат pout.
  • 11.
    Пара предикатов (pin,pout) называется спецификацией алгоритма (программы), а доказательство того, что его исполнение, начавшееся в допустимом начальном состоянии, завершается в состоянии, удовлетворяющем предикату pout, – доказательством правильности алгоритма (по отношению к данной спецификации). Обозначим через p(S) дизъюнкцию предикатов, сопоставленных всем дугам, заходящим в оператор S.
  • 12.
    Если некоторый операторSj начинает исполняться в состоянии w, удовлетворяющем дизъюнкции p(Sj), в результате его исполнения вырабатывается состояние w1 и происходит переход по дуге ai, исходящей из Sj, причем состояние w1 удовлетворяет предикату pi, сопоставленному дуге ai, то будем говорить, что данное исполнение оператора S корректно (по отношению к данной разметке).
  • 13.
    Теорема 1. Пустьпро каждый оператор Sj операторной схемы (кроме ее входа и выхода) известно, что каждое его исполнение корректно по отношению к выбранной разметке. Пусть a0 = aiт, a1, … - последовательность (конечная или бесконечная) дуг, соответствующая некоторому исполнению алгоритма, представленного схемой, причем состояние w0 после исполнения оператора Sin допустимо, т.е. удовлетворяет предикату pin, сопоставленному дуге ain. Тогда состояние, соответствующее любой дуге ai этой последовательности, удовлетворяет предикату pi, сопоставленному этой дуге. В частности, если эта последовательность конечна и завершается дугой an = aout, заходящей в оператор Sout, то состояние в момент перехода по этой дуге удовлетворяет
  • 14.
    Предикаты, сопоставляемые дугам, зацикливающимсхему (в приведенном выше примере это дуга, соединяющая операторы S6 и S2), принято называть инвариантами циклов. В правильном подборе инвариантов циклов состоит суть доказательства свойств алгоритмов (и программ). Теорема 2. Пусть для операторной схемы задана предикатная разметка дуг и найдена функция состояния F с целочисленными значениями, такая, что: 1) для каждого оператора S и для каждого состояния w, удовлетворяющего предикату p(S), верно, что F(w1) < F(w), где w1 – состояние, вырабатываемое оператором S в состоянии w; 2) для каждой дуги ai верно, что pi ⊃ F(w) ≥ 0, где w – текущее состояние при прохождении дуги ai; 3) соблюдаются условия теоремы 1. Тогда алгоритм, начинающий работу из допустимого состояния w0, завершается за конечное число шагов.
  • 15.
    Теорема 3. Пустьдля операторной схемы задана предикатная разметка дуг и найдена функция состояния F с целочисленными значениями, такая, что: 1) для каждого оператора S и для каждого состояния w, удовлетворяющего предикату p(S), верно, что F(w1) ≤ F(w), где w1 – состояние, вырабатываемое оператором S в состоянии w; 2) для каждого простого контура графа переходов схемы можно указать такой оператор S, через который проходит этот контур, что F(w1) < F(w); 3) для каждой дуги ai верно, что pi ⊃ F(w) ≥ 0, где w – состояние, в котором проходится эта дуга; 4) соблюдаются условия теоремы 1. Тогда алгоритм, начинающий работу в допустимом состоянии w0, завершается за конечное число шагов.