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