- •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.13 Розв’язні та нерозв’язні проблеми кв-граматик та мов
Масову проблему називають алгоритмічно розв’язною, або розв’язною, якщо предикат, який її визначає, є рекурсивний, інакше проблему називають алгоритмічно нерозв’язною, або нерозв’язною.
Масову проблему називають частково алгоритмічно розв’язною, або частково розв’язною, або напіврозв’язною, якщо предикат, який її визначає, є частково рекурсивний.
Для КВ-граматик та мов наступні проблеми є розв’язними:
-
Чи є мова, породжувана КВ-граматикою, порожньою?
-
Чи є мова, породжувана КВ-граматикою, скінченною?
-
Чи є мова, породжувана КВ-граматикою, нескінченною?
-
Чи належить ланцюжок w мові, що породжується КВ-граматикою?
Для КВ-граматик та КВ-мов наступні проблеми є нерозв’язними.
-
Чи є перетин мов, породжуваних двома КВ-граматиками, порожнім?
-
Чи є перетин мов, породжуваних двома КВ-граматиками, скінченним?
-
Чи є перетин мов, породжуваних двома КВ-граматиками, нескінченним?
-
Чи є КВ-граматика однозначною?
-
Чи є порожнім (скінченним, нескінченним) доповнення до КВ-мови?
-
Чи співпадає КВ-мова, породжувана граматикою, з T*?
-
Чи є еквівалентними дві КВ-граматики?
-
Чи є регулярною мова, породжувана КВ-граматикою?
Зазначимо, що проблеми, розв’язні для КВ-граматик та мов будуть розв’язними і для регулярних граматик та мов. Разом з тим, деякі проблеми, нерозв’язні для КВ-граматик та мов, можуть бути розв’язними для регулярних граматик та мов. Зокрема, такими є вищенаведені проблеми 1-7, переформульовані на випадок регулярних граматик та мов.
-
4.14 Рівняння в алгебрах формальних мов
Граматики та БНФ є формалізмами, що задають мову «поштучно», «поелементно», вказуючи механізм породження окремих слів. Разом з тим, сама форма граматик та БНФ підштовхує до думки, що їх можна розглядати як системи рівнянь, розв’язками яких є мови. Щоб перейти до такого тлумачення, попередньо введемо необхідні визначення.
Визначення 4.43 Слабкою алгеброю формальних мов над алфавітом T будемо називати алгебру AL=(2T*, , ·) з операціями об’єднання та добутку мов.
Визначення 4.44 Множиною виразів LExp над множиною змінних Var називається множина, задана наступним індуктивним визначенням:
-
якщо x Var, то x Lexp,
-
якщо LT*, то LLexp,
-
якщо t, tLexp, то tt, t·tLexp.
Визначення 4.45 Формальним рівнянням (формальною рівністю) над алгеброю AL називається запис вигляду t=t, де t, tLexp.
Визначення 4.46 Інтерпретацією (означуванням, оцінкою) змінних називається довільне відображення : Var2T*. Інтерпретація змінних однозначно (та гомоморфно) продовжується до відображення : LExp2T* інтерпретації виразів, параметром якого є інтерпретація змінних , яке задається індуктивно за побудовою виразу eLexp:
-
якщо e =x (xVar), то (e)= (x),
-
якщо e =L (L T*), то (e)= L,
-
якщо e = tt, то (e)=(t)(t),
-
якщо e = t·t, то (e)=(t) · (t).
Визначення 4.47 Наведене визначення дозволяє абстрагувати відображення до оператора : LExp ((Var2T*)2T*). Вираз e, який містить змінні x1, …, xn, будемо позначати e(x1, …, xn), а відповідний оператор – ( e(x1, …, xn)).
Приклад 4.29 Нехай Var = {x, y, z}, (x)={a,ab}, (y)={,b,cc}, (z)={bb,c}. Тоді вираз x2z{a}y інтерпретується таким чином:
(x2z{a}y)={a,ab}2{bb,c}{a}{,b,cc}={aa, aab, aba, abab}{bba,ca}{,b,cc}=
{aabba, aabbba, ababba, ababbba, aaca, aabca, abaca, ababca}{,b,cc} =
{aabba, aabbba, ababba, ababbba, aaca, aabca, abaca, ababca, b,cc} =
{aabbab, aabbbab, ababbab, ababbbab, aacab, aabcab, abacab, ababcab, aabbacc, aabbbacc, ababbacc, ababbbacc, aacacc, aabcacc, abacacc, ababcacc}
Визначення 4.48 Інтерпретація (означування) змінних : Var2T* називається розв’язком рівняння t=t, якщо (t)=(t).
Визначення 4.49 Розвязком системи рівнянь {t1=t1, …, tn=tn} є така інтерпретація змінних, яка кожне рівняння перетворює у рівність.
Визначення 4.50 Рівняння виду x=t, де xVar, tLexp називаєть рекурсивним. Якщо у виразі t фігурують лише скінченні мови, то рівняння називають слабкорекурсивним. Аналогічно вводяться понятя рекурсивних та слабко рекурсивних систем рівнянь.
Розв’язок рівнянь в алгебрах мов можна знаходити різними методами, але найважливішим є метод поступових наближень.
Приклад 4.30
Розглянемо мову L={anbn | n0}. Ця мова породжується наступною простою граматикою G: S | aSb.
Цій граматиці відповідає наступне рівняння: S={}{a}S{b}. Позначимо оператор ({}{a}S{b}(S)) як (S).
Розв’язок рівняння знаходять методом послідовних наближень. Найперше наближення – порожня мова . Наступні наближення отримуємо підстановкою в оператор (S) замість S попереднього наближення. (Для спрощення тут можна говорити про підставку в саме рівняння). Отримуємо наступну послідовність наближень:
R(0)= ;
R(1)= {};
R(2)= {}{ab}={, ab};
R(3)= {, ab}{ab, aabb}={, ab, aabb};
… … …
R(i+1)=R(i){a} R(i){b};
… … …
Вважаємо, що
R=i R(i).
(Тут є першим граничним ординаром і може тлумачитись як множина натуральних чисел. Детальніше про це буде сказано у наступному розділі посібника.)
Використовуючи оператор отримуємо, що R(i+1)=( R(i)) та R=i(R(i)). Мова R і буде розв’язком нашого рівняння.
Щоб це довести, розглянемо наступну властивість оператора .
Лема 4.22 (неперевність ). (i R(i))= i (R(i)).
Доведення.
Спочатку доведемо, що (i R(i))i (R(i)). Дійсно, нехай x(i R(i)). Тоді x{}, або x{a}(i R(i)){b}. В першому випадку очевидно, що xi (R(i)). У другому випадку x(R(i+1)), тому xi (R(i)).
Тепер доведемо, що (i R(i))i (R(i)). Нехай тепер xi (R(i)). Тоді існує k таке, що x(R(k)). Це означає, що x{}, або x{a}(R(k-1)){b}. Тому x{a}(i R(i)){b}, тобто x(i R(i)). ▄
Умова неперервності фактично говорить, що R=i(R(i)) є розв’язком рівняння S={}{a}S{b}. Дійсно, для i маємо, що (R(i))=R(i+1), тому i (R(i))=i R(i+1)=i R(i). Остання рівність випливає з того, що R(0)= , тому маємо, що R=(R).
Неважко довести, що цей розвязок співпадає з мовою, породженою граматикою G.
Лема 4.23 L(G)=R.
Доведення проводиться індукцією. Індуктивне твердження наступне: нехай L(G)k – усі термінальні слова, що виводяться з S виводами довжини не більше k, тоді L(G)k= R(k).
База індукції. Для k=0 маємо L(G)0= R(0)= .
Крок індукції. Нехай індуктивна гіпотеза справедлива для довільного k. Доведемо її справедливість для k+1.
Дійсно, виводи довжини не більш ніж k+1 отримуємо або застосуванням правила S (тоді гіпотеза справедлива), або з виводів довжини не більш ніж k після застосування правила SaSb. В цьому випадку, всі породжені ланцюжки будуть належати R(k+1). І навпаки, якщо ланцюжок належить R(k+1), то він виводиться не більш ніж за k+1 крок.▄
У наведеному прикладі ми знайшли лише один розв’язок рівняння. Неважко довести, що цей розв’язок дійсно є єдиним. Доведення можна провести від супротивного, вибравши з іншого розв’язку R найменше за довжиною слово, що не належить R, тоді з рівняння має випливати існування ще меншого слова, що не належить R. Отримане протиріччя говорить про єдиність розв’язку. (Деталі доведення з’ясуйте самостійно.)
Виникає питання, чи завжди розв’язок має бути єдиним. Рівняння S=SS є прикладом того, що це не так, бо воно має безліч розв’язків. Наприклад, його розв’язками є такі мови: S=, S={}, S={a}*, S={aa}*, S={ab}*, S={aba}* і т.д.
Інші питання, пов’язані з розв’язком рекурсивних рівнянь, розглянемо у наступному розділі, присвяченому рекурсії.
Висновки
В цьому розділі були розглянуті основні методи подання синтаксису програм. Серед таких методів можна виділити методи породження та сприйняття мов. Формалізмами породження мов є породжуючі граматиками, сприйняття мов – автомати (машини). Синтаксис мов програмування звичайно подається формалізмами, які еквівалентні контекстно-вільним граматикам. В розділі визначено класифікацію граматик за Хомським, зв’язок класів граматик з класами автоматів, та проведено детальне дослідження класу контекстно-вільних граматик.
Основні результати цього розділу полягають у наступному:
-
Побудовано над-абстрактну та абстрактну моделі формальних мов як множин речень.
-
Побудовано дескриптивні формалізми визначення мов як транзиційних система та породжуючих граматик.
-
Дані визначення основних понять формальних мов та породжуючих граматик: відношення безпосереднього виводу, його рефлексивного транзитвного замикання, виводу слова, породженої мови.
-
Наведено приклад доведень в теорії породжуючи граматик.
-
Наведено класифікацію класів граматик за Хомським.
-
Дано визначеня загально-контекстних граматик.
-
Наведено визначення різних формалізмі сприйняття мов.
-
Встановлено еквівалентність між класами граматик та відповідними класами автоматів (машин).
-
Розглянуто методи подання синтаксису мов програмування.
-
Розглянуто властивості контекстно-вільних граматик та мов.
-
Сформульовані розв’язні та нерозв’язні проблеми породжуючи граматик та мов.
-
Розглянуто рівняння в алгебрах мов.
Контрольні питання.
-
Дайте визначення синтаксичного аспекту програм.
-
Від яких аспектів програм абстрагуються при вивченні синтаксичного аспекту? Сформулюйте відповідний принцип.
-
Сформулюйте принцип, який вказує на співвідношення синтаксичного та семантичного аспектів?
-
Поясніть вживання терміну «формальна мова».
-
Обгрунтуйте принцип теоретико-множинного тлумачення формальних мов. Порівняйте цей принцип з теоретико-функціональним принципом формалізації програм.
-
Як визначається над-абстрактна модель формальної мови?
-
Як визначається абстрактна модель формальної мови? Проекціями яких категорій є ця модель?
-
Обгрунтуйте конкретизацію речень як послідовностей символів. Сформулюйте відповідний принцип.
-
Обгрунтуйте необхідність введення дескриптивної компоненти у модель формальної мови.
-
Обгрунтуйте вибір транзиційної системи як дескриптивної моделі формальний мов. Сформулюйте відповідний принцип.
-
Обгрунтуйте необхідність подальної конкретизації транзиційних систем. У чому суть такої конкретизації?
-
Вкажіть відображення абстракції та конкретизації для чотирьох моделей формальної мови. Намалюйте відповідну таблицю.
-
Дайте визначення понять алфавіту, ланцюжка, порожнього ланцюжка, підланцюжка, операцій конкатенації та піднесення до степені.
-
Що таке вільна напівгрупа?
-
Що таке формальна мова?
-
Визначте теоретико-множинні операції над формальними мовами.
-
Що таке операція конкатенації (добутку) формальних мов?
-
Що таке операція ітерації формальних мов?
-
Що таке операція обернення формальної мови?
-
Що таке породжуючи граматика?
-
Дайте визначення відношення безпосередньої вивідності та його рефлексивного транзитивного замикання.
-
Дайте визначення виводу в граматиці.
-
Що таке словоформа (сентенційна форма)?
-
Дайте визначення мови, що породжується граматикою.
-
Вкажіть на екстенсіональні та інтенсіональні аспекти формальних мов та породжуючи граматик.
-
Визначте класи граматик за Хомським. Яке співвідношення цих класів?
-
Які граматики називаються загально-контекстними?
-
Як співвідносяться класи породжуючи та загально-контекстних граматик?
-
У чому полягає відмінність між механізмами породження та сприйняття мов?
-
Яку особливості вирізняють автомати від граматик?
-
Дайте визначення машини Тьюрінга. Вкажіть на інтенсіональні та екстенсіональні аспекти для формалізму машин Тьюрінга. Як визначається мова, яка розпізнається машиною Тьюрінга?
-
Як співвідносяться машини Тьюрінга та породжуючі граматики?
-
Дайте визначення лінійно-обмеженого автомата.
-
Як співвідносяться лінійно-обмежені автомати та породжуючі граматики?
-
Дайте визначення магазинного автомата.
-
Як співвідносяться магазинні автомати та породжуючі граматики?
-
Дайте визначення скінченного автомата.
-
Як співвідносяться скінченні автомати та породжуючі граматики?
-
Дайте визначення регулярної мови.
-
Як пов’язані регулярні мови з породжуючи ми граматиками та автоматами?
-
Які методи подання синтаксису використовуються для мов програмування?
-
Що таке нормальні форми Бекуса–Наура?
-
Які конструкції вживаються для модифікованих БНФ?
-
Що таке синтаксичні діаграми?
-
Як зв’язані БНФ, модифіковані БНФ, контекстно-вільні граматики та синтаксичні діаграми?
-
Сформулюйте основні властивості КВ-граматик.
-
Що таке продуктивні та досяжні нетермінали?
-
Яка граматика називається зведеною?
-
Дайте визначення різним нормальним формам КВ-граматик.
-
Що таке рекурсивний нетермінал?
-
Сформулюйте основні властивості КВ-мов.
-
Сформулюйте властивості замкненості КВ-мов відносно основних операцій.
-
Що таке дерево виводу в КВ-граматиці?
-
Які граматики називаються однозначними?
-
Які мови називаються суттєво неоднозначними?
-
Сформулюйте розв’язні проблеми КВ-мов та граматик.
-
Сформулюйте нерозв’язні проблеми КВ-мов та граматик.
-
Що таке алгебра мов?
-
Що таке рівняння в алгебрі мов?
-
Яким чином знаходяться розв’язки рівнянь в алгебра мов?
Вправи.
-
Побудуйте приклади транзиційних систем і мов, які вони задають.
-
Побудувати породжуючу граматику G для мови L={anb2ncn | n >0 }, довести, що L(G)=L, та що мова L не є КВ мовою.
-
Побудувати граматику G та систему рівнянь S для мови L={a2nbn | n >0 } та довести, що L(G)=L та R(S)=L.
-
Перетворіть граматику
S→AB
A→aBbSb
B→ABBa
B→ASb
на еквівалентну їй КВ-граматику, що не містить несуттєвих символів.
-
Побудуйте граматику без –правил, еквівалентну даній
S→ABC
A→BB
B→CCa
C→AAb
-
Побудуйте КВ-граматики, що породжують
а) усі ланцюжки з нулів та одиниць однаковою кількістю тих та інших;
б) всі можливі послідовності правильно розставлених дужок;
в) {a1a2…anan…a2a1ai{0, 1}, 1in};
г) {0i1 j ij, j0}.
-
Побудуйте ліволінійні граматики для мов, що складаються з
а) ідентифікаторів довільної довжини, які починаються з букви (як в Алголі);
б) ідентифікаторів довжиною від одного до шести символів, які починаються з букви I, J, K, L, M або N (як ідентифікатори цілих змінних в Фортрані);
в) усіх ланцюжків з нулів та одиниць, які мають парну кількість нулів та одиниць.
Опишіть мову, яка породжується правилами
-
Опишіть мову, яка породжується правилами
S→bSS
S→a
-
Побудуйте, якщо це можливо, КВ-граматики, які породжують наступні мови:
а) {an*nn1};
б) {ww{a, b, с} та кількість символів a в ланцюжку w рівна кількості символів b, рівна кількості символів c};
в) { ww w{a, b}};
г) {ambnambnm1, n1}.
-
Для вищенаведених мов побудуйте відповідні автомати, які розпізнають ці мови.
