Лабораторна робота
Тема: Основні поняття мови Пролог.
Пролог - це мова програмування, що використовується для вирішення задач, в яких діють об'єкти і відносини між цими об'єктами. Програма на пролозі складається з речень, які можуть бути фактами, правилами або питаннями.
Можна виділити два рівня характеристики прологівської програми: декларативний і процедурний. Перший з них визначає за допомогою відношень, яким повинен бути результат роботи програми. Другий - як цей результат був отриманий і які з відношень реально оброблялись.
В основі Прологу лежить поняття відношення, яке взяте з предикатних логік. Слово “предикат” відноситься до розділу математичної логіки, в якому досліджуються операції над логічними висловленнями. В логіці предикатів під предикатом розуміється деяка властивість, логічна функція від довільного числа аргументів, яка приймає тільки два значення - “істина” або ж “хибність”.
Програма на Пролозі будується із двох типів фраз (речень): фактів і правил.
Факти - це відношення, або ж властивості, про які ви, програміст, знаєте, що вони істинні.
Правила - це залежні відношення; вони дозволяють Прологу робити виведення, порівнюючи одну частину інформації з іншою. Правила Прологу складаються з трьох частин: голови, символу, тіла. Голова - це факт, який буде вірним, якщо деяка кількість умов виконається. Голову ще іноді називають заключенням, або ж відношенням залежності. Символ - відділяє голову правила від тіла; може бути текстовим типу or або ж if. Тіло - це множина умов (або список файлів), котрі повинні бути істинними, для того щоб Пролог міг довести, що голова правила вірна.
1.1 Приклад програми: родинні відносини.
Розглянемо дерево родинних відносин:
1.2 Факти.
Введемо відношення – батьки - (parent) між об'єктами.
parent (tom, bob).
Це факт, що визначає, що Том є батьком Боба.
parent - ім'я відношення, tom, bob - його аргументи. Тепер можна записати програму, що описує все дерево родинних відносин.
parent (pam, bob).
parent (tom, bob).
parent (tom, liz).
parent (bob, ann).
parent (bob, pat).
parent (mary, ann).
parent (pat, juli).
Ця програма складається з семи речень (тверджень). Кожне твердження записане фактом у вигляді відношення parent. При записі фактів треба дотримуватись наступних правил:
Імена всіх відносин і об'єктів з маленької букви.
Спочатку записується ім'я відношення, потім в круглих дужках через кому об'єкти.
У кінці ставиться крапка.
Ще приклад факту: like (bob, pam).
Сукупність фактів в пролозі називають базою даних. До складеної бази даних можна поставити питання. Питання в пролозі починається з ?- Питання записується також, як і факт.
Наприклад:
? - parent (bob, pat).
Коли пролог одержує питання, він намагається зіставити його з базою даних. Такий факт знаходить відповідь: так (yes).
1.4 Змінні.
Можна поставити питання і дізнатися хто батько liz:
?-parent (X, liz).
X= tom
Тут X - змінна. Її величина невідома і вона може приймати значення. В даному випадку її значенням буде об'єкт, для якого це твердження істинне.
1.5 Кон'юнкція цілей.
Можна поставити більш загальне питання: Хто є батьком батька juli. Оскільки немає відношення grandparent, то можна розбити на два питання:
1. хто батьки juli. Припустимо - Y.
2. хто батьки Y. Припустимо - X.
Тоді складове питання:
?-parent (Y, juli), parent (X, Y).
X=bob
Y=pat
При пошуку рішення спочатку знаходиться Y, а потім за другою умовою Х.
1.6 Правила.
Введемо відношення дитина child, зворотне до parent "батьки".
Можна б було визначити аналогічно:
child (liz, tom).
Але можна використовувати, що відношення child обернене до parent і записати у вигляді твердження - правила:
child(Y, X):-parent (X, Y).
Правило читається так:
Для всіх X і Y Y - child X, якщо X -parent Y.
Правило відрізняється від факту тим, що факт завжди істина, а правило описує твердження, яке буде істинною, якщо виконана деяка умова. Тому в правилі виділяють: слідство - умова
child(Y, X):- parent (X, Y).
Якщо умова parent (X, Y). виконується, то логічним слідством з нього буде твердження child(Y, X).
Як правило використовується прологом :
Поставимо питання
?-child(liz, tom).
У програмі немає даних про child. Але є правило, яке вірне для всіх X Y, у тому числі для liz і tom. Ми повинні застосувати правило для цих значень. Для цього треба підставити в правило замість X- tom, а замість Y - liz. Говорять, що змінні будуть зв'язані, а операція називатиметься підстановкою. Одержуємо конкретний випадок для правила:
child(liz, tom):-parent (tom, liz).
Умовна частина прийняла вигляд parent (tom, liz).
Тепер треба з'ясувати чи виконується ця умова. Початкова мета child(liz,tom) замінюється підціллю parent (tom, liz)., яка виконується, тому пролог відповість "yes".
Завдання.
1.Нехай у Пролог системи є набір фактів:
батьки(микола, ніна, іван).
батьки(петро, галя, андрій).
батьки(віктор, надія, марія).
Кожний з фактів трактується так. Перші два аргументи предикату є батьками особи, яку визначає третій предикат. Що буде реалізовувати запит:
1.?- батьки(X,Y,_).
2.?- батьки(_,_,Х).
2. Нехай у Пролог системи є набір фактів:
parent (pam, bob).
parent (tom, bob).
parent (tom, liz).
parent (bob, ann).
parent (bob, pat).
parent (mary, ann).
parent (pat, juli).
male(tom).
male(bob).
male(jim).
female(liz).
female(pam).
female(pat).
female(ann).
2.1 Яка буде відповідь пролог системи на питання:
2.1.1. ? - parent (bob, pat).
2.1.2. ?-parent (bob,mary).
2.1.3. ?-parent (X, liz).
2.1.4 ?-parent (X, bob).
2.1.5. ?-parent (X, Y).
2.1.6. ? - parent (sam, pat).
2.1.7. ?-parent (bob,Y), parent (Y, liz)..
2.1.8. ?-parent (X, mary).
2.1.9 ?-parent (X, bob), parent (X, liz).
2.1.10. ?-parent (X,mary), parent (liz,X).
2.1.11. ? - parent (liz, jim).
2.1.12. ?-parent (mary,X).
2.1.13. ?-parent (X, liz), parent (X, pat), parent (mary, X).
2.1.14 ?-parent (liz, bob).
2.1.15. ?-parent (mary,ann).
2.2. Задайте пролог-системі наступні питання:
2.2.1. Хто є батьком батька Джулі.
2.2.2 Хто внуки Тома?
2.2.3. Чи є у Ен і Пат спільні батьки?
2.2.4. Хто діти Пам?
2.2.5. Чи є у Ліз дитина?
2.2.6. Хто є дитиною дитини Пам?
2.2.7. Чиє Боб батьком Пат?
2.2.8.