
- •М. С. Нікітченко теорія програмування Частина 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.2. Видалення -правил
Визначення 4.35. Назвемо КВ-граматику G=(N, T, P, S) граматикою без -правил (або нескорочуваною), якщо Р не містить -правил, тобто правил виду A →.
Лема 4.6 За кожною КВ-граматикою можна побудувати еквівалентну їй (з точністю до порожнього ланцюжка – -еквівалентну) граматику без -правил.
Доведення. Нехай дана КВ-граматика G=(N, T, P, S), що породжує мову L(G). Проведемо серію перетворень множини P. Якщо множина P містить правила B→Aβ і A→ для деяких A, BN, , β(NT)*, то додамо правило B→β в P. Повторюємо цю процедуру поки множина правил не стабілізується. Далі виключимо із множини P всі правила вигляду A→.
Наведений алгоритм можна уточнити за допомогою наступних індуктивних визначень.
P0=P
P i={B→β є правила B→AβР, A→Pi-1} R i-1 (i=1,2, …).
Оскільки множина правил є скінченною, а праві частини нових правил коротші, то формула для визначення Pi задає монотонне за і відображення. Тому існує k (k0), що Pk=Pk+1. Інакше кажучи, послідовність P0, P1, P2, … стабілізується на k-му кроці. Покладемо P=Pk\{A→Pk} .
Одержана граматика G=(N, T, P, S) породжує мову L(G)\ {}.
Дійсно, кожен вивід у граматиці G, який не породжує порожнє слово, може бути промодельований у граматиці G, що легко доводиться індукцією по довжині виводу. Так само можна промоделювати виводи в G виводами в G, використовуючи замість модифікованих правил виду B→β початкові правила виду B→Aβ з подальшим виводом порожнього ланцюжка з A. ▄
Приклад 4.20. Розглянемо граматику G з правилами
S→aSb
S→bSa
S→
Застосувавши до цієї граматики описаний метод видалення -правил, отримаємо граматику G з правилами
S→aSb
S→bSa
S→ab
S→ba,
яка еквівалентна з точністю до порожнього ланцюжка граматиці G.
4.9.3. Нормальна форма Хомського
Визначення 4.36. Назвемо КВ-граматику G=(N, T, P, S) граматикою у нормальній формі Хомського, якщо її правила мають вигляд S→, A→a, A→BC для деяких A, B, CN, aT.
Лема 4.7. За кожною КВ-граматикою можна побудувати еквівалентну їй граматику у нормальній формі Хомського.
Доведення. Нехай дана КВ-граматика G=(N, T, P, S). Проведемо ряд перетворень цієї граматики так, що породжувана нею мова залишиться незмінною. Спочатку побудуємо еквівалентну граматику G=(N, T, P, S) без -правил.
Далі замінимо у всіх правилах кожен термінальний символ a на новий нетермінальний символ N(a) і додамо до множини P правила N(a)→a для всіх aT.
Видалимо правила вигляду A→A1A2…An, де n>2, замінюючи його на наступний ряд нових правил A→A1N(A2…An), N(A2…An)→ A2N(A3…An), …, N(An-1…An)→ An-1An (при цьому додаються нові нетермінальні символи N(A2…An), N(A3…An), …, N(An-1…An)).
Якщо
для деяких
і (NT)*
множина
містить правила A→B,
B→,
але не містить правила A→,
то додамо це правило в
P.
Повторюємо цю процедуру, доки можливо.
Після цього видалимо із множини P
всі правила вигляду A→B.
Нарешті, змінимо S на S, та додамо правила S→, S →S в тому випадку, коли мова L(G) містить порожній ланцюжок.
Приклад 4.21. Граматика S→, S→abSc еквівалентна наступній граматиці в нормальній формі Хомського: S→, S→AB, B→CD, D→SE, C→b, A→a, E→c.