
- •2.3 Розвиток основних понять програмування 53
- •1. Формалізація простої мови програмування
- •1.1 Неформальний опис простої мови програмування
- •1.2 Формальний опис синтаксису мови sipl
- •Малюнок 1.1. Дерево синтаксичного виводу програми gcd
- •1.3 Формальний опис семантики мови sipl
- •Малюнок 1.3. Алгебра даних мови sipl
- •1.3.2 Функції
- •1.3.3 Композиції
- •1.3.4 Програмні алгебри
- •Малюнок 1.4. Алгебра функцій (програмна алгебра)
- •1.3.5 Визначення семантичних термів
- •1.3.6 Побудова семантичного терму програми
- •1.3.7 Обчислення значень семантичних термів
- •1.3.8 Загальна схема формалізації мови sipl
- •Малюнок 1.5 Схема визначення композиційної семантики
- •1.4 Властивості програмної алгебри
- •2. Розвиток основних понять програмування
- •2.1 Аналіз словникових визначень поняття програми
- •2.2 Розвиток поняття програми з гносеологічної точки зору
- •2.3 Розвиток основних понять програмування
- •2.3.1 Початкова тріада понять програмування
- •Малюнок 2.2. Сфера інформатизації як особлива сфера суспільства
- •Малюнок 2.3. Тріада цільового призначення програм
- •2.3.2 Тріада прагматичності програм
- •Малюнок 2.4. Тріада прагматичності програм
- •2.3.3 Тріада основних понять програмування
- •Малюнок 2.5. Тріада основних понять програмування
- •2.3.4 Пентада основних понять програмування
- •Малюнок 2.6. Пентада основних понять програмування
- •2.4 Розвиток основних програмних понять
- •2.4.1 Тріада основних програмних понять
- •Малюнок 2.7. Програма як діалектичне заперечення проблеми
- •2.4.2 Пентада основних програмних понять
- •2.5 Сутнісні та семіотичні аспекти програм
- •2.6 Програми і мови
- •2.7 Пентада програмних понять процесного типу
- •3. Формалізація програмних понять
- •3.1 Теоретико-функціональна формалізація
- •3.2 Класи функцій
- •3.3 Програмні системи
- •3.4 Рівні конкретизації програмних систем
- •4. Синтактика: формальні мови та граматики
- •4.1 Розвиток понять формальної мови та породжучої граматики
- •4.2 Визначення основних понять формальних мов
- •4.3 Операції над формальними мовами
- •4.3 Породжуючі граматики
- •4.5 Ієрархія граматик Хомського
- •4.6 Автоматні формалізми сприйняття мов
- •4.6.1 Машини Тьюрінга
- •4.6.2 Еквівалентність машин Тьюрінга та породжуючих граматик
- •4.6.3 Лінійно-обмежені автомати
- •4.6.4 Магазинні автомати
- •4.6.5 Скінченні автомати
- •4.7 Методи подання синтаксису мов програмування
- •4.7.1 Нормальні форми Бекуса–Наура
- •4.7.2 Модифіковані нормальні форми Бекуса–Наура
- •4.7.3 Синтаксичні діаграми
- •4.8 Властивості контекстно-вільних граматик
- •4.8.1 Видалення несуттєвих символів
- •4.8.2 Видалення -правил
- •4.8.3 Нормальна форма Хомського
- •4.8.4 Нормальна форма Грейбах
- •4.8.5 Рекурсивні нетермінали
- •4.9 Властивості контекстно-вільних мов
- •4.10 Операції над формальними мовами
- •4.11 Дерева виводу
- •4.12 Однозначні та неоднозначні граматики
- •4.13 Розв’язні та нерозв’язні проблеми кв-граматик та мов
- •4.14 Рівняння в алгебрах формальних мов
- •5. Теорія рекурсії (теорія найменшої нерухомої точки)
- •5.1 Рекурсивні визначення та рекурсивні рівняння
- •5.2 Частково впорядковані множини, границі ланцюгів та -області
- •5.3 Неперервні відображення
- •5.4 Теореми про нерухомі точки
- •5.5 Конструювання похідних -областей
- •5.6 Властивості оператора найменшої нерухомої точки
- •5.7 Застосування теорії ннт
- •5.7.1 Уточнення синтаксису мов програмування
- •5.7.2 Семантика мов програмування
- •5.7.3 Рекурсивні розширення мови sipl
4.5 Ієрархія граматик Хомського
Дослідження будь-якого класу предметів, як правило, починається з їх класифікації. Це методологічне зауваження стосується і граматик. Однією з перших була класифікація, запропонована Н. Хомським. Суть цієї класифікації полягає в поступових обмеженнях, що накладаються на праві та ліві частини продукцій. Визначені Хомським чотири типи граматик виявились інваріантними відносно різних уточнень породжуючих граматик. Крім того, цим типам граматик природнім чином відповідають типи автоматів, що розпізнають (сприймають) формальні мови.
Визначення 4.20
-
Граматиками типу 0 називають довільні породжуючі граматики загального виду, що не мають жодних обмежень на правила виводу.
-
Граматиками типу 1 (нескорочуючими граматиками) називають породжуючі граматики, кожне правило яких має вигляд α→β, де |α||β| (α(NT)*N(NT)*, β(NT)+).
-
Граматиками типу 2 (контекстно-вільними граматиками, КВ-граматиками) називають породжуючі граматики, кожне правило яких має вигляд A→β, де AN, β(NT)*.
-
Граматиками типу 3 (праволінійними граматиками) називають породжуючі граматики, кожне правило яких має вигляд A®αB або A®α, де A, BÎN, αÎTÈ{}. До граматик типу 3 відносять і ліволінійні граматики, кожне правило яких має вигляд A®Bα або A®α, де A, BÎN, αÎTÈ{}.
Приклад 4.12 Граматика G3 з попереднього підрозділу є граматикою типу 0. Якщо з цієї граматики видалити правило P2, вона стане граматикою типу 1, бо не буде скорочуючих правил. Граматика з правилами {S®AR, R®bRc, R®, A®aA, A®} є конктекстно вільною граматикою (типу 2), а її підграматика {A®aA, A®} є праволінійною граматикою (типу 3).
Кожному типу граматик відповідають мови, яким будемо приписувати той же тип, що має граматика, яка її породжує.
Малюнок 4.3. Співвідношення типів граматик
Малюнок 4.3 демонструє співвідношення типів граматик. Як бачимо, граматики типів 2 та 3 не є підкласами граматик типу 1. Це викликано тим, що наведені класи граматик мають скорочуючі правила виду A®, які заборонені в граматиках типу 1. Як буде показано далі, ці відмінності не дуже позначаються на класах мов, породжуваних граматиками типів 2 та 3, і якщо ігнорувати порожній ланцюжок, то класи мов типів 3 та 2 будуть підкласами мов типу 1.
Перш ніж переходити до вивчення класів мов, покажемо, що без втрати виразної сили можна розглядати більш обмежений клас граматик, які називаються загально-конктестними граматиками. Цей клас видається більш природним для породження, ніж загальні породжуючі граматики.
Визначення 4.21
-
Загально-контекстними називають породжуючі граматики, кожне правило яких має вигляд 1A2→1β2, де AN, 1, 2, β(NT)*. Ланцюжки 1 і 2 називають лівим та правим контекстом символу A у вказаному правилі.
-
Контекстно-залежними називаються загально-конктестні граматики з нескорочуючими правилами, тобто правила мають вид 1A2→1β2 , де β(NT)+ (це означає, що|β|1).
Контекстно-залежні граматики інколи називають граматиками безпосередньо складових (БС-граматиками). Ця назва пояснюється тим, що граматики цього класу співставляють породжуваним ними ланцюжкам системи (безпосередньо) складових, бо породження іде з одного нетерміналу, а конктекст при застосуванні правила не змінюється.
Слід сказати, що назва контекстно-залежних граматик не зовсім вдала, бо не підкреслює нескорочуваність правил граматики, а характеризує скоріш довільний клас конктекстних граматик. Це ж стосується і назви граматик безпосередньо складових.
Граматики типів 2 та 3 (будучи безконтекстними) безпосередньо є підкласами загально-контекстних граматик.
З визначень видно, що класи загально-контекстних та контекстно-залежних граматик є власними підкласами відповідно граматик типів 0 та 1. Разом з тим, відповідні класи мов співпадають, тобто використання лише конктекстних правил не обмежує породжувальну здатність граматик.
Доведемо цей факт співпадіння мов.
Нехай G0=(N, T, P, S) – довільна породжуюча граматика типу 0. Побудуємо еквівалентну їй загально-контекстну граматику. Алгоритм побудови наступний.
-
Виділяємо термінальні символи, які входять до неконтекстних правил та вводимо нетермінали, які дублюють такі термінальні символи, тобто вводимо нові нетермінали Na для кожного такого термінального символу aÎT.
-
Далі всі неконтекстні правила з P замінюємо на нові правила, в котрих замість термінальних символів стоять їх нетермінальні дублери. Добавляємо нові правила Naa. Очевидно, що отримана граматика G еквівалентна початковій.
-
Побудуємо граматику G, яка буде контекстною та еквівалентною G. Спочатку пронумеруємо усі неконтекстні правила граматики G (контекстні не змінюємо). Розглянемо неконтекстне правило G з номером k виду , де = A1A2…An-1An, n>1. Це правило замінимо на наступну множину нових правил:
A1A2…An-1An NklA2…An-1An
NklA2…An-1An NklA2…An-1Nkr
NklA2…An-1 Nkr NklA3…An-1Nkr
NklA3…An-1 Nkr NklA4…An-1Nkr
… … …
NklAn-1Nkr NklNkr
NklNkr NkpNkr
NkpNkr Nkp
Nkp.
(Коментар. Ідея побудови наведених правил полягає у наступному: спочатку виставляємо лівий Nkl та правий маркери Nkr вибраного правила, далі видаляємо всі інші символи лівої частини продукції, потім переходимо до породження правої частини, але перед цим вносимо про це інформацію за допомогою Nkp. Наприкінці породжуємо в контексті Nkp праву частину продукції, а сам символ Nkp видаляємо.)
Можна довести, що вказана послідовність правил еквівалентна одному початковому правилу. Дійсно, ця послідовність індукує (майже детерміновано) однозначний вивід. Тільки правило Nkp порушує однозначність. Але якщо його застосувати до правила NkpNkrNkp, то не буде можливості позбавитись нетермінала Nkr. Тому справедлива наступна теорема.
Теорема 4.2 Для довільної породжуючої граматики G0 існує граматика GC у загально-контекстній формі, яка породжує ту саму мову, тобто L(G0)=L(GC).
Визначення 4.22 Довільні граматики G1 та G2 називаються еквівалентними, якщо вони породжують одну й ту саму мову, тобто G1 G2 L(G1)=L(G2).
Цілком очевидно, що так введенне відношення є відношенням еквівалентності (рефлексивним, симетричним та транзитивним відношенням).
Приклад 4.13 Побудуємо за граматикою G3, що породжує мову L(G3)={anbncn|n0} еквівалентну їх загально-контекстну граматику G3C.
Граматика G3 має наступні правила:
P1: S aBSc
P2: S
P3: Ba aB
P4: Bb bB
P5: Bc bc
З них неконтекстними є правила P3 та P4. Спочатку перетворемо правило BaaB (правило P3) в послідовність контекстних правил. Отримуємо:
BaaB замінуємо на BAaAaB, Aaa.
Далі замість BAaAaB вводимо послідовність правил
BAaN31Aa
N31Aa N31N3r
N31N3rN3pN3r
N3pN3rN3pAaB
N3p
Аналогічно поступаємо з правилом P4: Bb bB. Після цих перетворень отримуємо нову граматику G3C, в якій пронумеруємо нові правила:
P1: S AaBSc,
P2: S
P31: Aaa
P32: BAaN3lAa
P33: N3lAa N3lN3r
P34: N3lN3rN3pN3r
P35: N3pN3rN3pAaB
P36: N3p
P41: Bb b
P42: BBbN4lBb
P43: N4lBb N4lN4r
P44: N4lN4rN4pN4r
P45: N4pN4rN4pBbB
P46: N4p
P5: Bc Bbc
Побудуємо декілька виводів в цій граматиці, тобто, говорячи в термінах програмування, зробимо «тестування» побудованої граматики.
Очевидно,
що S
та S
AaBSc
AaBc
AaBbc
aBbc
abc.
Побудуємо вивід ланцюжка a2b2c2.
Маємо,
S
AaBSc
AaBAaBScc
AaBAaBcc
AaBAaBbcc
Aa
N3lAaBbcc
Aa
N3lN3rBbcc
Aa
N3pN3rBbcc
Aa N3p AaBBbcc
AaAaBBbcc
AaAaN4lBbcc
AaAaN4lN4rcc
AaAaN4pN4rcc
AaAaN4pBbBcc
AaAaBbBcc
AaAaBbBbcc
AaAaBbbcc
AaAabbcc
Aaabbcc
aabbcc.
Еквівалентність нескорочуючих та контекстно-залежних граматик доводиться аналогічним чином.
Це дозволяє нам говорити про те, що різні варіанти визначень граматик (породжуючі та конктекстні) є еквівалентними, і що ієрархія Хомского досить стабільна відносно варіантів граматик.
Перейдемо до дослідження зв’язків класів породжуючих граматик з класами формалізмів розпізнання (сприйняття), в першу чергу, с класами автоматів різного типу.