- •М. С. Нікітченко теорія програмування Частина 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.12. Дерева виводу
Визначення 4.39. Нехай G = (N, Т, Р, S) – контекстно-вільна граматика і S Gα1 Gα2 G... Gαn – вивід у G. Будемо називати цей вивід лівостороннім, якщо для кожного i, 0 i<n, можемо записати αi у вигляді wiAiβi, αі+1 – wiγiβi, де Ai→γi Р, wi T* і Ai N. Змістовно вивід є лівостороннім, якщо на кожному кроці заміняється найлівіший нетермінал.
Очевидним є наступне твердження.
Лема 4.20. Нехай G = (N, Т, Р, S) – контекстно-вільна граматика. Якщо w L(G), то існує лівосторонній вивід w в G.
Визначення 4.40. Для контекстно-вільних граматик кожному виводу вигляду S Gα1 Gα2 G... Gαn можна співставити скінченне впорядковане дерево, яке має назву дерева виводу. Вершини дерева відмічені символами алфавіту NТ. Корінь дерева відмічено початковим символом S. Якщо у виводі було застосовано правило S→α, то кожному символу ланцюжка α, на який замінюється символ S на першому кроці виводу, ставиться у відповідність вершина дерева, і до неї проводиться дуга із кореня. Отримані таким чином безпосередні нащадки кореня впорядковані відповідно до їх порядку у ланцюжку α. Для тих із одержаних вершин, що відмічені символами з множини N, робиться аналогічна побудова і т.ін. Кроною дерева виводу називається слово, отримане із термінальних символів, записаних на вершинах при їх обході зліва-направо.
Приклад 4.25. Візьмемо наступну граматику для мови L=L1L2, де L1={anbmcm | n,m0} та L2={anbncm | n,m0}:
SAB | CD |
A| aA
B| bBc
C| aCb
D| cD
Виводу
SABAbBcaAbBcaAbbBccaAbbbBcccabbbBcccabbbccc
відповідає наступне дерево виводу:
Неважко довести таку лему.
Лема 4.21. Нехай G = (N, Т, Р, S) – контекстно-вільна граматика і w L(G). Тоді існує взаємно-однозначна відповідність між лівосторонніми виведеннями слова w в граматиці G і деревами виводу в граматиці G, кроною яких є w.
Дерево виводу фактично задає клас еквівалентності виводів, які розрізняються лише порядком застосування правил. Тому для задач, для яких порядок застосувань не є важливим, доцільно спиратися на дерева виводу. Крім того, дерева виводу фактично задають структурну організацію ланцюжка, яка є важливою в різних застосуваннях граматик, зокрема, і в семантиці.
4.13. Однозначні та неоднозначні граматики
Визначення 4.41. КВ-граматика називається неоднозначною, якщо існує ланцюжок, котрий має два або більше різних лівосторонніх виводів. Інакше КВ-граматика називається однозначною.
Приклад 4.26. КВ-граматика із прикладу 4.25 неоднозначна. Слово aabbcc має два різних лівосторонніх вивода:
SABaABaaABaaBaabBcaabbBccaabbcc
та
SCDaCbDaaCbbDaabbDaabdDcaabbDccaabbcc
Також неоднозначною є граматика (БНФ) мови SIPL, наведена в першому розділі.
Приклад 4.2. Мова Діка – це мова, що породжена граматикою Gk = ({S} , T , P , S), де k>0, T = {α1, α2,…, αk, b1, b2,…, bk}, а Р складається з продукцій S→SS , S→ε , S→αiSbi, 1 i k. Нехай Lk=L(Gk). Зрозуміло, що мова Діка є контекстно-вільною мовою. Можна вважати, що мова Діка – це множина усіх ланцюжків урівноважених дужок k різних типів, де ai та bi – це ліва та права дужки для кожного і. Мова Діка є важливою в теорії контекстно-вільних граматик. Вона, зокрема, утворює основу довільної контекстно-вільної мови, тому що будь-яка КВ-мова є гомоморфним образом мови Діка. Наведена граматика не є однозначною. Але наступна граматика , – однозначна.
Визначення 4.42. КВ-мова називається суттєво неоднозначною, якщо кожна КВ-граматика, яка породжує цю мову, є неоднозначною.
Приклад 4.28. КВ-мова L=L1L2 з прикладу 4.25, де L1={anbmcm | n,m0} та L2={anbncm | n,m0} є суттєво неоднозначною. Доведення цього факту наводиться в книзі [1], стор. 234-236.
Неоднозначність є важливим поняттям теорії мов. Якщо граматика, яка використовується для породження мови програмування, є неоднозначною, то це може призвести до її неоднозначної семантичної інтерпретації, що є небажаним явищем.