Предмет:
Тип роботи:
Методичні вказівки
К-сть сторінок:
44
Мова:
Українська
уніфікується з атомом або складним термом. У результаті цього змінна стає конкретизованої, тобто приймає значення даного атома або терму.
?- X=микола. X=микола
Yes
2. Змінна уніфікується зі змінною, при цьому вони обидві стають як би однією й тією ж змінною.
?- X=Y.
X = _G161
Y = _G161
Yes
3. Анонімна змінна уніфікується з будь-яким термом.
?- автор(пушкін)=_. Yes
4. Атом уніфікується з атомом, якщо вони ідентичні.
?- микола=микола. Yes
5. Складний терм уніфікується з іншим складним термом, якщо їхні імена й кількість аргументів збігаються, а аргументи піддаються уніфікації.
?- батько(борис)=батько(X). X = борис
Yes
?- дідусь(борис, Y)=батько(X). No
Приклад
Терми більше(Х, собака) і більше(віслюк, собака) уніфікуються, тому що змінна X може бути конкретизована атомом віслюк:
?- більше(Х,собака) = більше(віслюк,собака). X = віслюк
Yes
Розглянутий у наступному прикладі запит не буде успішним, тому що змінна X не може бути конкретизована двома значеннями 1 й 2 одночасно.
?- p(X,2,2) = p(1,Y,X). No
кщо в цьому прикладі замість X ми використаємо анонімну змінну _, то уніфікація буде можлива, тому що при кожному використанні _ створюється нова змінна. Зміст анонімності в тім, що ми надаємо Прологу можливість генерації імені для даної змінної й нам не потрібні ні її ім'я, ні її значення. Змінна Y під час уніфікації конкретизується значенням 2:
?- p(_,2,2) = p(1,Y,_). Y = 2
Yes
Приклад
У наступному запиті уніфікація можлива, хоча й немає специфічних змінних, які могли б бути зв'язані або уніфіковані (як у попередніх прикладах):
?- f(a,g(X,Y)) = f(X,Z), Z = g(W,h(x)). X = a
Y = h(x)
Z = g(a, h(x)) W = a
Yes
1.6. Правила
Крім фактів програми мовою Пролог можуть містити правила, що дозволяють одержувати додаткові знання про той світ, що описує програма. Правило задає новий предикат через визначені раніше предикати.
Правило складається з голови (предиката) та тіла (послідовності предикатів, розділених комами). Голова й тіло розділені знайомий :- і, подібно кожній фразі Прологу, правило повинне закінчуватися крапкою. Кома в тілі правила означає кон’юнкцію (&&, логічне і).
Знак :- є схематичним записом стрілки (<-) і показує, що із правої частини випливає ліва. Цей знак читається як "якщо". Інтуїтивний зміст правила полягає в тому, що ціль, яка є головою, буде істинною, якщо Пролог зможе показати, що всі вирази у тілі правила є істинними.
Приклад
Правило, що визначає відношення «дитина» через відношення «батько», запишеться у такий спосіб:
дитина(X, Y) :- батько(Y, X).
Це означає, що якщо людина Y є для людини X батьком, то X є дитиною Y. Тут X й Y - змінні. Нагадаємо, що запис «дитина» показує, що предикат дитина
є функцією від двох аргументів.
Приклад
Визначимо відношення «мати» через відносини «батько» та «жінка» у такий спосіб: матір'ю X для людини Y є його батько жіночого роду.
мати(X, Y) :- батько(X, Y), жінка(X).
Предикати відрізняються друг від друга не тільки ім'ям, але й кількістю аргументів. Можна, наприклад, визначити відношення «мати» у такий спосіб:
мати(X) :- батько(X, _), жінка(X).
Чрез те, що нам у даному предикаті не важливо, чиїм батьком є дана жінка, то ми використали анонімну змінну.
?- мати(X, Y). X=ганна
Y=юлія
Yes
?- мати(X). X=ганна
Yes
Приклад
Визначимо відношення «дідусь»:
дідусь(X, Y) :- батько(X, Z), батько(Z, Y). дідусь(X, Y) :- батько(X, Z), мати(Z, Y).
Ці правила стверджують, що дідусем X для людини Y є батько людини Z, що у свою чергу є батьком або матір'ю людини Y.
1.7. Рекурсивні процедури
Рекурсія в більшості мов програмування - це такий спосіб організації обробки даних, при якому програма (процедура) викликає сама себе безпосередньо, або за допомогою іншої програми (процедури).
Гравюра голандського художника Моріса Ешера "Руки, що малюють" (рис.1.) - одна з найкращих ілюстрацій поняття рекурсії. Усім відомий віршик про попа і його собаку демонструє нам нескінченність рекурсивних викликів. Використовуючи рекурсію як прийом програмування ми повинні бути впевнені, що рекурсивна процедура буде завершена.
Рис. 1. - Гравюра голандського художника Моріса Ешера "Руки, що малюють"
У Пролозі рекурсія зустрічається, коли предикат містить мету, що посилається на саму себе. У рекурсивному правилі більш складні вхідні аргументи повинні виражатися через менш складні.
На прикладі вже наявної в нас бази даних пояснимо переваги використання рекурсії й особливості рекурсивних правил. Нехай є наступні факти:
більше(слон, кінь). більше(кінь, віслюк). більше(віслюк, собака). більше(віслюк, мавпа).
Виконаємо запит до бази даних
?- більше(віслюк, собака). Yes
іль більше(віслюк, собака) була досягнута тому, що цей факт був повідомлений Прологу при завантаженні бази. Тепер перевіримо, чи більше мавпа слона?
Ні, не більше. Ми одержали таку відповідь, яку й очікували: відповідний запит, а саме більше(мавпа,