- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •1. Основи мови програмування пролог
- •1.1. Основні поняття
- •1.2. Синтаксис мови пролог
- •1.3. Класифікація даних у пролозі
- •1.4. Приклад доказу в пролозі
- •1.5. Подання задачі у вигляді і-або дерева
- •1.6. Структура програми в системі tp
- •1.7. Убудовані типи даних мови tp
- •1.8. Висновки
- •2. Підстави логічного програмування
- •2.1. Принцип резолюцій
- •2.3. Способи застосування принципу резолюцій
- •2.4. Диз’юнкти хорhа
- •3. Три семантичні моделі пролог-програми
- •4. Подання знань
- •4.1. Процес подання знань
- •4.2. Способи подання бази знань
- •4.2.1. Представлення цілісних інформаційних елементів у вигляді фактів
- •4.2.2. Подання атрибутів у вигляді фактів
- •4.2.3. Представлення знань у вигляді списку структур
- •4.2.4. Подання у вигляді рекурсивних структур
- •4.2.5. Подання у вигляді двійкового дерева
- •4.2.6. Порівняння різних виглядів подання бази даних
- •4.2.7. Компонування даних у список
- •4.3. Використання складених об'єктів
- •4.4. Використання альтернативних доменів
- •4.5. Засоби документування програми
- •4.6. Типи й властивості відношень предметної області
- •4.6.1. Обмеження, що забезпечують цілсність відношень
- •4.6.2. Властивості відношень бази знань і їхня підтримка в програмі на tp симетрія і асиметрія
- •Рефлексивность і нерефлексивность
- •Транзитивність
- •Симетричність і транзитивність
- •Спроба 1
- •Спроба 2.
- •Запам'ятовування списку відвіданих місць
- •4.7. Списки
- •4.7.1. Подання й зображення списків
- •4.7.2. Використання списків
- •4.7.3. Метод поділу списку на голову і хвіст (псгх)
- •4.7.4. Списки списків
- •Методи програмування
- •5.1. Повторення і відкіт (пв)
- •5.2. Метод відкоту після невдачі (впн)
- •5.3. Метод відсікання та відкоту (вв)
- •5.4. Повторення та рекурсія (пр)
- •5.5. Метод узагальненого правила рекурсії (упр)
- •5.6. Побудова рекурсивних структур методом прогресуючої підстановки (пп)
- •5.7. Предикат відсікання
- •5.8. Організація багаторазово виконуваних інтерактивних програм (бвіп)
- •5.9. Метод аналізу станів (ас)
- •5.10. Метод організації висхідних рекурсивних обчислень (вро)
- •5.11. Комбінація спадних і висхідних рекурсивных обчислень (ксвро)
- •5.12. Предикат fail-if (not)
- •5.13. Предикат true
- •5.14. Модифікація бази даних (мбд)
- •5.15. Керування базою даних (кбд)
- •5.16. Глобальні змінні (гз)
- •5.17. Накопичування результатів у базі даних за допомогою вимушеного відкоту і глобальної змінної (нрввгз)
- •5.18. Метапрограмування (мп)
- •Список рекомендованої літератури
- •1. Основи мови програмування пролог 4
- •2. Підстави логічного програмування 14
- •3. Три семантичні моделі пролог-програми 20
- •4. Подання знань 23
- •Програмування мовою пролог
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).
% ІНАКШЕ Населення = Населення_решти + Населення_першого
підсумувати_населення([область(_,Столиця_першого, _ , _ , _ , _ ) | Решта],
Міста, Населення):-
% знайдемо населення інших міст без першого в списку за допомогою
% рекурсивного виклику цієї ж процедури для хвоста списку
просумувати_населення(Решта, Міста, Населення_залишку),
населення_міста(Столиця_першого, Міста, Населення_першого),
Населення = Населення_залишку + Населення_першого.
підсумувати_населення([республіка( _ , Столиця_першого, _ , _ , _ , _ ) | Решта],
Міста, Населення):-
% знайдемо населення решти міст без першого в списку за допомогою
% рекурсивного виклику цієї ж процедури для хвоста списку
підсумувати_населення(Решта, Міста, Населення_залишку),
населення_міста(Столиця_першого, Міста, Населення_першого),
Населення = Населення_залишку + Населення_першого.
% =================== головна процедура ====================
% процедура, що обчислює сумарне населення обласних центрів
населення_обл_центрів(Нас):-
% одержимо список регіонів і список міст (там зберігається інформація про
% населення)
країна(україна, _ , _ , _ , Список_міст, Список_регіонів),
% віддамо їх процедурі ПІДСУМУВАТИ_НАСЕЛЕННЯ, одержуючи суму
% Нас
підсумувати_населення(Список_регіонів, Список_міст, Нас).
Тут Крим постає не як область, а як республіка. Цей факт реалізований за допомогою опису домена “регіон” у вигляді альтернативного домена. Для поділу альтернатив застосовується логічна зв'язка “;”.