- •М. С. Нікітченко теорія програмування Частина 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
1.3. Формальний опис семантики мови sipl
Семантика задає значення (смисл) програми. Наш приклад показує, що смисл програми – перетворення вхідних даних у вихідні. У математиці такі перетворення називають функціями. Тому до семантичних понять відносять поняття даних, функцій та методів їх конструювання. Такі методи називаються композиціями, а відповідна семантика часто називається композиційною. Будемо вживати термін композиційна семантика, тому що саме композиції і визначають її властивості. Композиційна семантика є певною конкретизацією функціональної семантики тому, що базується на тлумаченні програм як функцій.
Перейдемо до розгляду композиційної семантики мови SIPL.
1.3.1. Дані
Базові типи даних – множини цілих чисел, булевих значень та змінних (імен):
Int={ . . . , -1, 0, 1, 2, . . . };
Bool={true, false};
Var={…, M, N, … }.
Похідні типи – множина станів змінних (наборів іменованих значень, наборів змінних з їх значеннями):
State=Var Int.
Приклади станів змінних: [M8, N16], [M3, X 4, Y2, N16].
Визначимо тепер операції на базових типах даних. Щоб відрізнити операції від символів, якими вони позначаються, їх пишуть жирним шрифтом або вводять спеціальні позначення. Ми тут оберемо другий варіант, вводячи нові позначення для операцій на типах даних.
Операції на множині Int. Символам +, –, відповідають операції add, sub, mult (додавання, віднімання, множення). Це бінарні операції типу Int2 Int.
Операції на множині Bool. Символам , відповідають операції or, neg. Це бінарна операція типу Bool2 Bool (диз’юнкція) та унарна операція типу Bool Bool (заперечення).
У мові також є операції змішаного типу. Символам операцій порівняння =, > відповідають операції eq, gr. Це бінарні операції типу Int2 Bool.
Вивчення властивостей даних та операцій у математиці відбувається на основі поняття алгебри. В першому наближенні алгебру можна тлумачити як множину із заданими на ній операціями. Для нашої мови маємо наступні алгебри.
Алгебра цілих чисел: A_Int=<Int; add, sub, mult>.
Алгебра булевих значень: A_Bool=<Bool; or, neg>.
Якщо додати операції порівняння, отримаємо двоосновну алгебру базових даних:
A_Int_Bool =<Int, Bool; add, sub, mult, or, neg, eq, gr>.
Для опису мови SIPL треба додати ще одну основу – множину станів змінних. На цій основі задана бінарна операція накладання (для цієї операції іноді вживається термін «накладка»). Ця операція за двома станами будує новий стан змінних, до якого входять усі іменовані значення з другого стану та і ті значення з першого стану, імена яких не входять до першого стану. Ця операція подібна до операції копіювання каталогів із спеціальним випадком однакових імен файлів у двох каталогах. У цьому випадку файл із першого каталогу замінюється файлом з тим же іменем з другого каталога.
Наприклад:
[M8, N16] [M3, X 4, Y2]= [M3, N16, X 4, Y2].
Уведемо відразу і відношення розширення станів новими іменованими значеннями. Наприклад,
[M8, N16] [M8, X 4, Y2, N16].
Це відношення не включаємо в алгебри, пов’язані з мовою SIPL, бо воно в цій мові безпосередньо не використовується, але буде корисним для доведення властивостей програм цієї мови.
Для створення та оперування із станами змінних треба визначити дві функції: іменування x: Int State та розіменування x: State Int, які мають параметр xVar:
x(n)=[xn];
x(st)=st(x).
Тут і в подальшому вважаємо, що nInt, stState. Перша функція іменує іменем x число n, створюючи стан [xn], друга бере значення імені x у стані st. Сама формула ґрунтується на тому факті, що стани змінних можуть тлумачитись як функції виду VarInt. Функція розіменування є частковою. Вона не визначена, якщо x не має значення у стані st.
Наприклад:
M(5)=[M5];
Y([M3, X4, Y2])=2;
Y([M3, X4]) не визначене.
Крім того, введемо
параметричну функцію-константу арифметичного типу : StateInt, таку що (st)=n (nInt);
тотожну функцію id: StateState, таку, що id(st)=st.
Отримали багатоосновну алгебру даних мови SIPL
A_Int_Bool_State =<Int, Bool, State;
add, sub, mult, or, neg, eq, gr, x, x, , id, >,
яка подана на рис. 1.3.
Зауваження 1.4. Є ще одна основа – Var. Оскільки ніяких операцій на цій основі у мові SIPL не задано, тому цю основу до алгебри даних не включаємо, але імена з Var використовуємо як параметри операцій іменування та розіменування.