Верифікація програм. Семантики мов програмування, страница 3

Індуктивним твердженням для початкової точки повинна бути передумова P, а для завершальних – постумова Q. Таким чином, нарешті буде доведено, що Q– інваріант у кожній завершальній точці. З того, що Q - інваріант у кожній завершальній точці для передумови P, випливає часткова коректність програми.

Для даної блок-схеми запропонуємо  такі індуктивні твердження:

IA :   Psqrt ,

IB :   z2 ≤ x;  y1 = (z+1)2; y2 = 2z + 1,

IC :   Qsqrt .

 Крок 3 – доведення умов локальної коректності. На цьому кроці будуються умови локальної коректності і доводиться їх істинність.

Введемо додаткові позначення. Нехай α – деякий базовий шлях з контрольної точки S у контрольну точку T. Через Rα  позначимо формулу, яка істинна при переході через S тоді і тільки тоді, коли обчислення йде з цієї точки далі по шляху α. Ця формула називається умовою вибору шляху α.

Через θα  позначимо підстановку. Для змінної v  вираз θα(v)  має  значення  vпісля проходження  α, виражене через значення змінних перед проходженням α. Підстановка θα  називається перетворенням змінних, що відповідає шляху α. Вираз θα(IK) буде означати результат застосування до формули IK  підстановки θα , яка відповідає операторам присвоювання  шляху α.

Для нашої програми:

Rα :        true,

θα :       y1 : = 1,      y2 : = 1,      z : = 0,

Rβ :       y1 ≤ x ,

θ β  :     y2 : = y1 + y2 + 2,   y2 : = y2 + 2,   z : = z + 1,

Rγ :       y1 > x ,

θ β :       – ідентична підстановка.

У теорії Флойда доводиться таке твердження.

Припустимо, що індуктивне твердження для початкової точки є передумова P, і для будь-якого базового шляху α з контрольної  точки  S  у  контрольну  точку  Tформула   {IS ,R α } θα(IT)  істинна при довільних значеннях змінних. Тоді для будь-якої точки S індуктивне  твердження   IS     інваріант в  Sдля передумови P.

Якщо для шляху α вказана формула істинна, то шлях називається локально коректним. Сама формула називається умовою локальної коректності α.

Для нашої програми умови локальної коректності мають вигляд.

Шлях  α:

Psqrt  →  θα (IB) ,

або       (x ≥ 0)      { 0 2 ≤ x,   1 = (0+1)2,    1 = 2• 0 + 1} .

Шлях  β:

{ IB ,   y1 ≤ x }   →  θβ (IB) ,

або      { z 2 ≤ x,  y1 = (z+1)2, y2 = 2z + 1,  y1 ≤ x }  

{(z+1)2 ≤ x,  y1+ y2+2 =(z+2)2,  y2 +2 =2(z+1)+1} .

Шлях  γ:

{ IB ,   y1 > x }   →  Qsqrt ,

або       { z 2 ≤ x,   y1 = (z+1)2, y2 = 2z + 1, y1 > x }  

{ z2 ≤ x < (z+1)2 } .

Можна далі показати, що програма завершується для будь-якого невід’ємного x. Це гарантує повну коректність програми.

Значний вклад у верифікацію програм було внесено Хоаром. Розглянемо коротко теорію Хоара.

Якщо для кожного оператора за заданими постумовами можна обчислити найслабшу передумову, то для програми можна побудувати коректне доведення. Результат, який треба одержати після виконання програми, береться як постумова останнього оператора. Далі програма відстежується від кінця до початку з послідовним обчисленням найслабших передумов для кожного оператора.

При  досягненні початку програми перша її передумова буде умовою, при якій програма видає необхідний результат.

Для простих операторів обчислення найслабшої передумови може бути задано аксіомою,  для більш складних операторів використовуються правила логічного виведення.

Аксіомою називаються логічний вираз, що передбачається правильним.

Правилом логічного виведення називається метод виведення істинності одного твердження на основі значень інших.

Семантику операторів будемо описувати вираженням  {P} S {Q}.

Оператор присвоювання

Нехай х := Е  – оператор присвоювання, а Q – його постумова.

Тоді передумова Р визначається аксіомою Р=Qx=E , це означає, що передумова  Р обчислюється як умова Q , у якій всі  x  заміняють виразом Е.

Наприклад, для оператора x:= x-3 і постумови   {x>0}  найслабшою передумовою буде P: {x>3}.

Запис у формі {P} S {Q} має вигляд

                  {x>3}  x:=x-3       {x>0}.

Візьмемо            Р' = {x>5}, для  Р' справедлива рівність  Р' → Р.

Справедливий також запис

                        P'            S              Q

                        {x>5}   x:=x-3      {x>0} ,

хоча це і не випливає з нашої аксіоми. Для доведення потрібно ще використати правило логічного висновку.

Правила логічного висновку

Загальна форма правила логічного виведення має вигляд

                                    .

Це означає, що з істинності S1,…,Sn випливає істинність S.

Правилами логічного виведення є, зокрема, правила логічного висновку:

1)         ,

       2)         .

Іншими словами, правило логічного висновку стверджує, що передумова завжди може бути посилена, а постумова ослаблена.