![](/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. Аксіоматична семантика
- •Література
1.2.4. Програмні алгебри
Побудовані композиції дозволяють стверджувати, що отримано алгебру функцій (програмну алгебру)
A_Prog =<FNA, FNB, FNAB, FA, FB, FS; Sn, ASx, , IF, WH, x, id >.
Наведена алгебра містить багато «зайвих» функцій, які не можуть бути породжені в мові SIPL. Аналіз мови дозволяє стверджувати (цей факт буде доведено пізніше в теоремі 1.1), що функції, які задаються мовою SIPL, породжуються в алгебрі A_Prog з наступних базових функцій:
add, sub, mult, div FNA,
or, and, neg FNB,
less, leq, eq, neq, geq, gr FNAB,
FA (nInt),
,
FB,
Підалгебру алгебри A_Prog, породжену наведеними базовими функціями, назвемо функціональною алгеброю мови SIPL і позначимо A_SIPL.
Зауважимо, що всі функції алгебри A_SIPL є однозначними (детермінованими) функціями. Це випливає з того, що всі базові функції є однозначними, а композиції зберігають цю властивість. (Довести цю властивість самостійно).
Формули для обчислення композицій та функцій алгебри A_Prog подамо у наступній таблиці (тут f – n-арна функція, fa, g1,…, gn – номінативні арифметичні функції, fb – номінативний предикат, fs, fs1, fs2 – біномінативні функції, st – стан, n – число).
Таблиця 1.2
Композиція (функція)
|
Формула обчислення |
Ім’я формули |
Суперпозиція |
(Sn(f, g1,…, gn))( st)=f(g1(st),…, gn(st)) |
AF_S |
Присвоєння |
ASx (fa)(st)=st [x fa(st)] |
AF_AS |
Послідовне виконання |
fs1fs2(st)=fs2(fs1(st)) |
AF_SEQ |
Умовний оператор |
|
AF_IF |
Цикл |
WH(fb,fs)(st)=stn, де st0=st, st1=fs(st0), st2=fs(st1), …, stn=fs(stn-1), причому fb(st0)=true, fb(st1)=true,…, fb(stn-1)=true, fb(stn)=false. |
AF_WH |
Функція розіменування |
x(st)=st(x) |
AF_DNM |
Тотожна функція |
id(st)=st |
AF_ID |
Побудована алгебра A_SIPL дозволяє тепер формалізувати семантику програм мови SIPL, задаючи їх функціональними виразами (семантичними термами) алгебри A_SIPL.
1.3. Побудова семантичного терму програми
Програма мови SIPL може бути перетворена в семантичний терм (терм програмної алгебри), який задає семантику цієї програми (семантичну функцію програми), перетвореннями такого типу:
sem_P: Prog FS
sem_S: Stm FS
sem_A: Aexp FA
sem_B: Bexp FB
Ці перетворення задаються рекурсивно (за структурою програми). Тому побудова семантичного терму залежить від вибору структури синтаксичного запису програми. Тут треба зважати на неоднозначність обраної нами граматики, що може призвести до різної семантики програм. Для досягненя однозначності треба користуватись пріоритетами операцій та типом їх асоціативності.
Таблиця 1.3
Правило заміни |
Назва правила |
sem_P: Prog FS задається правилами:
|
|
sem_P(begin S end)= sem_S(S) |
NS_Prog |
sem_S: Stm FS задається правилами:
|
|
sem_S(x:=a)=ASx(sem_A(a)) sem_S(S1;S2)= sem_S(S1) sem_S(S2) sem_S(if b then S1 else S2)= IF(sem_B(b), sem_S(S1), sem_S(S2)) sem_S(while b do S)= WH(sem_B(b), sem_S(S)) sem_S(begin S end)=(sem_S(S)) sem_S(skip)=id |
NS_Stm_As NS_Stm_Seq NS_Stm_If
NS_Stm_Wh NS_Stm_Op NS_Stm_skip |
sem_A: Aexp FA задається правилами:
|
|
sem_A(n)=
sem_A(a)=a sem_A(a1+a2)=S2(add, sem_A(a1), sem_A(a2)) sem_A(a1–a2)=S2(sub, sem_A(a1), sem_A(a2)) sem_A(a1a2)=S2(mult, sem_A(a1), sem_A(a2)) sem_A(a1a2)=S2(div, sem_A(a1), sem_A(a2)) sem_A((a))=sem_A(a) |
NS_A_Num NS_A_Var NS_A_Add NS_A_Sub NS_A_Mult NS_A_Div NS_A_Par |
sem_B: Bexp FB задається правилами:
|
|
sem_B(true)=
sem_B(false)=
sem_B(a1<a2)=S2(less, sem_A(a1), sem_A(a2)) sem_B(a1a2)=S2(leq, sem_A(a1), sem_A(a2)) sem_B(a1=a2)=S2(eq, sem_A(a1), sem_A(a2)) sem_B(a1a2)=S2(neq, sem_A(a1), sem_A(a2)) sem_B(a1a2)=S2(geq, sem_A(a1), sem_A(a2)) sem_B(a1>a2)=S2(gr, sem_A(a1), sem_A(a2)) sem_B(b1b2)=S2(or, sem_B(b1), sem_B(b2)) sem_B(b1b2)=S2(and, sem_B(b1), sem_B(b2)) sem_B(b)=S1(neg, sem_B(b)) sem_B((b))= sem_B(b) |
NS_B_true NS_B_false NS_B_less NS_B_leq NS_B_eq NS_B_neq NS_B_geq NS_B_gr NS_B_or NS_B_and NS_B_neg NS_B_Par |
Наведені правила слід розглядати як загальні правила, які в логіці називають схемами правил. Щоб із загального правила (метаправила) отримати конкретне правило (об’єктне правило), слід замість синтаксичних метасимволів, таких як a, b, S, P, n, x, підставити конкретні синтаксичні елементи (записи), наприклад замість a підставити N–M, замість b – M>N і т.п. Далі ліва частина конкретного правила заміняються на його праву частину і т.д.