Тема 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;
while i <= n do
begin
j := 1;
|
|
while j < i do
|
|
|
|
j := j+1
end;
|
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})як післяумови, що і доводить часткову коректність програми.
Література
1. Nikitchenko N. A Composition Nominative Approach to Program Semantics. – Technical Report IT-TR: 1998-020. – Technical University of Denmark. – 1998. – 103 p.
2. Басараб И.А., Никитченко Н.С., Редько В.Н. Композиционные базы данных. – К.: Либідь, 1992. – 191 с.
3. Winskel G. The Formal Semantics of Programming Languages: An Introduction. – London: MIT Press Foundations of Computing Series, 1993. – 361 p.
4. Nielson H.R., Nielson F. Semantics with Applications: A Formal Introduction. – Wiley Professional Computing, 1992. – 240 p.
5. Редько В.Н. Семантические структуры программ // Программирование. – 1981. – № 1. – С. 3–19.
6. Никитченко Н.С. Композиционная семантика языков программирования // Программирование. – 1982. – № 6. – С. 9–18.
7. Нікітченко М. С., Панченко Т. В. Структури даних в композиційних мовах програмування //Вісник Київського університету. Серія: фіз.-мат. науки. – 2004. – вип. 2. – С. 316–325.
|
|
8. Панченко Т. В. Моделювання структур даних та функцій над ними в композиційно-номінативній мові ACoN //Проблемы программирования. – 2004. – №1-2. – С. 7–15.
9. Панченко Т. В. Композиційні методи специфікації та верифікації програмних систем. Дисертація на здобуття наукового ступеня кандидата фізико-математичних наук. – Київ, 2006. – 177 с.
[S1]Добавить унарный минус
[S2]Альтернативный вариант если есть Dec()
[S3]Унарный минус отсутствует. Надо писать 0-M, 0-N
[S4]Оптимизированный вариант
[S5]Этот оператор лишний
[S6]Этот оператор лишний
[S7]Оптимизированный вариант
[S8]Оптимизированный вариант
Дата добавления: 2018-04-05; просмотров: 346; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!