Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / ЛЕКЦИИ / POSIBNIK / ПРОГР НА ПРОЛОГЕ.doc
Скачиваний:
42
Добавлен:
23.03.2015
Размер:
669.7 Кб
Скачать

4.3. Використання складених об'єктів

Розглянемо приклад:

любить(марія, персики).

фрукти(персики).

Функтор “любить” поєднує у відношення “любить” два об'єкти “марія” і “персики”. Об'єкти “марія” і “персики” є прості тому, що вони описують самі себе (атоми). Якщо об'єкт представляє сам себе, то ми його будемо називати простим. Відповідно й структура, що складається з простих об'єктів, буде називатися простою. Але Марія може любити якісь фрукти, книги й т.ін. Те, що персики – це фрукти, ми виразили у вигляді окремого факту. Але це ж можна виразити й безпосередньо в сруктурі відношення “любить”.

любить(марія, фрукти(персики)).

любить(марія, книги(“Три мушкетери”)).

Об'єкт, що представляє інший об'єкт чи сукупність об'єктів, називається складеним, а структура, що його описує, також буде називатися складеною, тому що вона скомпонована зі складених об'єктів. Для полегшення написання тверджень і предикатів із використанням складених об'єктів TP дозволяє описувати складені об'єкти в розділі DOMAINS:

DOMAINS

фрукти = фрукти(symbol)

книги = книга(symbol)

DATABASE

любить(symbol, фрукти)

любить(symbol, книги)

Ім'я “фрукти” представляє одночасно домен, складений об'єкт (як частина структури для екземпляра відношення “любить”) і функтор (але не предикат).

Якщо об'єкти структури належать до того ж самого доменного типу, то ця структура називається однодоменною:

DOMAINS

три_фрукти = фрукти(symbol, symbol, symbol)

DATABASE

любить(symbol, три_фрукти)

CLAUSES

любить(марія, три_фрукти(персики, яблука, апельсини))

Якщо ж структура містить об'єкти різних типів, то вона називається багатодоменною. Застосування доменної структури спрощує визначення предиката. Якщо не застосовувати доменну структуру, то програмі необхідно було б використовувати всі атрибути на одному рівні. Наприклад, предикат “любить”, описаний у попередньому прикладі, мав би такий вигляд:

любить(марія, персики, яблука, апельсини).

Тобто всі атрибути розглядалися б як окремі самостійні сутності.

4.4. Використання альтернативних доменів

Задача 1. Розглянемо задачу організації бази знань про регіони України. У базі знань повинна бути подана інформація про адміністративні одиниці України із зазначенням назв, населення, сусідів та адміністративних центрів, наприклад:

% Навчальна база знань "Регіони України" (цифри умовні)

% Подання бази знань з використанням складених об'єктів

% і альтернативних доменов

DOMAINS

назва_країни = symbol

населення = real

площа = real

столиця = назва_міста

назва_сусідів = назва_регіону *

назва_міста = symbol

столиця = назва_міста

назва_міст = назва_міста *

місто = місто(назва_міста, населення, площа)

міста = місто *

назв_регіону = symbol

% регіон - приклад опису альтернативного домена,

% що складається з двох доменних типів: область і республіка

регіон = область(назва_регіону, назва_міста, населення,

площа, назва_міст, назва_сусідів);

республіка(назва_регіону, назва_міста, населення,

площа, назва_міст, назва_сусідів)

регіони = регіон *

DATABASE

% країна - приклад опису складеного однорівневого об'єкта, що вміщує два

% списки складених об'єктів: міста й регіони

країна(назва_країни, столиця, населення, площа, міста, регіони)

PREDICATES

print_list(назв_міст)

print_list(назв_сусідів)

% знайти сумарну кількість населення, що проживає в обласних центрах України

населення_обл_центрів(real)

населення_міста(назва_міста, міста,населення)

підсумувати_населення(регіони, міста, real)

CLAUSES

% приклад подання складеного об'єкта

країна(україна, київ, 48000000, 603000,

[

% інформація про міста України, включена до складу самого об'єкта

місто(київ, 3000000, 300),

місто(луцьк, 300000, 80),

місто(львів, 1000000, 140),

. . .

місто(мелітополь, 30000, 20)

],

[

% інформація про області України, включена до складу самого об'єкта

область(київська, київ, 30000000, 3000, ["Біла Церква",іванків],

[житомирська, вінницька, черкаська, полтавська, чернігівська]),

область(волинська, луцьк, 3000000, 800, [ковель], [львівська, ровенська]),

область(львівська, львів, 10000000, 1040, [дрогобич],

[закарпатська, івано_франківская, тернопільська, ровенська, волинська]),

. . .

область(херсонська, херсон, 5000000, 1010,

["Нова Каховка", берислав], [миколаївська, дніпропетровська, запорізька,

республіка_крим]),

республіка(крим, сімферополь, 3000000, 800, [севастополь], [херсонська])

]).

% База знань про Україну складається з одного екземпляра відношення КРАЇНА

% --------------------------- допоміжні процедури ---------------------------------

% процедура друку списку

print_list([ ]).

print_list([H|T]):-

write(H), nl,

print_list(T).

% процедура виділяє населення міста за його назвою зі списку складених об'єктів % місто(назва_міста,населення,площа)

населення_міста(Місто, [місто(Місто, Населення, _ ) | ], Населення):-!.

% місто, яке ми шукаємо знаходиться на початку списку

населення_міста(Місто, [місто( _ , _ , _ ) | Решта], Населення):-

% пошукаємо у хвості списку

населення_міста(Місто, Решта, Населення).

% процедура, що підсумовує населення регіонів, які зберігаються в

% списку складених об'єктів регіони

підсумувати_населення([ ],_,0).

% ІНАКШЕ Населення = Населення_решти + Населення_першого

підсумувати_населення([область(_,Столиця_першого, _ , _ , _ , _ ) | Решта],

Міста, Населення):-

% знайдемо населення інших міст без першого в списку за допомогою

% рекурсивного виклику цієї ж процедури для хвоста списку

просумувати_населення(Решта, Міста, Населення_залишку),

населення_міста(Столиця_першого, Міста, Населення_першого),

Населення = Населення_залишку + Населення_першого.

підсумувати_населення([республіка( _ , Столиця_першого, _ , _ , _ , _ ) | Решта],

Міста, Населення):-

% знайдемо населення решти міст без першого в списку за допомогою

% рекурсивного виклику цієї ж процедури для хвоста списку

підсумувати_населення(Решта, Міста, Населення_залишку),

населення_міста(Столиця_першого, Міста, Населення_першого),

Населення = Населення_залишку + Населення_першого.

% =================== головна процедура ====================

% процедура, що обчислює сумарне населення обласних центрів

населення_обл_центрів(Нас):-

% одержимо список регіонів і список міст (там зберігається інформація про

% населення)

країна(україна, _ , _ , _ , Список_міст, Список_регіонів),

% віддамо їх процедурі ПІДСУМУВАТИ_НАСЕЛЕННЯ, одержуючи суму

% Нас

підсумувати_населення(Список_регіонів, Список_міст, Нас).

Тут Крим постає не як область, а як республіка. Цей факт реалізований за допомогою опису домена “регіон” у вигляді альтернативного домена. Для поділу альтернатив застосовується логічна зв'язка “;”.