- •1 Мета роботи 17
- •Модульне проектування систем структурним методом
- •1 Мета роботи
- •2 Порядок виконання лабораторної роботи
- •3 Опис середовища функціонування design/idef
- •4 Методичні вказівки до виконання лабораторної роботи
- •6 Контрольні запитання для самоперевірки
- •Тема: модульне програмування методами логічного програмування
- •«Дорога» 2 «Автомобіль» 3 «Руль»
- •Модульне програмування на visual prolog
- •6 Контрольні запитання для самоперевірки
- •Застосування функціональних моделей idef0 до створення функціональної структури програми
- •Реалізація моделей засобами інструментального засобу design/idef
- •Модульне програмування на visual prolog
Модульне програмування на visual prolog
В.1 Структура модульної програми на Visual Prolog
Програма з декількох модулів має один головний модуль і декілька допоміжних модулів. Модулі програми взаємодіють через виклики певних процедур і фактів.
Всі модулі програми оформлюються подібно програмі з одного модуля, тобто мають секції опису предикатів і доменів(типів даних) і секції тверджень.
Відміна головного модуля від інших модулів лише в тому, що головний модуль має секцію Goal, а інші модулі не мають.
На Пролозі область реалізації містить локальні описи доменів і предикатів і локальні твердження. Локальні описи і твердження можуть застосовуватися тільки в модулю, в якому вони знаходяться.
З локальних тверджень складаються процедури модуля.
Область інтерфейсу містить глобальні описи доменів і описи глобальних предикатів. Кожна глобальна секція починається словом Global.
Глобальні секції Predicates і Facts містять опис предикатів, якими записані твердження процедур і динамічні факти. Такі процедури і факти, можна викликати з інших модулів.
В програмі може бути лише одна неіменована секція Facts. Тому, якщо є одна глобальна секція Facts, то в будь-якому модулі можуть бути лише іменовані локальні секції Facts.
Глобальні факти з характеристикою single можуть розміщуватися тільки в головному модулі. Причому секція Goal повинна розміщуватися перед секцією Clauses, у якій розташований.
Глобальні динамічні факти створюють окремий модуль програми.
Порядок розміщення локальних і глобальних секцій у програмі не важливий.
Порядок об’явлення глобальних доменів і глобальних предикатів у різних модулях може бути різним.
Крім того, головний модуль повинен мати всі глобальні об’яви програми, а інші модулі можуть мати тільки ті описи, що вони застосовують. Тобто різні модулі програми можуть мати різний вміст глобальних об’яв.
Такий підхід дозволяє створювати бібліотеки в об’єктних кодах з процедурами, що застосовує вся програма.
В.2 Глобальні описи предикатів
Для кожного глобального предикату треба вказати набір можливих конкретизацій параметрів.
Наприклад, Global Predicates
nondeterm str_len(string, integer) - (i, o) (i, i) (o, i)
Якщо конкретизація параметрів не вказана, то по замовчанню всі параметри процедури вважаються вхідними.
Глобальним може бути предикат - функція, що написаний на мові Visual Prolog. При об’яві предикату - функції перед функтором вказують його тип.
Наприклад. Global Predicates
nondeterm integer kvadrat(integer) - (i)
Пролог може викликати програму написану на іншій мові програмування. Таку програму об’являють в програмі на Пролозі , як зовнішній предикат. Об’ява зовнішнього предикату повинна містити мову. Наприклад, для використання програми на мові С, треба об’явити:
Global Predicates
pro_c(integer, integer) - (i, o) language c
В.3 Приклад модульної програми
Розглянемо приклад модульної програми. Програма обчислює вік людини. Вона містить головний модуль і два допоміжних. Модулі програми дуже малі. Це допоможе краще зрозуміти структуру програми.
Головний модуль «Р1» видає повідомлення, що буде обчислено вік людини. Модуль «Р11» пропонує ввести поточний рік і вводить його. Модуль «Р12» пропонує ввести рік народження і вводить його.
Після чого головний модуль обчислює вік людини і виводить його.
Для створення модульної програми ми відокремимо інтерфейси модулів від секцій реалізацій модулів.
Модулі програми, що подані нижче не містять глобальних об’яв.
/*Головний модуль Р1*/
Include “P1.inc”
Predicates
do
Goal
do.
Clauses
do:-write("Підрахуємо ваш вік "), nl, рік_народження(Рік_н),
рік_поточний(Рік_п), Вік= Рік_п - Рік_н,
write("Ваш вік ", Вік).
/*Модуль Р11*/
Include “P1.inc”
Clauses
рік_поточний (Рік_п):- write("Введіть поточний рік"), nl, readint(Рік_п).
/*Модуль Р12*/
Include “P1.inc”
Clauses
рік_народження (Рік_н):- write("Введіть рік народження "),nl, readint(Рік_н).
Створимо файли з глобальних доменів для кожного модуля свій. Аналогічно створимо файли з глобальних предикатів для кожного модуля свій.
/* Project: P1 FileName: p11.DOM */
Global domains
рік_пот = integer
/* Project: P1 FileName: p11.PRE */
Global Predicates
рік_поточний (рік_пот)-(o)
/* Project: P1 FileName: p12.DOM */
Global domains
рік_нар = integer
/*Project: P1 FileName: p12.PRE*/
Global Predicates
рік_народження (рік_нар)-(o)
Такий підхід дозволяє за допомогою директив include та експерту застосувань злити автоматизовано всі файли в один P1.inc, а злитий файл включити в кожний модуль програми за директивою Include “P1.inc”.
Структура файлу P1.inc після злиття файлів подана нижче.
/* Project:p1 FileName: P1.INC*/
global domains
DB_SELECTOR = browselist_db % For treebrowser tool
FILE = fileselector1; fileselector2 % To be edited
include "p11.dom"
include "p11.pre"
include "p12.dom"
include "p12.pre"
Компілятор за директивою Include “P1.inc” в кожному модулі включає файл P1.inc в модуль. Після чого переглядає включені об’яви і знаходячи знову директиви Include знову включає в модулі об’яви.
Такий метод працює надійніше, ніж програміст буде сам вибирати з кожного модуля глобальні об’яви включати їх у головний модуль.
В.4 Створення модульної програми експертом застосування
Програму, що складається з декількох модулів, неможливо взагалі створити без опції Project. Для реалізації такої програми треба мати засоби опису структури програми з модулів.
Після створення проекту і головного модуля створити новий модуль і додати його до структури програми можна за опцією NEW.
Опція NEW
Опція відкриває каталог проекту. Пропонується ввести ім’я модуля для створення файлу у каталозі проекту опцією «open». В файлі буде зберігатися модуль програми на вихідній мові.
У вікні експерту застосування до структури проекту додається модуль з вказаним ім’ям. По замовчанню кожен модуль містить директиву Include “<ім’я головного модуля>.inc”, щоб включити у всі модулі всі глобальні об’яви.
Далі у діалоговому вікні File Inclusions for Module запитується, які файли з глобальними об’явами необхідно створити для поточного модуля і куди включати.
Якщо користувач ще не знає, чи буде модуль містити глобальні предикати і домени, то можна відмовитися від створення файлів. До діалогового вікна можна повернутися за опцією ATTRIBUTES у вікні експерта застосування після написання модуля. На рисунку В.1 показано, які можливості треба обрати, щоб реалізувати описаний метод.
Рисунок В.1- File Inclusions for Module
Опції EDIT і DELETE застосовуються для корегування обраного модуля або вилучання відповідно.
В.5 Команди компіляції та побудови програми
Команда PROJECT/COMPILE MODULE (Ctrl+F9) компілює обраний модуль.
Команда PROJECT/BUILD (Alt+F9) компілює модулі, що були змінені та будує програму.
Команда PROJECT/REBUILD ALL (Ctrl+Alt+F9) компілює всі модулі і будує програму.
Команда PROJECT/LINK ONLY (Shift+F9)
Команда не компілює модулі. Вона будує програму для виконання.
Команда PROJECT/RUN (F9)
Команда компілює модулі, що були змінені, будує програму і запускає програму на виконання.
Команда PROJECT/DEBUG (Ctrl+Shift+F9)
Автоматично створюється вікно проекту і запускається програма DEBUG. У вікні проекту можна обрати модуль налагодження якого відбувається. У налагоджувану можна відкрити декілька вікон для перегляду результатів прогону. Повернутися у середовище VDE можна за опцією File/Exit (Alt-x).
Команда PROJECT/ PROJECT TREE (Ctrl+T)
Після компіляції проекту командою можна подивитися дерево проекту. Щоб одержати текст модуля у вікні достатньо натиснути двічі лівою кнопкою миші на файлі.