![](/user_photo/2706_HbeT2.jpg)
- •Затверджено Вченою радою факультету кібернетики Протокол № __ від __ ______ 2010 р.
- •1. Синтаксис та семантика. Мова sipl. Композиційна семантика
- •1.1. Синтаксис мови sipl
- •1.2. Композиційна семантика мови sipl
- •1.2.2. Функції
- •1.2.3. Композиції
- •1.2.4. Програмні алгебри
- •1.3. Побудова семантичного терму програми
- •1.4. Доведення коректності програм
- •1.5. Розв’язки типових задач
- •1.6. Розширення мови sipl: Введення булевих змінних
- •1.7. Приклади розв’язків задач.
- •1.8. Розширення мови sipl: Введення викликів функцій
- •1.9. Приклади задач
- •1.10. Завдання для самостійної роботи
- •1.11. Приклади завдань для контрольної роботи.
- •Тема 2. Формальні мови та граматики
- •2.1. Побудова мови за допомогою системи рівнянь з регулярними коефіцієнтами
- •2.2. Завдання для самостійної та контрольної роботи
- •2.3. Нормальні форми Хомського та Грейбах
- •2.4. Завдання для самостійної та контрольної роботи
- •Тема 3. Рекурсія та найменша нерухома точка. Неперервність операторів
- •Тема 4. Натуральна семантика
- •Тема 5. Аксіоматична семантика
- •Література
Тема 5. Аксіоматична семантика
Завдання 5.1. Довести часткову коректність програми DIV(a,b) (див. завдання 1.2) за допомогою логіки Хоара (в аксіоматичній семантиці).
Розв’язок.
Введемо позначення:
DIV(a,b) = rez:=0; k:=0; if a=0 then skip else if a<0 then skip else while k<=a-b do begin rez:=rez+1;k:=k+b end; ost:=a-k |
S1 = rez:=0; k:=0;
S2 = if a=0 then skip else if a<0 then skip else while k<=a-b do begin rez:=rez+1;k:=k+b end; ost:=a-k |
IF1 = if a=0 then skip else if a<0 then skip else while k<=a-b do begin rez:=rez+1;k:=k+b end
|
IF2 = if a<0 then skip else while k<=a-b do begin rez:=rez+1;k:=k+b end
|
WH = while k<=a-b do begin rez:=rez+1;k:=k+b end |
S3 = rez:=rez+1;k:=k+b
|
Тоді маємо наступне виведення в логіці Хоара:
(*) =
(**) =
(***) =
де предикати мають такий вигляд:
Інваріант цієї задачі для циклу while: P={rez=k/b}.
Розглянемо предикат
qf:
з нього випливає, що
.
Далі,
і
при цьому
.
Звідси випливає, що
,
тобто скільки разів b
повністю укладається в a,
або ж ціла частина від ділення, тоді
– залишок від ділення a
на b
за означенням.
Таким чином, з
істинності
(предиката q0)
як передумови випливає істинність
(отриману з предиката qf
еквівалентними перетвореннями)
як післяумови,
і це доводить часткову коректність
програми.
Завдання 5.2.
1) Побудувати програму обчислення n! через операцію «+».
2) Довести часткову коректність побудованої програми за допомогою логіки Хоара (в аксіоматичній семантиці).
Розв’язок.
1) Програма обчислення n! через операцію додавання:
Prog(n) =
begin
res := 1;
i
: = 1;
w
hile
i <= n do
begin
j
:= 1;
k
F3 або WH(…)1
F2
while j < i do
b
F4
k
S2
WH(…)2
F5
j := j+1
end;
r
F6
i := i + 1
end
end
На тексті програми введено позначення (скорочення), які ми будемо використовувати далі.
2) Доведення часткової коректності.
Деякі предикати, які зустрінуться в доведенні:
Необхідно показати,
що в результаті обчислень за програмою
ми отримаємо
,
що еквівалентно qf.
Решту предикатів ми будемо обчислювати в ході виведення (доведення) в логіці Хоара:
(1)
(2)
(3)
(4)
(5)
(6)
Таким чином, з
істинності
(предиката T)
як передумови випливає істинність
(предиката qf)
як післяумови,
що доводить часткову коректність
програми.
Завдання 5.3. Довести часткову коректність програми Sum_fac(n) обчислення суми факторіалів до вхідного n≥0 (включно) через множення і додавання (див. завдання 4.3) за допомогою логіки Хоара (в аксіоматичній семантиці).
Розв’язок.
Введемо позначення:
Sum_fac(n) = i:=0; fac:=1; res:=1; while i ≠ n begin i:=i+1; fac:= fac*i; res:=res+fac end |
W = while i ≠ n begin i:=i+1; fac:= fac*i; res:=res+fac; end
|
Позначення предикатів:
P
=
P0
=
P01
=
P02
=
T
=
T0
=
T1
=
B
=
Таким чином, з
істинності
(предиката P)
як передумови випливає істинність
(як
предиката
,
тобто
та {i = n})
як післяумови,
що і
доводить
часткову коректність програми.