02.Аналитическая верификация.ppt
- Количество слайдов: 13
Аналитическая верификация программ Предусловие и постусловие 1) доказательство завершимости; 2) доказательство истинности постусловия после завершения программы. Присваивание. Если имеется некоторое условие P(x), в запись которого входит переменная x, то {P(w)} x: =w {P(x)} Последовательность операторов. Если S 1 и S 2 – операторы, для которых выполняются условия {P} S 1 {Q} и {Q} S 2 {R}, то {P} S 1; S 2 {R}.
Ветвление. Если S 1 и S 2 – операторы, для которых выполняются условия {P, B} S 1 {Q} и {P, not B} S 2 {Q}, то {P} if B then S 1 else S 2 {Q}. Цикл. Если S – оператор, для которого выполняется условие {P, B} S { P }, то {P} while B do S { P, not B }. Условие P здесь не изменяется в процессе выполнения цикла, оно называется инвариантом цикла.
Методы доказательства 1) последовательное перечисление выполняемых действий; 2) перечисление вариантов, применяется для ветвлений; 3) метод математической индукции, применяется для циклов; 4) инвариант, также применяется для циклов; 5) метод эквивалентов; 6) абстракция,
Примеры 1. Предусловие: x=a, y=b z: =y; y: =x; x: =z Постусловие: x=b, y=a __________________ 2. Предусловие x=a, y=b if x
Метод математической индукции 1) базис, 2) предположение, 3) индуктивный вывод. На этапе базиса проверяют, что доказываемое утверждение P(n) относительно параметра индукции n справедливо при n = n 0. На втором этапе делается предположение, что утверждение P(n) справедливо для всех значений n, не бóльших, чем некоторое k, k ≥ n 0. На этапе индуктивного вывода доказывается, что P(n) будет справедливо при n = k + 1 > n 0. Из этого следует, что утверждение P(n) справедливо для любого n ≥ n 0.
Пример математической индукции Sn = 12 + 22 + … + n 2 , ≈ n 3 / 3 Базис. При n = 0 сумма Sn = 0, с другой стороны, при n = 0 формула верна. Предположение. Пусть при n ≥ 0 формула верна. Индуктивный вывод. При n + 1:
предусловие: n=M, M≥ 1. f: =1; i: =2; while i<=n do begin f: =f*i; i: =i+1 end постусловие: f=1*2*. . . *M, i=n+1. Базис. Если M=1, то f=1, i=2. Предположение: при M=k, k≥ 1 постусловие f=1*2*. . . *k, i=k+1. Индуктивный вывод: дополнительный шаг цикла при i=k+1 : f=1*2*. . . *k*(k+1), i=k+2. Т. е. постусловие справедливо при n=M+1.
Пример 1. Инвариант предусловие: n=M, M≥ 1. f: =1; i: =2; while i<=n do begin f: =f*i; i: =i+1 end постусловие: f=1*2*. . . *M, i=n+1. Полное предусловие: n=M, M≥ 1, i=2, f=1*. . . *(i-1) Полное постусловие: n=M, M≥ 1, i=n+1, f=1*. . . *(i-1). Инвариант: f=1*. . . *(i-1).
Пример 2. Инвариант предусловие: i=2, min=A[1]. min: =A[1]; for i: =2 to n do if min>A[i] then min: =A[i]; постусловие: i=n+1, min = min{A[1], . . . , A[n]}. Инвариант: min = min{A[1], . . . , A[i-1]}.
Пример 3. Инвариант предусловие: i=2, k=1. k: =1; for i: =2 to n do if A[k]>A[i] then k: =i; постусловие: i=n+1, k = argmin{A[1], . . . , A[n]}. Инвариант: k = argmin{A[1], . . . , A[i-1]}.
Пример 4. Вложенные циклы: абстракция {предусловие: j=1} for j: =1 to n-1 do begin k: =j; {предусловие: i=j+1, k=j} for i: =j+1 to n do if A[k]>A[i] then k: =i; {постусловие: i=n+1} {инвариант: k = argmin{A[j], . . . , A[i-1]}} z: =A[j]; A[j]: =A[k]; A[k]: =z end; {постусловие: j=n} {инвариант: A[1] ≤ A[2] ≤, . . . ≤ A[j-1]}, A[j-1] ≤ min{A[j], . . . , A[n]}} Следствие: A[1] ≤ A[2] ≤, . . . ≤ A[n]
Анализ трудоемкости Трудоемкость: функция зависимости количества элементарных действий в программе от входного параметра n, при n →∞. Пример 3: k: =1; for i: =2 to n do if A[k]>A[i] then k: =i; Здесь T(n) = A·n + B. При n →∞ величиной B можно пренебречь. Коэффициент A зависит от компьютера, от качества транслятора, поэтому пишут: T(n) = O(n). Здесь порядок трудоемкости – линейный. При сравнении двух алгоритмов (решающих одну и ту же задачу): тот алгоритм лучше (имеет меньшую трудоемкость), у которого порядок трудоемкости меньше. Например, O(n) лучше, чем O(n 2). Если же у них порядок одинаков, то лучше тот алгоритм, у которого множитель перед функцией меньше.
Пример 4: for j: =1 to n-1 do begin k: =j; for i: =j+1 to n do if A[k]>A[i] then k: =i; z: =A[j]; A[j]: =A[k]; A[k]: =z end; Количество повторений внутреннего цикла: при j=1 равно n – 1, при j=2 равно n – 2, . . . , при j=n-1 равно 1. Всего: (n – 1)+(n – 2)+. . . + 1 = n·(n – 1)/2 ≈ n 2/2. Трудоемкость: T(n) = A·n 2+ B·n + С = O(n 2). Здесь порядок трудоемкости – квадратичный. В примерах 3 и 4 вычислена трудоемкость в наихудшем случае, т. е. гарантированная трудоемкость Иногда полезно также вычислять трудоемкость в наилучшем.


