 
        
        - •Затверджено Вченою радою факультету кібернетики Протокол № __ від __ ______ 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,
або ж ціла частина від ділення, тоді
,
тобто скільки разів b
повністю укладається в a,
або ж ціла частина від ділення, тоді 
 – залишок від ділення a
на b
за означенням.
– залишок від ділення a
на b
за означенням.
Таким чином, з
істинності 
 (предиката q0)
як передумови випливає істинність
(предиката q0)
як передумови випливає істинність 
 (отриману з предиката qf
еквівалентними перетвореннями)
як післяумови,
і це доводить часткову коректність
програми.
(отриману з предиката qf
еквівалентними перетвореннями)
як післяумови,
і це доводить часткову коректність
програми.
Завдання 5.2.
1) Побудувати програму обчислення n! через операцію «+».
2) Довести часткову коректність побудованої програми за допомогою логіки Хоара (в аксіоматичній семантиці).
Розв’язок.
1) Програма обчислення n! через операцію додавання:
Prog(n) =
begin
res := 1;
	 i
: = 1;
i
: = 1;
w hile
i <= n do
hile
i <= n do
begin
j := 1;
:= 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.
,
що еквівалентно qf.
Решту предикатів ми будемо обчислювати в ході виведення (доведення) в логіці Хоара:
 
(1)
 
(2)
 
(3)
 
(4)
 
(5)
 
(6)
 
Таким чином, з
істинності 
 (предиката T)
як передумови випливає істинність
(предиката T)
як передумови випливає істинність 
 (предиката qf)
як післяумови,
що доводить часткову коректність
програми.
(предиката 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})
як післяумови,
що і
доводить
часткову коректність програми.
та {i = n})
як післяумови,
що і
доводить
часткову коректність програми.
