- •М. С. Нікітченко теорія програмування Частина 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
3.2. Класи функцій
Введемо визначення та позначення для різних класів функцій. Будемо розглядати найбільш загальний клас часткових багатозначних функцій. Визначення стосуються екстенсіональних аспектів функцій, тобто тих аспектів, які задаються лише через аргументи та значення функцій.
Нехай D і R – деякі класи об’єктів. Клас об'єктів, розглянутих як часткові багатозначні функції з D у R, позначимо D R. Для f (D R) позначимо arg(f) клас визначеності f, тобто клас об’єктів, на яких f може бути визначена, und(f) – клас невизначеності f, тобто клас об’єктів, на яких f може бути не визначена, gr(f) DR – графік f, тобто множина пар (d, r) таких, що значення f на d може бути визначеним із значенням r. Відзначимо, що перетин arg(f) und(f) може бути не порожнім, оскільки можуть бути об'єкти, на яких f може бути як визначена, так і не визначена. Якщо ж arg(f) und(f) = , то f будемо називати реляційною функцією, оскільки в такому разі вона однозначно визначається своїм графіком, тобто бінарним відношенням (реляцією) на D(R) .
Для подання функцій будемо часто використовувати індексний конструктор функцій виду [ di ri | i I ] або [ di : D ri : R | i I ], де di і ri можна трактувати як індексні часткові однозначні відображення з деякої множини індексів I у класи D і R відповідно. Такий конструктор задає функцію f D R наступним чином. На dD значення f може дорівнювати значенню ri для такого iI, для якого di визначено і дорівнює d. Якщо ж таке ri не визначено або ж необхідного i не існує, то значення f на d може бути не визначене.
Клас часткових однозначних функцій із D у R позначимо D R, клас тотальних (усюди визначених) багатозначних функцій – D R, тотальних однозначних функцій – D R.
Введені позначення класів функцій дозволяють перейти до формалізації програмних понять. Формалізми, які виникають будемо називати програмними системами.
3.3. Програмні системи
Програмні системи – це специфічна форма фіксації рівня абстракції програмних понять. Вона дозволяє визначити сукупність понять, яка характеризує рівень, та їх властивості, що задаються сукупністю суджень. Програмні системи будуть визначатися відповідно до схеми розвитку програмних понять, що задається програмною пентадою. Кожне поняття представляється відповідною системою, яка фіксує зв’язок розглянутого поняття з іншими поняттями. Залежно від рівня абстракції такі системи можуть бути простими або дуже складними. Фактично повинна бути побудована мережа взаємопов’язаних систем.
Як ілюстрацію дамо визначення програмних систем, які знаходяться на гранично високому рівні абстракції.
Починаємо з системи даних. Оскільки ніяких властивостей даних не задано, то система даних Dt просто визначає деякий клас D, тобто Dt=<D>. Наступне поняття в пентаді – функція. Система функцій Fn – це пари <D, F>, де FD D. Імена функцій задаються як деяка множина Z, тому система імен Nm – це одноелементний кортеж <Z>. Відношення денотації (номінації) будемо трактувати як відображення den: Z F. Тому система денотації Dn є кортеж <den>. Остання трійка систем визначає в абстрактному виді семантику програм (система функцій), їх синтаксис (система імен) та зв’язок синтаксису із семантикою (система денотації). Тому доцільно ввести нову – функціонально-номінативну – систему, яка задає ці системи в їх єдності. Функціонально-номінативна система FNS – це кортеж <D, Fn, Nm, Dn>. Подальший розвиток буде здійснюватися конкретизацією введених систем.
Відзначимо, що функціонально-номінативна система може тлумачитись як алгебра даних: D – носій цієї алгебри, а операціями алгебри є функції, які задаються іменами з Z за допомогою відображення den. Далі це поняття буде розвинене до алгебри функцій.
При побудові таких систем виникає питання про форми їх подання. Наприклад, функціонально-номінативну систему FNS можна було б представити не у вигляді «ієрархічного» кортежу <D, Fn, Nm, Dn>, а у вигляді «плоского» кортежу <D, F, Z, den>. Кожна з форм уявлення може бути зручної в тих або інших випадках. Тому, щоб не обмежувати себе однією формою уявлення, приймемо наступну угоду про множинність форм подання програмних систем: залежно від цілей дослідження програмні системи можуть представлятися в різних формах.
Наступне поняття в пентаді – композиція, яке уточнимо в межах композиційної системи Cm(Z)=<D, F, C>, де C(Z F) F. Тут Z виступає як множина імен аргументів композицій.
Нарешті, формалізуємо поняття дескрипції. Насамперед зазначимо, що наявність композицій дозволяє ієрархічну побудову програм із деяких базових функцій багатократним застосуванням композицій. Тому дескрипції визначаються індуктивно. Інша обставина – дескрипції також будемо трактувати як відображення відповідно до теоретико-функціонального підходу. Тому для побудови дескрипцій необхідні множини імен базових функцій FN, композицій CN і аргументів композицій Z. Множина інфінітарних стандартних дескрипцій StDes задається індуктивно:
1) StDes(0)=FN;
2) StDes(i+1)={[cn ]| cnCN, Z StDes(i)}, i.
Тоді StDes = (i).
Наведене визначення використовує довільні відображення імен аргументів у множину раніше побудованих дескрипцій. Це дозволяє задавати дуже загальні, в тому числі й інфінітарні (нескінченні) дескрипції. У програмуванні звичайно обмежуються використанням фінітарных дескрипцій. Для виділення спеціальних класів стандартних дескрипцій уведемо відповідну програмну систему Ds(Z)=<FN, CN, Ds>, де DsStDes, яку назвемо стандартною дескриптивною системою.
Відношення денотації конкретизується як відображення den: Ds F. Внаслідок індуктивної побудови дескрипцій досить задати відношення денотації для імен базових функцій та імен композицій: den_fn: FN F та den_cn: CN C. Тоді значення den на dsDs задається індуктивно:
1) якщо ds=fn, fnFN, то den(ds)=den_fn(fn) ,
якщо ds=[cn ], де =[zidsi| ziZ, dsiDs, iI] ,
то den(ds)=(den_cn(cn))([ziden(dsi)| iI]) .
У цьому випадку систему денотації можна задати як пару BDn=<den_cn, den_fn>. Тому функціонально-номінативна система конкретизується як композиційно-дескриптивна система CDS=<Cm(Z), Ds(Z), BDn>. Такі системи можуть тлумачитися як алгебри функцій, операціями яких є композиції.
Зазначимо, що можна розглядати нестандартні дескриптивні системи, але для того щоб визначити денотати таких дескрипцій будемо вважати, що є відображення нестандартних дескрипцій у стандартні. Таке відображення будемо називати відображенням аналізу, а дескриптивні системи із заданим відображенням аналізу будемо називати аналізованими дескриптивними системами.
Приведені уточнення програмних понять можна розглядати як перший, найбільш абстрактний оберт спіралі розвитку поняття програми. Подальші конкретизації фактично починають другий оберт спіралі.