- •1 Мета роботи 16
- •1 Мета роботи 18
- •Модульне проектування систем структурним методом
- •1 Мета роботи
- •2 Порядок виконання лабораторної роботи
- •3 Опис середовища функціонування design/idef
- •4 Методичні вказівки до виконання лабораторної роботи
- •6 Контрольні запитання для самоперевірки
- •Тема: модульне програмування методами логічного програмування
- •«Дорога» 2 «Автомобіль» 3 «Руль»
- •Модульне програмування на visual prolog
- •Об’єктно-орієнтоване програмування на visual prolog
- •6 Контрольні запитання для самоперевірки
- •Застосування функціональних моделей idef0 до створення функціональної структури програми
- •Реалізація моделей засобами інструментального засобу design/idef
- •Модульне програмування на visual prolog
- •Інкапсуляція
- •Механізм успадкування
Інкапсуляція
Взагалі, проблему розв’язують сукупністю об’єктів, які породжуються певними класами, і взаємодіють передаючи один одному повідомлення(виклики методів). За допомогою повідомлень об’єкти керують один одним, примушуючи виконувати дії, що ведуть до розв’язку проблеми.
Структура об’єкту, на який впливає інший об’єкт, доступна тільки через його методи. Таким чином, структура об’єкту робиться невидимою для інших об’єктів. Вказану властивість об’єкту називають інкапсуляцією.
Методом об’єкту може бути процедура або функція з аргументами.
При об’яві предикатів для методів, що мають аргументи, вказують можливі конкретизації аргументів для кожного режиму,як у глобальних предикатів.
Наприклад:
predicates
nondeterm count(real)-(o)
Якщо метод має тільки вхідні параметри, то конкретизацію аргументів можна не вказувати.
Розглянемо приклад, у якому об’єкту передають значення при виклику методу об’єкту.
Приклад1.
Завдання: Нехай треба порахувати середній бал певного студента за всіма дисциплінами і вивести його на екран.
Створимо два класи: «середній_бал», «вивід». Для кожного класу створюється свій об’єкт. З об’єкту класу «середній_бал» до об’єкту класу «вивід» передається середній бал студента. Передача виконується через виклик методу «print_s». Після чого об’єкт класу «вивід »виводить його на екран.
Class середній_бал
Facts-s
nondeterm student(string,string,integer)
single sred(integer,integer)
predicates
nondeterm count(real)-(o)
endclass середній_бал
implement середній_бал
clauses
sred(0,0).
student("Коваль","ЛП",82).
student("Коваль","ФП",78).
count(_):-student(_,_,S),sred(S1,N),N1=N+1,Sr=S+S1,assert(sred(Sr,N1)),fail.
count(Sr):-sred(S,N),Sr= S/N.
endclass середній_бал
Class вивід
predicates
print_s(real)
endclass вивід
implement вивід
clauses
print_s (Sr):-write(" Sredn bal ",Sr).
endclass вивід
goal
R1= середній_бал::new, R2= вивід::new,
R1:count(Sr), R2: print_s (Sr),
R1:delete,R2:delete.
Виводиться: Середній бал 80.
Аргументами предикатів можуть бути посилки на певний об’єкт. Така посилка дозволяє звертатися до будь-якого методу об’єкту, на який передано посилку.
Доменом посилки на певний об’єкт буде ім’я класу, до якого належить об’єкт.
Змінимо програму, що подана вище. Передамо посилку на об’єкт класу «середній бал» об’єкту класу «вивід» через аргумент методу «print_s». Тепер методи та факти класу «середній бал» доступні об’єкту через посилку.
Приклад2.
Class середній_бал
Facts-s
nondeterm student(string,string,integer)
single sred(integer,integer)
predicates
nondeterm count
endclass середній_бал
implement середній_бал
clauses
sred(0,0).
student("Коваль","ЛП",82).
student("Коваль","ФП",78).
count():-student(_,_,S),sred(S1,N),N1=N+1,Sr=S+S1,assert(sred(Sr,N1)),fail.
count().
endclass середній_бал
Class вивід
Predicates
nondeterm print_s (середній_бал)
endclass вивід
implement вивід
clauses
print_s (R):-R:student(F,_,_),R:sred(Sr,N),S=Sr/N,write(F," Середній бал ",S).
endclass вивід
goal
R1= середній_бал::new, R2= вивід::new, R1:count(), R2: print_s (R1), R1:delete,R2:delete.