
- •Затверджено Вченою радою факультету кібернетики Протокол № __ від __ ______ 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. Аксіоматична семантика
- •Література
2.2. Завдання для самостійної та контрольної роботи
Побудувати граматику G, яка породжує задану мову L, та довести L(G) = L для L:
anbm, n>=m
a*|b*| c*
(a|b|c)*
(a|b)*c
a*ba*b
a*b|b*a
anbncn
anbcm, m>n
anb2n
a*|ba*b
anbn+2
a*b*c*
anbmcn
a|b*c| cb*
a*b|a|b
(a|b)*a*
(abc)*
(ab)*|ab
a*(a|b)*b*
(ab)*|(a|b)*
2.3. Нормальні форми Хомського та Грейбах
Теорія: …
+ алгоритм: як позбутися ε-правил (ε-переходів) !!! + який сенс застосування (отримаємо нескорочуючі правила, ефективний синтаксичний аналіз)
Означення:
Нетермінал
КС-граматики
називається
-нетерміналом,
якщо
.
Алгоритм. Пошук -нетерміналів:
….
…. Пn
Тоді множина
— множина
-нетерміналів.
+ алгоритм: як позбутися лівої рекурсії + сенс застосування (ефективний синтаксичний аналіз – LL(k), тоді можлива однозначна (без повернень) побудова зліва-направо = лівостороння стратегія виводу)
Запропонуємо
декілька прийомів, що дають можливість
при побудові
граматик
уникнути лівої рекурсії. Розглянемо
граматику зі схемою правил
,
яка має ліворекурсивний нетермінал
.
Замінимо схему правил новою схемою з
трьома правилами
.
Теорія про НФ Хомського та Грейбах:
визначення,
можливо, алгоритм зведення,
для Хомського:
виключити непродуктивні і недосяжні нетермінали
позбутися ε-продукцій (стандартним алгоритмом підстановки та виключення), та ввести нову аксіому, якщо ε виводиться в граматиці
для всіх терміналів ввести допоміжні нетермінали, відповідні правила (A a, B b) та виконати заміни
всі продукції з «довшими» за 2 символи правими частинами розбиваємо на декілька (довжина – 1), вводячи допоміжні нетермінали
якщо в правій частині продукції залишився 1 нетермінал, виконати його «каскадні»/«ланцюжкові» заміни
для Грейбах:
виключити непродуктивні і недосяжні нетермінали
позбутися ε-правил (стандартним алгоритмом підстановки та виключення), та ввести нову аксіому, якщо ε виводиться в граматиці
позбутись лівої рекурсії
підставити замість нетерміналів на 1 місці в правих частинах їх праві частини згідно правил граматики
застосування (навіщо вони потрібні?) …
Завдання 2.7.
Звести наступну КВ-граматику до нормальної форми Хомського:
S bS | pCD
C aaD | CCD
D ε
Розв’язок.
Нетермінал S присутній в правих частинах продукцій, тому додаємо продукцію S0S, S0 – нова аксіома
Термінал b замінюємо на B, a замінюємо на А, p – на P, тобто вводимо нові нетермінали і замінюємо входження терміналів у правила на нові, щойно введені, нетермінали.
S BS | PCD
C AAD | CCD
D ε
Додаємо продукції A a, B b, P p
Всі продукції з правими частинами, довжина яких (l) більша за 2, «розкладаємо» на (l–1) продукції так, щоб у правих частинах було тільки по 2 нетермінальних символи, при цьому вводимо нові допоміжні нетермінали. Так, Q AA, W PC, E CC – нові правила, тоді:
вводимо також правила S WD, C QD, C ED
виключаємо правила S PCD, C AAD , C CCD
{Q, W, E} N – нові нетермінали
Отримали:
S BS | WD
C QD | ED
Q AA
W PC
E CC
D ε
A a, B b, P p
У нас є продукція D ε, тому позбуваємось -нетерміналу стандартним способом (виключення з правих частин), отримуючи:
виключається правило D ε,
додаються: S W, C Q, C E
Маємо продукції з одним нетерміналом у правій частині: S W, C Q, C E, тому проводимо відповідну «каскадну підстановку»:
S W, W PC,
C Q, Q AA,
C E, E CC, отже, отримуємо нові правила: S PC, C AA, C CC, а старі S W, C Q, C E – виключаються.
Оскільки в правилі S0 S права частина теж закоротка, підставимо для S0 всі альтернативи для S. В результаті отримаємо граматику у нормальній формі Хомського, еквівалентну початковій:
S0 BS | WD | PC
S BS | WD | PC
C QD | ED | AA | CC
Q AA
W PC
E CC
A a, B b, P p
Завдання 2.8.
Звести наступну КВ-граматику до нормальної форми Хомського:
S bC | aD
C bCC | aS | a
D aDD | bS | b
P aD
Розв’язок.
Відкинемо недосяжні і непродуктивні нетермінали.
Ітераційно побудуємо множини досяжних:
R0 = {S}
R1 = {C,D,S}
R2 = {C,D,S} = R1 = R
та продуктивних нетерміналів:
P0={C,D}
P1={C,D,S,P}
P2={C,D,S,P} = P1=P
Тоді недосяжні нетермінали: N\R = {P}, а непродуктивних – немає: N\P =
Тому правило P aD слід виключити з граматики і подальшого розгляду.
Нетермінал S присутній в правих частинах продукцій тому додаємо продукцію S0 S, S0 – нова аксіома граматики
Вводимо нові допоміжні нетермінали A та B, і в правилах b замінюємо на B, a замінюємо на А – отримуємо:
S BC | AD
C ACC | AS | A
D ADD | BS | B
Додаємо також продукції A a, B b
Вводимо допоміжні нетермінали для правил з довшими за 2 елементи правими частинами, а також відповідні правила для них: Q AC, W AD, C QC, D WD, виключаючи при цьому C ACC і D ADD ({Q, W} N)
Маємо продукції C A, A a, D B, B b, тому вводимо продукції C a, D b, натомість виключаємо C A, D B.
Отримуємо еквівалентну граматику у нормальній формі Хомського, підставивши у правило S0 S всі альтернативи для S:
S0 BC | AD
S BC | AD
C QC | AS | a
D WD | BS | b
Q AC
W AD
A a, B b
Завдання 2.9.
Звести наступну КВ-граматику до нормальної форми Хомського:
S aKd
K aKd | P | ε
P bPc | F | ε
Розв’язок.
Відкинемо недосяжні і непродуктивні нетермінали. F-непродуктивний.
Позбудемось ε–правил.
Замість K ε додаємо: K ad, S ad; замість P ε – додаємо P bc.
Отримаємо:
S aKd | ad
K aKd | ad | P
P bPc | bc
Замість правила K P (із закороткою правою частиною), враховуючи P bPc | bc, додамо нові правила: K bPc | bc
Вводимо допоміжні нетермінали та правила: A a, B b,D d,C c, отримуємо відповідно:
A a, B b,D d,C c
S AKD | AD
K AKD | AD | BC | BPC
P BPC | BC
Врешті, розбивши «довгі» праві частини правил шлязом введення допоміжних нетерміналів, отримаємо результуючу граматику у нормальній формі Хомського:
S XD | AD
K XD | AD | BC | YC
P YC | BC
A a, B b,D d,C c
X AK, Y BP
Завдання 2.10.
Звести наступну КВ-граматику до нормальної форми Хомського:
S aUbU | CCb |
U S | C | ba
Розв’язок.
Відкинемо недосяжні і непродуктивні нетермінали: C-непродуктивний.
Введемо нову аксіому S0, оскільки символ S присутній в правих частинах правил, при цьому позбудемось ε–правила S (S і U є ε–нетерміналами). Отримаємо:
S0 | S
S aUbU | ab | abU | aUb
U S | ba
Додамо допоміжні нетермінали і правила: Ta a, Tb b, отримаємо:
S0 | S
S TaUTbU | TaTb | TaUTb | TaTbU
U S | TbTa
Ta a, Tb b
Для довгих правих частин введемо допоміжні нетермінали, щоб розбити їх на частини:
S0 | S
S AB | TaTb | ATb | TaB
A TaU
B TbU
U S | TbTa
Ta a, Tb b
Закороткі правила U S та S0 S заміняємо всіма можливими замінами S:
S0 | AB| TaTb | ATb | TaB
S AB | TaTb | ATb | TaB
A TaU
B TbU
U AB | TaTb | ATb | TaB | TbTa
Ta a, Tb b
Таким чином отримаємо результуючу еквівалентну граматику у нормальній формі Хомського.
Завдання 2.11.
Звести наступну КВ-граматику до нормальної форми Хомського:
S aD | D
U bb | Cb
D | Db | Ua
L UD
Розв’язок.
Оскільки C – непродуктивний, а L – недосяжний нетермінали, вхідна граматика еквівалентна наступній:
S aD | D
U bb
D | Db | Ua
Оскільки граматика породжує, зокрема, порожнє слово, необхідно ввести нову аксіому S0 та правило S0 S | .
Введемо допоміжні нетермінали і правила: A a, B b, отримаємо:
S0 S | ԑ
S AD | D
U BB
D ԑ | DB | UA
A a, B b
Позбавляємось -правила D ԑ :
S0 S | ԑ
S AD | D | A
U BB
D DB | UA | B
A a, B b
Нарешті, для односимвольних правих частин робимо заміни: для S A і D B виконуємо заміни на відповідно термінали, а для S D – підставляємо всі альтернативи для нетермінала D:
S0 ԑ | AD | DB | UA | b | a
S AD | DB | UA | b | a
U BB
D DB | UA | b
A a, B b
Отримаємо результуючу еквівалентну граматику у нормальній формі Хомського.
Завдання 2.12.
Звести наступну КВ-граматику до нормальної форми Грейбах:
S AB
A ε | aC
B Bb | ε
C Cc | ε
Розв’язок.
Легко перевірити, що всі нетермінали суттєві, тобто досяжні й продуктивні: R0 = {S}, R1 = {S, A, B}, R2 = {S, A, B, C} = N; P0 = {A, B, C} P1 = {S, A, B, C} = N.
Позбудемось ε-переходів (ε-правил), для цього додамо правила, отримані шляхом підстановок ε-нетерміналів:
S B, S A, S ε, B b, C c, A a
та вилучимо ε-правила:
A ε, B ε, C ε
Отримаємо еквівалентну граматику:
S AB | A | B | ε
A aC | a
B Bb | b
C Cc | c
Позбудемось лівої рекурсії. Для цього правило
C Cc | c
замінемо сукупністю еквівалентних правил (ввівши новий нетермінал D):
C cD, D cD, D ε
Позбудемось отриманого ε-правила D ε:
додамо правила C c, D c
і одержимо: C cD | c, D cD | c
Аналогічно для B Bb | b :
B bF | b, F bF | b
В решті отримаємо:
S AB | A | B | ε
A aC | a
B bF | b, F bF | b
C cD | c, D cD | c
Для всіх правил, де у правій частині перший символ – нетермінал, робимо всі можливі для нього підстановки, а саме:
S a, S aC для S A
S b, S bF для S B
S aB, S aCB для S AB
вилучаючи при цьому самі такі правила, тобто:
S A, S B, S AB
Отримаємо еквівалентну даній граматику у нормальній формі Грейбах:
S aB | aCB | a | aC | b | bF | ε
A aC | a
B bF | b, F bF | b
C cD | c, D cD | c
Завдання 2.13.
Звести наступну КВ-граматику до нормальної форми Грейбах:
S aAC | BA
B Pk | ε
A a | aA
C c | cC
Розв’язок.
Знайдемо продуктивні нетермінали:
P0 = {A, B, C}
P1 = {S, A, B, C}
P2 = {S, A, B, C} = P1 = P
Отже, CP = {P} – непродуктивний нетермінал, тому виключаємо з граматики правило B Pk
Позбудемось ε-правила B ε, для цього додамо правило S A.
При цьому виключаємо продукції B ε та S BA, оскільки більше не залишається продукцій з нетерміналом B у лівій частині.
Отримаємо:
S aAC | A
A a | aA
C c | cC
У правилі S A заміняємо перший у правій частині нетермінал на всі можливі для нього альтернативи, тобто додаємо правила S a, S aA
В решті отримаємо еквівалентну граматику у нормальній формі Грейбах:
S aAC | a | aA
A a | aA
C c | cC
Завдання 2.14.
Звести наступну КВ-граматику до нормальної форми Грейбах:
S AS | ε
A aS | P | b
P Pc | b
Розв’язок.
Всі нетермінали граматики – суттєві, тобто досяжні і продуктивні.
Оскільки слово ε виводиться в граматиці, вводимо окрему нову аксіому, для якої будуть лише два правила, щоб відділити вивід слова ε від усіх інших можливих виводів у граматиці: S0 ε та S0 S. Також позбудемось ε-переходу S ε шляхом підстановки у інші правила, де S є у правих частинах, отримаємо:
S0 ε | S
S AS | A
A aS | P | b | a
P Pc | b
Позбудемось лівої рекурсії для нетермінала P, замінивши правила
P Pc | b
сукупністю правил
P bP1, P1 cP1, P1 ε
Далі позбудемось отриманого ε-правила P1 ε, для цього виконаємо можливі підстановки P1 і одержимо нові правила: P b та P1 c замість P1 ε, тобто в решті решт одержимо такі нові правила:
P bP1 | b
P1 cP1 | c
Отримаємо:
S0 ε | S
S AS | A
A aS | P | b | a
P bP1 | b
P1 cP1 | c
Підставляємо замість нетермінала P на першому місці правих частин правил слова, що безпосередньо вивдяться з P:
S0 ε | S
S AS | A
A aS | bP1 | b | a
P bP1 | b
P1 cP1 | c
аналогічно – для нетермінала A:
S0 ε | S
S aSS | bP1S | bS | aS | bP1 | b | a
A aS | bP1 | b | a
P bP1 | b
P1 cP1 | c
Оскільки нетермінали A та P стали в результаті перетворень недосяжними, виключимо їх з правил граматики – отримаємо граматику, еквівалентну початковій, у нормальній формі Грейбах:
S0 ε | aSS | bP1S | bS | aS | bP1 | b | a
S aSS | bP1S | bS | aS | bP1 | b | a
P1 cP1 | c
Завдання 2.15.
Звести наступну КВ-граматику до нормальної форми Грейбах:
S A | bD
D Ԑ | aa | CD
A u | ε | C
K Bf
Розв’язок.
Знайдемо недосяжні і непродуктивні нетермінали.
R0 = {S}
R1 = {S, A, D}
R2 = {S, A, D, C}
R3 = {S, A, D, C} = R2 = R
Отже, недосяжні нетермінали N\R = {K}, тобто нетермінал K виключаэмо з правил граматики. Щодо продуктивних нетерміналів:
P0 = {D, A}
P1 = {S, D, A}
P2 = {S, D, A} = P1 = P
Отже, непродуктивні нетермінали – N\P = {C} , тому виключаємо нетермінал C з граматикики також, залишиться:
S A | bD
D ε | aa
A u | ε
Оскільки нетермінал A – на першій позиції в правій частині правила S A, замінимо його можливими підстановками: A u | ε, отримаємо:
S u | ԑ | bD
D ε | aa
A u | ε
Тепер нетермінал A став недосяжним, отже, виключаємо його з граматики і отрумуємо:
S u | ԑ | bD
D ε | aa
Позбудемось ε-продукцій, замінивши входження ε-нетерміналів (S та D) у всіх правилах, а також ввівши нову аксіому S0 (для збереження можливості породження слова ε):
S0 S | ԑ
S u | bD | b
D aa
Отже, отримаємо еквівалентну початуовій граматику у нормальній формі Грейбах:
S0 ԑ | u | bD | b
S u | bD | b
D aa
Завдання 2.16.
Звести наступну КВ-граматику до нормальної форми Грейбах:
S c | aABU | cC
A Aa | bU | ԑ
B aa | Cc
U bA | BB | ԑ
M AB
Розв’язок.
Легко визначити, що C – непродуктивний, М – недосяжний нетермінали, тому виключимо їх з правил граматики:
S c | aABU
A Aa | bU | ԑ
B aa
U bA | BB | ԑ
Виключимо ԑ-переходи (A ԑ та U ԑ) з граматики, отримаємо:
S c | aABU | aBU | aAB | aB
A Aa | bU | b | a
B aa
U bA | BB | b
Позбавимось лівої рекурсії для нетермінала A:
S c | aABU | aBU | aAB | aB
A bUW | bW | aW
W aW | ԑ
B aa
U bA | BB | b
Залишилось позбутись ԑ-переходу W ԑ та першого входження нетерміналу B у правилі U BB (шляхом підстановки можливих виведень згідно продукцій граматики):
S c | aABU | aBU | aAB | aB
A bUW | bW | aW | bU | b | a
W aW | a
B aa
U bA | aaB | b
і ми отримали граматику у нормальній формі Грейбах, яка еквівалентна початковій.