- •М. С. Нікітченко теорія програмування Частина 1
- •1. Формалізація простої мови програмування
- •1.1. Неформальний опис простої мови програмування
- •1.2. Формальний опис синтаксису мови sipl
- •1.3. Формальний опис семантики мови sipl
- •1.3.2. Функції
- •1.3.3. Композиції
- •1.3.4. Програмні алгебри
- •1.3.5. Визначення семантичних термів
- •1.3.6. Побудова семантичного терму програми
- •1.3.7. Обчислення значень семантичних термів
- •1.3.8. Загальна схема формалізації мови sipl
- •1.4. Властивості програмної алгебри
- •2. Розвиток основних понять програмування
- •2.1. Аналіз словникових визначень поняття програми
- •2.2. Розвиток поняття програми з гносеологічної точки зору
- •2.3. Розвиток основних понять програмування
- •2.3.1 Початкова тріада понять програмування
- •2.3.2. Тріада прагматичності програм
- •2.3.3. Тріада основних понять програмування
- •2.3.4. Пентада основних понять програмування
- •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.4. Породжуючі граматики
- •4.5. Приклад породжуючої граматики та її властивості
- •4.6. Ієрархія граматик Хомського
- •4.7. Автоматні формалізми сприйняття мов
- •4.7.1. Машини Тьюрінга
- •4.7.2. Еквівалентність машин Тьюрінга та породжуючих граматик
- •4.7.3. Лінійно-обмежені автомати
- •4.7.4. Магазинні автомати
- •4.7.5. Скінченні автомати
- •4.8. Методи подання синтаксису мов програмування
- •4.8.1. Нормальні форми Бекуса–Наура
- •4.8.2. Модифіковані нормальні форми Бекуса–Наура
- •4.8.3. Синтаксичні діаграми
- •4.9. Властивості контекстно-вільних граматик
- •4.9.1. Видалення несуттєвих символів
- •4.9.2. Видалення -правил
- •4.9.3. Нормальна форма Хомського
- •4.9.4. Нормальна форма Грейбах
- •4.9.5. Рекурсивні нетермінали
- •4.10. Властивості контекстно-вільних мов
- •4.11. Операції над формальними мовами
- •4.12. Дерева виводу
- •4.13. Однозначні та неоднозначні граматики
- •4.14. Розв’язні та нерозв’язні проблеми кв-граматик та мов
- •4.15. Рівняння в алгебрах формальних мов
- •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.9.4. Нормальна форма Грейбах
Визначення 4.37. КВ-граматику G=(N, T, P, S) будемо називати граматикою в нормальній формі Грейбах, якщо її правила мають вигляд A→a (aT, (NT)*), тобто кожне правило починається з термінального символу.
Сформулюємо без доведення наступне твердження.
Лема 4.8 За кожною КВ-граматикою можна побудувати -еквівалентну їй (з точністю до порожнього ланцюжка) граматику у нормальній формі Грейбах.
Зауважимо, що наявність нормальної форми Грейбах дозволяє досить легко за кожною граматикою побудувати еквівалентний їй недетермінований магазинний автомат. Також у таких граматиках довжина виводу термінального ланцюжка не перевищує його довжину.
Приклад 4.22. Граматика S→, S→abSc еквівалентна наступній граматиці в нормальній формі Грейбах: S→abc, S→abSc.
4.9.5. Рекурсивні нетермінали
Визначення 4.38. Нетермінал А N КВ-граматики назвемо рекурсивним (самовставним, циклічним), якщо існує вивід виду А*А. Якщо такого виводу немає, то нетермінал називають нерекурсивним.
Лема 4.9. Якщо КВ-граматика G не має рекурсивних нетерміналів, то мова L(G) скінченна.
Дійсно, в цьому випадку може бути лише скінченна кількість виводів, тому породжується лише скінченна мова.
Зауважимо, що зворотне твердження не є справедливим для довільної граматики, бо може бути рекурсивний нетермінал, що породжує скінченну мову. Це можливо для рекурсивного нетерміналу, коли є вивід А*А, але завжди з та породжуються порожні ланцюжки: * та *. Крім того, рекурсивні недосяжні або непродуктивні рекурсивні нетермінали не впливають на породжувану мову.
Приклад 4.23. Розглянемо граматику, множина Р якої складається з наступних правил виведення:
S→AB
A→C
A→a
B→b
C→A
Мова, породжена цією граматикою, складається з єдиного ланцюжка ab. Але нетермінали A та C є рекурсивними.
Отже, наведена лема дозволяє сформулювати необхідну умову породження КВ-граматикою нескінченних мов: нескінченна мова може породжуватися лише граматикою з рекурсивними нетерміналами. Але ця умова, як показує приклад, не є достатньою.
Для нескінченних мов має місце наступне твердження.
Лема 4.10. Нехай граматика G=(N, T, P, S) породжує нескінченну мову. Тоді існує суттєвий рекурсивний нетермінал A такий, що має місце А*t1Аt2, де t1,t2T* та |t1t2|1.
Ця лема буде використовуватись для доведення властивостей КВ-мов.
4.10. Властивості контекстно-вільних мов
У цьому розділі розглянемо властивості КВ-мов, тобто структуру їх ланцюжків, виразну потужність КВ-мов та їх замкненість відносно операцій над формальними мовами.
Спочатку сформулюємо для КВ-мов аналог твердження (Лема 4.10), яке характеризувало властивості КВ-граматик.
Лема 4.11 (лема про розростання, лема про накачку). Нехай – КВ-мова над алфавітом T. Тоді знайдеться таке натуральне число k, що для довільного ланцюжка tL довжини не менше k знайдуться ланцюжки u, v, t1, t2, x T*, для яких вірно ut1xt2v=t, |t1t2|1, |t1xt2|k та ut1ix t2ivL для всіх i=0,1,….
Ідея доведення полягає в тому, що для породження мови L розглядається граматика у нормальній формі Хомського (нескорочуюча граматика). Тоді для достатньо довгих виводів можна виділити рекурсивний нетермінал A такий, що має місце А*t1Аt2, де t1,t2T* та |t1t2|1 (дивись попередню лему). Звідси і буде випливати твердження леми.