- •Затверджено Вченою радою факультету кібернетики Протокол № __ від __ ______ 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.10. Завдання для самостійної роботи
Завдання для самостійної роботи:
Ділення двох чисел будь-якого знаку.
Обчислити: .
Обчислити суму арифметичної прогресії.
Обчислити суму геометричної прогресії за формулою суми геометричної прогресії.
Додавання двох невід’ємних чисел черес плюс два і мінус один.
Обчислити: .
Знайти подвійний факторіал, якщо n – непарне.
Обчислити: .
Обчислити: через плюс один.
Обчислити: .
Обчислити: .
Завдання для контрольної роботи:
Додавання двох чисел будь-якого знаку через плюс один.
Обчислити: .
Знайти n- те число Фібоначчі.
Обчислити суму геометричної прогресії.
Додавання двох невід’ємних чисел черес плюс три і мінус один.
Знайти остачу від ділення двох чисел.
Обчислити: .
Знайти подвійний факторіал, якщо n – парне.
Обчислити: .
Обчислити: .
Обчислити дискримінант .
1.11. Приклади завдань для контрольної роботи.
f(x) = sg(x):
f(x, y) = max(x, y):
f(x) = [x/2]:
f(x, y) =
f(x, y) = 2x+y+1
f(x) = nsg(x);
f(x, y) = min(x, y);
f(x, y, z) = max(x, y)+z;
f(x, y, z) = mіп(x+y, z);
f(x, y) = xy.
f(x, y)=|x–y|
f(x)=
f(x, y) = (x+1)2y;
f(x, y) = HCK(x, y);
f(x, y) = (x+1)2y ;
f(x) = x4–x;
f(x) = 2x–3x
f(x, y) = 3x(y+1);
f(x) = (2x)!!
f(x) = [log2 x];
f(x, y, z) = xy+z
f(x, y) = ;
f(x, y) = mod(x, y).
f(x, y) = .
f(x, y, z) = min(mod(x, y), z);
f(x, y, z) = mod(x+1, min(y, z));
f(x, y, z) = HCK(x, y+z);
P(x): "x – непарне число";
P(x): "x – парне число".
P(x,y): "x=y":
P(x,y): "хy";
P(x,y): "х>y";
P(x,y): "хy";
P(x,y): "х<y".
P(x): "x не кратне 2";
P(x): "x не кратне 3";
P(x,y,z): z= (x div y)
P(x,y,z): z=x%y
P(x,y): x=y!
P(n,m): m=n-те число Фібоначі
Тема 2. Формальні мови та граматики
Теорія …
+ домовленість: якщо не фіксується інше, то вважаємо, що великими латинськими літерами позначаються нетермінальні символи граматики, а малими – термінальні.
2.1. Побудова мови за допомогою системи рівнянь з регулярними коефіцієнтами
Завдання 2.1. Нехай задано мову L, яку описує регулярний вираз r = a*ba*. Побудувати за регулярним виразом граматику і систему лінійних рівнянь, розв’язати систему.
Розв’язок.
Побудуємо праволінійну граматику G для мови L. G = <VT, VN, Pr, S>.
VT = {a, b}; VN = {S, S1, S2}; Pr = {S->aS1; S->bS2; S1->aS1; S1->bS2; S2->aS2; S2->ε}, S ={S}
Отже G = < {a, b}; {S, S1, S2}; {S->aS1; S->bS2; S1->aS1; S1->bS2; S2->aS2; S2->ε}, {S}>
Тепер побудуємо систему лінійних рівнянь для цієї граматики:
Кількість рівнянь дорівнює кількості нетерміналів. В нашому випадку 3. Кожному нетерміналу ставимо у відповідність змінну : S-> X1; S1->X2; S2->X3. Система має такий вигляд:
X1 = p1+ q11X1 + q12X2 + q13X3
X2 = p2+ q21X1 + q22X2 + q23X3
X3 = p3+ q31X1 + q32X2 + q33X3
pi визначається так : для всіх продукцій вигляду Xi ->γj, pi = . Всі qij визначаються так: для всіх продукцій вигляду Xi ->γjXj, qij = . Маємо:
X1 = X2a + X3b
X2 = X2a + X3b
X3 = ε + X3a
Зауважимо, що розв’язком рівняння виду X = Xα + β буде регулярний вираз βα*, що доводиться підстановкою. Систему рівнянь розв’язуємо методом Гауса. Розв’язком системи ми вважаємо Xk вираз при змінній, яка відповідає нетерміналу аксіоми. В нашому випадку буде регулярній вираз при змінній X1. Робимо послідовні підстановки:
X1 = X2a + X3b підставляємо у всі рівняння. Рівняння X2 = X2a + X3b має розв’язок X2=(X3b)a*. Підставляємо X2 у останнє рівняння. Маємо X3 = ε + X3a. Тепер робимо зворотню підстановку: розв’язком останнього рівняння буде X3 = εa* = a*. Підставляємо X3 в перше і друге рівняння : X1 = X2a + a*b; X2 = X2a + a*b. Розв’язуємо друге рівняння : X2 = a*ba* і підставляємо в перше рівняння X1 = a*ba*a + a*b = a*b(a*a + ε) = a*ba*. Отже отримали регулярний вираз a*ba*, який описує ту саму мову, що і граматика, побудована за початковим регулярним виразом.
2.2. Побудова мови методом наближень
Завдання 2.2. Задано мову L, яку описує регулярний вираз r = anban. Побудувати граматику і методом послідовних наближень побудувати мову.
Розв’язок.
Побудуємо породжуючу граматику G для мови L: G = <{a, b}, {S}, {S->aSa, S->ε}, {S}>. Покажемо, що мова, яку описує побудована граматика складається зі слів вигляду anban і тільки з них.
Запишемо для цієї граматики рівняння : S = {b} {a}S{a}. Тоді функція φ(Li) = {b} {a}Li{a}.
Розглянемо L0, як перше наближення мови L : L0 = {b}. Застосовуючи метод послідовних наближень маємо L1 = φ(L0) = {b} {a}{b}{a} = {b} {aba}. Нехай Lk= , тоді Lk+1 = φ(Lk) = φ( ) = {b} {a} {a} = {b} = .
Очевидно, що послідовність (Lk) – зростаюча, отже існує границя – L′= . Отже L містить у собі L′ (це очевидно, бо для кожного слова w мови L′ існує таке невід’ємне n, що слово w = anban ).
Покажемо зворотне включення. Візьмемо довільне слово w з мови L. Зрозуміло, що це слово має вигляд : w = anban. Покажемо, що це слово належить мові L′. Це слідує з існування виводу цього слова у граматиці. Для виводу слова необхідно застосувати до аксіоми S правило S->aSa n разів, а потім правило S->b один раз. Отже мови L і L′ однакові і граматика G задає мову L і тільки її.
2.3. Побудова граматики за мовою
Завдання 2.3. Нехай задано мову L = {anbn|n>=0}. Побудувати граматику і показати, що вона породжує усі слова мови і тільки їх.
Розв’язок.
1) Побудуємо граматику G для мови L. G = <VT, VN, Pr, S>.
VT = {a, b}; VN = {S}; Pr = {S→aSb; S→ε}, S ={S}.
Отже G = < {a, b}; {S}; {S→aSb; S→ε}, {S}>
2) Перевіримо, що граматика породжує всі слова мови.
Поділимо все, що породжує граматика на такі типи (класи):
1) akSbk
2) akbk , k>=0
Можливо, доведеться їх змінити. Адже нам треба отримати такі класи, щоб застосування правил виведення граматики не виводило нас за їх межі.
Тепер побудуємо наступну таблицю:
-
типи
1
2
правила
1: S→aSb
1
-
2: S→ε
2
-
Тобто, застосування 1-го правила до 1-го типу залишає слово у 1 типі.
2-го правила до 1-го типу – переводить у 2-ий тип.
Жодне правило не застосовне до слів 2-го типу(-).
1тип.1пр) akSbk →1 akaSbbk = a(k+1)Sb(k+1)
1.2) akSbk →2 akbk
Таким чином, ми поділили все, що породжує граматика на «замкнені у своїх межах» класи. Тобто все те, що вона породжує, не виходить за їх межі.
3) Порівняємо тепер вихідну мову, і мову, породжену побудованою граматикою.
(akSbk)∩VT*=Ø
(akbk , k>=0)∩VT*= akbk , k>=0
Тобто ця граматика породжує усі слова мови і тільки їх.
Завдання 2.4. Нехай задано мову L = {anbncn|n>=0}. Побудувати граматику і показати, що вона породжує усі слова мови і тільки їх.
Розв’язок.
1) Побудуємо граматику G для мови L. G = <VT, VN, Pr, S>.
VT = {a, b, c}; VN = {S; B}; Pr = {S→aBSc; S→ε; Ba→aB; Bc→bc; Bb→bb}, S ={S}.
Отже G = < {a, b, c}; {S; B}; {S→aBSc; S→ε; Ba→aB; Bc→bc; Bb→bb}, {S}>
2) Перевіримо, що граматика породжує всі слова мови.
Поділимо все, що породжує граматика на такі типи(класи):
1) (aB)nScn
2) ycn , де |y|a = |y|B = n, y = (a|B)*
3) ycn , де |y|a = |y|b + |y|B = n, y = (a|B)*b*b
Можливо, доведеться їх змінити. Адже нам треба поділити на класи так, щоб застосування правил виведення граматики не виводило нас за межі цих класів.
Тепер побудуємо наступну таблицю:
-
типи
1
2
3
правила
1: S→aBSc
1
-
-
2: S→ε
2
-
-
3: Ba→aB
1
2
3
4: Bc→bc
-
3
-
5: Bb→bb
-
-
3
Тобто, застосування 1-го правила до 1-го типу залишає слово у 1 типі.
2-го правила до 1-го типу – переводить у 2-ий тип.
1тип.1пр)(aB)nScn →1 (aB)naBSccn = (aB)(n+1)Sc(n+1)
1.2) (aB)nScn →2 (aB)ncn = ycn , де |y|a = |y|B = n, y = (a|B)*
1.3) (aB)nScn →3 yScn , де |y|a = |y|B = n, y = (a|B)*
Так як клас yScn , де |y|a = |y|B = n, y = (a|B)*, який ми отримали внаслідок застосування правила 3 до 1-го класу включає у себе клас 1 ((aB)nScn), тому змінимо клас 1 на цей отриманий клас. Попередні правила та виводи не зміняться.
Правила 4 та 5 незастосовні до класу 1.
Правила 1, 2, 5 незастосовні до класу 2.
2.3) ycn →3 ycn , де |y|a = |y|B = n, y = (a|B)*
2.4) ycn →3 qcn , де |y|a = |y|B = n, y = (a|B)*, |q|a = |q|b + |q|B = n, q = (a|B)*b*b
Правила 1, 2, 4 незастосовні до класу 3.
3.3) ycn →3 ycn , де |y|a = |y|b + |y|B = n, y = (a|B)*b*b
3.5) ycn →3 ycn , де |y|a = |y|b + |y|B = n, y = (a|B)*b*b
Таким чином, ми поділили все, що породжує граматика на «замкнені у своїх межах» класи.
1) yScn , де |y|a = |y|B = n, y = (a|B)*
2) ycn , де |y|a = |y|B = n, y = (a|B)*
3) ycn , де |y|a = |y|b + |y|B = n, y = (a|B)*b*b
Тобто все те, що вона породжує, не виходить за їх межі.
3) Порівняємо тепер вихідну мову, і мову, породжену побудованою граматикою.
(yScn , де |y|a = |y|B = n, y = (a|B)*)∩T*=Ø
(ycn , де |y|a = |y|B = n, y = (a|B)*)∩T*= {ε}
(ycn , де |y|a = |y|b + |y|B = n, y = (a|B)*b*b)∩T* = ycn , де |y|a = |y|b + |y|B = n, y = (a|B)*b*, причому |y|B = 0, тому y = a*b*b= anbn.
Тобто:
(ycn , де |y|a = |y|b + |y|B = n, y = (a|B)*b*b)∩T* = anbncn .
Отже, ця граматика породжує усі слова мови і тільки їх.
Завдання 2.5. Нехай задано мову L = {anbm|m>n}. Побудувати граматику G, яка породжує мову L, та довести L(G)=L.
Розв’язок.
Побудуємо граматику G для мови L. G = <VT, VN, Pr, S>.
VT = {a, b}; VN = {S; B; C}; Pr = {S→aSb; S→B; B→Cb; C→Cb; C→ε}; S ={S}.
Отже G = < {a, b}; {S; B; C}; {S→aSb; S→B; B→Cb; C→Cb; C→ε}, {S}>.
1) Граматика G для мови має наступні правила виводу:
2) Доведемо, що
В граматиці G можна побудувати наступні види слів:
Покажемо, що це всі можливі види слів, що породжуються в граматиці – для цього відобразимо, як правила виводу перетворюють один вигляд в інший, таким чином показавши замкненість множини слів (точніше, їх видів) відносно виведення:
типи слів
правила виводу |
1 |
2 |
3 |
1 |
1 |
- |
- |
2 |
2 |
- |
- |
3 |
- |
2 |
- |
4 |
- |
3 |
- |
Отже, очевидно, що в граматиці виводяться лише слова 3 типу, оскільки лише вони складаються з терміналів.
Таким чином доведено . Доведемо тепер .
Покажемо можливість виводу будь-якого слова з L.
Вивід слова з аксіоми S повинен бути наступним:
Правило 1) застосовується n разів.
Правило 2) застосовується m-n-1 разів.
Правило 3) застосовується 1 раз.
Таким чином, доведено взаємне включення множин L(G) та L.
Завдання 2.6.
1) Побудувати породжувальну граматику G для мови
2) довести, що
3) довести, що мова L не є КВ мовою.
Розв’язок.
1) Граматика G для мови має наступні правила виводу:
2) Доведемо, що
В граматиці G можна побудувати наступні види слів:
Покажемо, що це всі можливі види слів, що породжуються в граматиці – для цього відобразимо, як правила виводу перетворюють один вигляд в інший, таким чином показавши замкненість множини слів (точніше, їх видів) відносно виведення:
типи слів
правила виводу |
1 |
2 |
3 |
4 |
1 |
1 |
- |
- |
- |
2 |
1 |
- |
- |
- |
3 |
2 |
- |
- |
- |
4 |
1 |
2 |
3 |
- |
5 |
- |
3 |
3,4 |
- |
Отже, очевидно, що в граматиці виводяться лише слова 4 типу.
Таким чином доведено . Доведемо тепер .
Покажемо можливість виводу будь-якого слова з L.
Вивід слова з аксіоми S повинен бути наступним:
Правило 1) застосовується n разів.
Правило 2) застосовується m-n разів.
Правило 3) застосовується 1 раз.
Правило 4) застосовується, поки застосовне ((n-1)*(n-2)/2 разів).
Правило 5) застосовується m-1 раз.
3) Довести, що мова L не є КВ мовою.
Якби мова L була КВ-мовою, то існували б ланцюжки u, v, t1, t2, x {a*,b**,c*} такі, що ut1ix t2ivL для всіх i=0,1,…. Зрозуміло, що t1 (так само як і t2) не може складатися з різних символів (інакше для деякого i ланцюжок ut1ix t2iv не буде належати L. Але якщо t1 складається лише з одного символу, то збільшуючи i можна порушити баланс символів a,b,c. Тому мова L не може бути КВ-мовою.