- •М. С. Нікітченко теорія програмування Частина 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.2 (про перейменування нетерміналів). Нехай задані граматика G=(N, T, P, S) та бієктивне відображення : N N множини нетерміналів N на деяку іншу множину нетерміналів N (N T=). Тоді для граматики G =(N , T, S , P ), де P – множина правил, отриманих з P заміною нетерміналів N на відповідні нетермінали з N , а S =(S), маємо: L(G)= L(G ).
Для доведення леми слід скористатися тією обставиною, що кожний вивід в одній граматиці має відповідний вивід (шляхом перейменування нетерміналів) в іншій граматиці.
Зрозуміло, що умова бієктивності є суттєвою.
4.9.1. Видалення несуттєвих символів
Продовжимо розгляд очевидних, але важливих перетворень. У деяких випадках КВ-граматика може містити символи та правила, що не вживаються для виводу термінальних ланцюжків.
Приклад 4.18. У граматиці G=({S, A, B}, {a, b, c}, P, S), де P={S→a, S→cS, A→b}, нетермінал A і термінал b не можуть з’явитися в жодному ланцюжку виведення (в жодній словоформі). Таким чином, ці символи не приймають участь у породженні ланцюжків мови L(G) і правила, що їх містять, можна видалити, не змінивши мови L(G).
Визначення 4.31. Нетермінал ANТ назвемо недосяжним у граматиці G=(N, Т, P, S), якщо A не з’являється в жодному вивідному ланцюжку, тобто не існує виводу виду S G* A, , (NT)*.
Для знаходження недосяжних нетерміналів спочатку визначимо множину досяжних нетерміналів. Ця множина для заданої КВ-граматики G=(N, T, P, S) легко визначається за допомогою наступних індуктивних визначень.
R0={S}.
R i={B є правило A→BβР, що AR i-1, BN} R i-1 (i=1,2, …).
Оскільки множина N є скінченною, а формула для визначення Ri задає монотонне за і відображення, то існує k (k0), що Rk=Rk+1. Інакше кажучи, послідовність R0, R1, R2, … стабілізується на k-му кроці. Покладемо R=Rk.
Множина UR недосяжних нетерміналів задається формулою UR= N\R.
За граматикою G=(N, T, P, S) будуємо граматику G=(N, T, P, S) таким чином:
N= NR
T= T
S=S
P= { A→Р | (RT)*}
Очевидною є наступна лема.
Лема 4.3. Для граматики G'=(N', T', P', S') виконуються наступні властивості:
L(G')=L(G) (еквівалентність).
Для всіх AN' існують такі ланцюжки та β із (N'T)*, що S *G'Aβ (всі нетермінали є досяжними).
Визначення 4.32. Нетермінал AN назвемо непродуктивним в граматиці G=(N, Т, P, S), якщо з A не можна вивести жодного термінального ланцюжка, тобто не існує виводу виду A*Gt, tT*.
Спочатку визначимо множину продуктивних нетерміналів. Множина продуктивних нетерміналів для заданої КВ-граматики G=(N, T, P, S) легко визначається за допомогою наступних індуктивних визначень.
Pr0={ A є правило A→tР, що tT*}.
Pri={ A є правило A→Р, що (R i-1Т)*} R i-1 (i=1,2, …).
Оскільки множина N є скінченною, а формула для визначення Pri задає монотонне за і відображення, то існує k (k0), що Prk=Prk+1. Інакше кажучи, послідовність Pr0, Pr1, Pr2, … стабілізується на k-му кроці. Покладемо Pr=Prk.
Множина UPr непродуктивних нетерміналів задається формулою: UPr= N\Pr.
За граматикою G=(N, T, P, S) будуємо граматику G=(N, T, P, S) таким чином:
N= (NPr){S}
T= T
S=S
P= { A→Р | (PrT)*}
Очевидною є наступна лема.
Лема 4.4. Для граматики G'=(N', T', P', S') виконуються наступні властивості:
L(G')=L(G) (еквівалентність).
Для всіх AN'\{S} існують термінальні ланцюжки, що виводяться з A.
Відзначимо, що аксіома S є спеціальним випадком, тому що вона може бути непродуктивною, і разом з тим вона має належати множині нетермінальних символів (за визначенням породжуючих граматик), але в такому випадку множина правил буде порожньою.
До речі, наведений метод побудови множини продуктивних нетерміналів дозволяє дати відповідь на питання, чи є порожньою мова, що породжується граматикою G=(N, T, P, S)?
Відповідь проста: якщо аксіома є продуктивним нетерміналом, то мова непорожня, якщо ж аксіома – непродуктивний нетермінал, то мова – порожня.
Визначення 4.33. Символ ХNТ назвемо несуттєвим у КВ-граматиці G=(N, Т, P, S), якщо в ній немає виводу виду S*wXy*wxy, де w, x, y належать Т*.
З наведеного визначення бачимо, що нетермінал Х – несуттєвий, якщо Х є недосяжним або непродуктивним нетерміналом (крім, можливо, аксіоми). Термінальний символ Х є несуттєвим, коли немає жодного породжуваного ланцюжка, що містить Х.
Визначення 4.34. Граматика G=(N, T, P, S) називається зведеною, якщо в ній немає несуттєвих символів (можливо, крім аксіоми S).
Для побудови зведеної граматики спочатку видаляємо недосяжні та непродуктивні нетермінали. Потім з множини термінальних символів видаляємо несуттєві символи. Такі термінальні символи не містяться в правих частинах отриманих правил. Отримана граматика буде зведеною.
Лема 4.5. За кожною КВ-граматикою можна побудувати еквівалентну їй зведену граматики, що не містить несуттєвих символів.
Приклад 4.19. Розглянемо граматику G=({S, A, B, C}, {a, b, c}, P, S), де Р складається з правил:
S→a
S→ A
A→AB
B→b
C→c
Спочатку видаляємо недосяжні нетермінали. Отримаємо R={S, A, B}. Недосяжним є C. З граматики треба видалити вказаний символ та останнє правило. Далі визначаємо множину продуктивних нетерміналів. Знаходимо, що Pr={S, B}. Непродуктивним є A. Після видалення відповідних правил нетермінал B стає недосяжним. Видаляємо і його. Залишається одне правило S→a. Тому суттєвим термінальним символом є лише a. Видаляємо несуттєві термінальні символи. Отримуємо наступну зведену граматику: G'=({S}, {a}, { S→a}, S).