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

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).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

% населення)

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

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

% Нас

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

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