
- •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.6.2 Еквівалентність машин Тьюрінга та породжуючих граматик
Наведений у попередньому прикладі протокол машини Тьюрінга підказує ідею побудови породжуючої граматики за програмою машини. Таку побудову зробимо в два етапи: спочатку за програмою побудуємо продукції переходу (перетворення) конфігурацій машини Тьюрінга, потім зробимо обернення побудованих продукцій та добавимо правило для аксіоми та правила породження і видалення порожніх символів. Отримана породжуюча граматика буде еквівалентна вибраній машині Тьюрінга.
Кожна команда машини Тьюрінга породжує наступні правила перетворення конфігурацій:
-
Команда виду qapbR породжує правило qabp.
-
Команда виду qapbL породжує множину правил перетворення { cqapcb | сA}.
-
Команда виду qapb породжує правило qapb.
На другому етапі побудови обернемо отримані правила (перетворення виду α→β замінимо на правило породжуючої граматики β→α), добавимо правило для аксіоми S#qF#. Враховуючи, що при таких побудованих простих правилах можуть бути зайві #, переведемо їх в пустий ланцюжок правилом #, або створимо у разі необхідності додаткові порожні символи # правилом ###. Нарешті, потрібно буде видалити початковий стан, щоб отримати (породити) початковий ланцюжок правилом q0.
Таким чином, буде створена граматика GM=(N,T, P, S), яка має наступні параметри:
-
N={S}Q{#} (S Q{#}).
-
T=A\{#}.
-
SN.
-
P будується за вказаним вище алгоритмом.
Продемонструємо наведений алгоритм прикладом.
Приклад 4.15 Візьмемо машину Тьюрінга, запропоновану в попередньому прикладі, та побудуємо еквівалентну їй граматику. Отримаємо граматику GM =({ S, q0, qa, q-a, qb, q-b, qL, qF, #}, {a, b}, P, S).
Потрібні перетворення команд наведено в таблиці, третій стовбчик якої задає продукції P.
Таблиця 4.2
Команди машини Тьюрінга |
Правила перетворення конфігурацій |
Продукції породжуючої граматики |
|
#q-bbqL##;
|
0. S #qF# 0#. # ##
|
Правила, отримані перетворенням команди з номером n (n=6, 10, 11, 12) будемо далі нумерувати як n(1), n(2), n(3).
Продемонструємо коректність правил виводу для породження ланцюжка abba (індекси вказують на застосоване правило):
S0#qF#14#q0#13#qL#0##qL##10(3) ##q-bb#16#q-bb#9#bqb#8 #qbb#0###q0b#13#qL#bb#12(3)##qLbb#16#qLbb#12(2) #bqLb#0#
#bqLb##6(2) #bbq-aa#5#bbaqa#3#bbqaa#4#bqaba#4#qabba#1
#q0abba#16 q0abba#16 q0abba.
Зауважимо, що в процесі виводу застосувались правила породження та знищення порожнього символу #.
Наведені вище міркування та приклад дозволяють сформулювати наступне твердження.
Теорема 4.3 За кожною машиною Тьюрінга M можна побудувати еквівалентну їх породжуючу граматику G, що породжує ту ж мову, яку сприймає M, тобто: LT(M)=L(G).
Ця теорема може бути обернена.
Теорема 4.4 За кожною породжуючою граматикою G можна побудувати еквівалентну їх машину Тьюрінга M, що сприймає ту ж мову, яку породжує G, тобто: LT(M)=L(G).
Доведення може бути конструктивним, коли машиною Тьюрінга моделюється зворотній до породження процес сприйняття ланцюжка, або можна скористатись тезою Чорча, що стверджує існування машини Тьюрінга для формального подання інтуітивних алгоритмів. Тут деталі такої побудови описувати не будемо.
З теореми випливає, що граматики типу 0 породжують усі рекурсивно-зліченні множини (мови) в алфавіті A. Тим самим клас породжующих граматик має таку ж виразну потужність, як і інші універсальни моделі алгоритмів.
Відзначимо, що є різні варіанти машин Тьюрінга, наприклад, машини з різною кількістю стрічок, з різними обмеженнями на команди. Зокрема, виділяють детерміновані (не існує команд з однаковими лівими частинами та різними правими частинами), та недетерміновані машини Тьюрінга (існують команди з однаковими лівими частинами та різними правими частинами). Клас формальних мов, що сприймаються машинами Тьюрінга, є однаковий для детермінованих та недетермінованих машин, та для машин з різною кількістю стрічок.