- •М. С. Нікітченко теорія програмування Частина 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.3. Операції над формальними мовами
Операції над формальними мовами розподіляються на два класи. Перший клас операцій відповідає над-абстрактній моделі мов, у якій вони мають інтенсіонал множини. Тому всі теоретико-множинні операції можна застосовувати для мов. У першу чергу, це операції об’єднання , перетину та різниці \. Вважаємо, що мови – аргументи цих операцій – задані над одним і тим самим алфавітом. Якщо це не так, то будуємо новий алфавіт, який є об’єднанням алфавітів мов-аргументів. Тоді всі мови-аргументи будуть мовами над одним алфавітом. Якщо мова L є мовою в алфавіті Σ, то мова Σ*\L називається доповненням мови L відносно алфавіту Σ. Коли з контексту ясно, про який алфавіт йде мова, говорять просто, що мова Σ*\L є доповненням мови L і позначається .
Приклад 4.7. Нехай L1={anbncm| n,m 0}, L2={anbmcm| n,m 0}. Тоді
L1L2={ anbncn| n0}, L1\L2={ anbncm| mn, n,m 0}.
Другий клас операцій над формальними мовами відповідає абстрактній моделі мов, коли їх елементи тлумачаться як послідовності символів. Серед цих операцій, у першу чергу, відзначимо операцію добутку (конкатенації) мов, яка є похідною від операції конкатенації ланцюжків. Для позначення цієї операції використовуємо той самий символ операції конкатенації.
Визначення 4.10. Нехай . Тоді . Мова називається конкатенацією мов та .
Приклад 4.8. Якщо та , то .
Найважливішою характеристикою операції добутку мов є її асоціативність. Одиницею цієї операції є мова, що складається з порожнього ланцюжка, тобто мова { }. Похідною від добутку є операція піднесення до степені. Вважаємо, що , .
Маючи степінь, дамо індуктивне визначення ітерації, яку ще називають замиканням Кліні, або «зірочкою Кліні».
Визначення 4.11. Ітерацією мови (позначається ) називається мова .
Приклад 4.9. {ab}*={ , ab, abab, ababab, …}.
Для мови, що складається з одного символу, фігурні дужки часто опускають і пишуть, наприклад, a* заміть (a}*.
Визначення 4.12. Оберненням або дзеркальним образом ланцюжка (позначається ) називається ланцюжок, складений із символів , взятих в оберненому порядку.
Приклад 4.10. Якщо , то .
Визначення 4.13. Нехай . Тоді .
Крім вищенаведених операцій можна ввести й інші операції цього рівня, наприклад, ділення мов, проекції на під алфавіт тощо. Також можна ввести операції індуктивного та рекурсивного визначення мов. Такі операції будуть розглянуті пізніше.
Хоч і ми визначили чимало операцій над формальними мовами, їх недостатньо, щоб задавати важливі типи мов. Тому потрібно переходити до методів дескриптивного подання мов, тобто до граматик.
За способом подання правильних ланцюжків формальні граматики поділяються на породжуючі і розпізнаючі (граматики породження та сприйняття). До породжуючих граматик відносяться граматики, які дозволяють побудувати будь-який правильний ланцюжок з зазначенням його структури і не дозволяють побудувати жодного неправильного ланцюжка. Розпізнаюча граматика – це граматика, яка дозволяє визначити, чи є довільно обраний ланцюжок правильним і, якщо він є правильним, визначити його структуру.
Формальні граматики широко застосовуються в лінгвістиці, інформатиці, логіці, та програмуванні у зв’язку з вивченням природних та штучних мов.
Почнемо з розгляду породжуючих граматик.