- •Затверджено Вченою радою факультету кібернетики Протокол № __ від __ ______ 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. Аксіоматична семантика
- •Література
1.9. Приклади задач
…
Задача. Обчислення X^Y через виклик рекурсивної функції множення двох чисел, реалізованої через додавання.
p
rogram
func mul(a, b)=if b>0 then a+mul(a,b-1) else 0
b
egin
res:=1;
P
while (y>0) do
F1
F2
F3
F4
y:=y-1
end
end
Дерево синтаксичного виводу програми у мові SIPL:
Повернути, оформити !!!
Transpose picture !!!
Семантичний терм:
sem_P(P)=sem_S(F1)=sem_S(F2)=ASres(1) • sem_S(F3)=ASres(1) • WH(sem_B(y>0), sem_S(F4))=ASres(1) • WH(S2(gr,y=>,0), ASres(sem_A(mul(x,res)))• ASy(S2(sub,y=>,1)))=ASres(1) • WH(S2(gr,y=>,0), ASres(Sa,b(sem_A(mul),x=>,res=>)• ASy(S2(sub,y=>,1))).
Знайдемо sem_A(mul):
sem_A(mul)=IF_A(S2(gr, b=>, 0), sem_A(a+mul(a,b-1)), 0)=IF_A(S2(gr, b=>, 0), S2(add, a=>, sem_A(mul(a,b-1)), 0)=IF_A(S2(gr, b=>, 0), S2(add,a=>,Sa,b(sem_A(mul),a=>,S2(sub,b=>,1))), 0)
Маємо рекурсивно задану семантику для функції.
Доведемо, що sem_A(mul)([aA, bB])=A*B індукцією за B.
1) База. Якщо B=0, то
sem_A(mul)(st)= IF(S2(gr,b=>,0),S2(add,a=>,Sa,b(sem_A(mul),a=>,S2(sub,b=>,1))),0)(st)=0, оскільки B=0.
2) Припущення. Нехай sem_A(mul)([aA, bB])=A*B, для всіх B<k.
3) Крок індукції. Нехай B=k>0, маємо:
sem_A(mul)(st)=
IF_A(S2(gr,b=>,0),S2(add,a=>,Sa,b(sem_A(mul),a=>,S2(sub,b=>,1))),0)(st)=
S2(add,a=>,Sa,b(sem_A(mul),a=>,S2(sub,b=>,1)))(st). Використовуючи означення локальної композиції, отримаємо:
sem_A(mul)(st)=S2(add,a=>(st),sem_A(mul)(st∇[aA, bB-1]))=
A+A*(B-1)=A+A*B-A=A*B
Формула доведена.
Доведемо часткову коректність програми.
Нехай на вхід програмі дається стан st=[xX, yY]. X,Y≥0
sem_P(P)(st)=ASres(1) • WH(S2(gr,y=>,0), ASres(Sa,b(sem_A(mul),x=>,res=>)• ASy(S2(sub,y=>,1)))(st)=WH(S2(gr,y=>,0), ASres(Sa,b(sem_A(mul),x=>,res=>)• ASy(S2(sub,y=>,1)))(st∇[res1]).
Нехай WH(S2(gr,y=>,0), ASres(Sa,b(sem_A(mul),x=>,res=>)• ASy(S2(sub,y=>,1)))=f. Тоді висунемо гіпотезу, що f(stin)=stout, де
stin=[xU, yV, resR] , U,V≥0 – вхідний стан для циклу,
stout=[xU, y0, resR*U^V]– результат виконання циклу. Доведемо, що ця рівність виконується, індукцією за кількістю ітерацій циклу:
База індукції. NumItWH=0. Тому V≤0, з умови V≥0 випливає, що V=0. Тоді рівність f(stin)=stout виконується.
Припущення. Нехай рівність f(stin)=stout виконується для всіх циклів з кількістю ітерацій менше деякого додатнього k:
NumItWH<k, k>0
Крок індукції. Доведемо, що рівність виконується і для циклів з k ітерацій.
f(stin)=WH(S2(gr,y=>,0),ASres(Sa,b(sem_A(mul),x=>,res=>)•ASy(S2(sub,y=>,1)))(stin). Використаємо формулу: WH(p, f)=IF(p, f •WH(p,f), id), враховуючи, що кількість ітерацій додатня, а тому умова p на початковому стані істина, маємо: (ASres(Sa,b(sem_A(mul),x=>,res=>)•ASy(S2(sub,y=>,1))•f)(stin). Розпишемо композицію:
f(stin)=f(ASres(Sa,b(sem_A(mul),x=>,res=>)•ASy(S2(sub,y=>,1)))(stin))= f(ASy(S2(sub,y=>,1)(ASres(Sa,b(sem_A(mul),x=>,res=>)(stin)))=f(ASy(S2(sub,y=>,1)([xU, yV, resU*R]))=f([xU, yV-1,resU*R]), оскільки ми виконали одну ітерацію циклу, то для стану [xU, yV-1,resU*R] кількість ітерацій буде k-1, тому, оскільки з умови y>0 випливає, що V-1≥0:
f([xU, yV-1,resU*R])=[xU, y0,res (U*R)*U^(V-1)] - за припущенням індукції. Але [xU, y0,res (U*R)*U^(V-1)]=[xU, y0, resR*U^V]= stout
Тому f(stin)=stout для кожного stin=[xU, yV, resR], при умові, що U,V≥0. Тому
sem_P(P)=f([xX, yY, res1])=[xX, y0, resX^Y]
Часткова коректність доведена.
Неважко бачити, що значення y на кожній ітерації циклу утворюють строго спадну послідовність, обмежену нулем. В силу скінченності значення y цикл завжди завершить своє виконання, при умові y=0 цикл не буде виконуватись взагалі. В силу скінченності команд програми, вона завжди зупиняється. Тому справджується повна коректність програми.
