Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_рекоменд-ТП-4.doc
Скачиваний:
3
Добавлен:
12.11.2019
Размер:
2.49 Mб
Скачать

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

begin

F3

F4

res:=mul(x,res);

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)([aA, bB])=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)([aA, bB])=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∇[aA, bB-1]))=

A+A*(B-1)=A+A*B-A=A*B

Формула доведена.

Доведемо часткову коректність програми.

Нехай на вхід програмі дається стан st=[xX, yY]. 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∇[res1]).

Нехай WH(S2(gr,y=>,0), ASres(Sa,b(sem_A(mul),x=>,res=>)• ASy(S2(sub,y=>,1)))=f. Тоді висунемо гіпотезу, що f(stin)=stout, де

stin=[xU, yV, resR] , U,V≥0 – вхідний стан для циклу,

stout=[xU, y0, resR*U^V]– результат виконання циклу. Доведемо, що ця рівність виконується, індукцією за кількістю ітерацій циклу:

  1. База індукції. NumItWH=0. Тому V≤0, з умови V≥0 випливає, що V=0. Тоді рівність f(stin)=stout виконується.

  2. Припущення. Нехай рівність f(stin)=stout виконується для всіх циклів з кількістю ітерацій менше деякого додатнього k:

NumItWH<k, k>0

  1. Крок індукції. Доведемо, що рівність виконується і для циклів з 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)([xU, yV, resU*R]))=f([xU, yV-1,resU*R]), оскільки ми виконали одну ітерацію циклу, то для стану [xU, yV-1,resU*R] кількість ітерацій буде k-1, тому, оскільки з умови y>0 випливає, що V-1≥0:

f([xU, yV-1,resU*R])=[xU, y0,res (U*R)*U^(V-1)] - за припущенням індукції. Але [xU, y0,res (U*R)*U^(V-1)]=[xU, y0, resR*U^V]= stout

Тому f(stin)=stout для кожного stin=[xU, yV, resR], при умові, що U,V≥0. Тому

sem_P(P)=f([xX, yY, res1])=[xX, y0, resX^Y]

Часткова коректність доведена.

Неважко бачити, що значення y на кожній ітерації циклу утворюють строго спадну послідовність, обмежену нулем. В силу скінченності значення y цикл завжди завершить своє виконання, при умові y=0 цикл не буде виконуватись взагалі. В силу скінченності команд програми, вона завжди зупиняється. Тому справджується повна коректність програми.