Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
05.03.2016
Размер:
1.28 Mб
Скачать

4.2 Уніфікація термів

Найбільш важливою операцією над термами є уніфікація, при якій здійснюється: конкретизація змінних, доступ до структур даних через загальний механізм узгодження і визначені типи порівнянь на рівність. Процес уніфікації відповідає передачі параметрів в інших мовах програмування. Уніфікація термів регулюється наступними правилами:

1. Вільна змінна уніфікується з константою або структурою. У результаті цього змінна стає конкретизованої, тобто приймає значення цієї константи або структури.

Goal: Х =Іван”

Х = Іван”

2. Змінна уніфікується із змінною, при цьому обидві вони стають однієї і тією ж змінною.

Goal: X=Y

Х=_1

Y=_1

3. Анонімна змінна уніфікується з чим завгодно.

? _ = “Іван”

4. Константа може бути уніфікована з іншою константою, якщо вони ідентичні або з вільної змінної відповідного типу.

Goal: “Іван” = “Іван”

True

5. Структура уніфікується з іншою структурою за умови, що їх функтори однакові, а аргументи можуть попарно уніфікуватися.

? father(X)=father(„Іван”)

X=„Іван”

Для того, щоб познайомитися з процесом уніфікації різних класів об'єктів Прологу, розглянемо виконання програмою 1 декількох запитів.

/* Програма 4.1 */

domains

title, author=symbol

pages=integer

publication=book(title , pages)

predicates

written_by(author, publication)

long_novel(publication)

clauses

written_by("І.Бpaтко", book("Програмування мовою Пролог", 560)).

written_by("Д.Соломон" ,book("Використання Турбо-Пролога", 608)).

long_novel(book(Title, Lеngth)):- written_by(_, book(Title, Length)), Length>600.

Розглянемо запит виду: written_by(X, Y). При рішенні задачі система повинна по черзі погодити мету з пропозиціями програми, намагаючись досягти відповідності між параметрами Х і Y з однієї сторони і параметрами пропозицій програми з іншої, через операцію уніфікації.

Тому що в даному запиті змінні Х та Y є вільними і можуть узгоджуватися з будь-якою константою, то найперша ж пропозиція для предикату written_by дає бажану відповідність (рис.4.1,а), тобто Х конкретизується константою „І.Братко”, а Y приймає значення структури book(„Програмування мовою Пролог”, 560). Система Пролог позначає цю точку покажчиком повернення і видає на екран повідомлення:

Х=„І.Братко” Y=book(„Програмування мовою Пролог”, 560)

Рисунок 4.1 – Уніфікація змінних

Оскільки ми задавали запит як зовнішню мету, система повертається в точку, позначену покажчиком повернення і продовжує, починаючи з цієї точки, процес уніфікації і знаходить другу пропозицію, що також може бути погоджена з запитом. Після уніфікації змінних система видає на екран Х =”Д.Соломон” Y=bооk(„Використання Турбо-Прологу”, 608) і закінчує процес уніфікації.

Якщо введемо запит written_by(Х, book(„Використання Турбо-Прологу”, Y)), то спроба уніфікації змінних з першою пропозицією програми буде виглядати так як наведено на рис.4.1,б.

Оскільки Х вільна, то вона приймає значення константи „І.Братко”, і робиться спроба встановити відповідність між двома структурами. Але складений об’єкт узгодиться з іншим складеним об'єктом за умови, що вони мають однаковий функтор, однакову кількість аргументів, і всі аргументи можуть бути попарно уніфіковані. Але, константа „Використання Турбо-Прологу” може бути уніфікована тільки з вільної змінної або сама із собою. Так як між першими двома компонентами структури book відповідність неможлива, то формується ознака невдачі, і система намагається погодити мету з наступною пропозицією програми, переходячи до перевірки відповідності з наступною пропозицією (рис.4.1,в).

Вільна змінна Х уніфікується з константою „Д.Соломон”. Обидві структури мають той самий функтор book, містять рівне число компонентів, і перші компоненти обох структур – однакові константи. Тобто, ці структури можуть бути уніфіковані, і при цьому константа 608 уніфікується із змінної Y. Тобто ціль досягнута, і Пролог виводить повідомлення:

Х = „Д.Соломон” Y = 608

Нарешті, розглянемо виконання запиту: long_novel(X). Насамперед система намагається відшукати пропозиції, заголовки яких погодяться з запитом (рис. 4.2).

Рисунок 4.2 – Уніфікація змінних при виконанні запиту long_novel(X).

Після цього узгоджуються ліва і права частини правила. Змінні Х и Title узгоджуються, тому що вони вільні і стають однієї і тієї ж змінною. Потім Турбо-Пролог об’являє першу пропозицію зазначеного вище правила підзадачею і робить спробу її уніфікації (рис.4.2,б).

Тому що анонімна змінна узгоджується з будь-яким об’єктом і структури book також погодяться, то ці два предикати можуть бути уніфіковані. У результаті цього змінна Title приймає значення „Програмування мовою Пролог”, а змінна „Length” стає рівної 560.

Після цього робиться спроба узгодити другу підціль тіла правила, а саме: Length>600. Перед спробою уніфікації зв’язана змінна Length заміняється своїм чисельним значенням 560. Оскільки вираз: 560 > 600 хибний, то Турбо-Пролог робить повернення назад до вже доведеної підцілі і намагається її передовести. Тобто знову намагається уніфікувати першу підціль written_by(_, book(Title, Length)), використовуючи наступний з наявних фактів (рис.4.2,в), який зв'язує Title з „Використання Турбо-Прологу” і Length з 608. У даному випадку виявляється: Length>600, тобто друга підціль також стає щирою. Правило цілком погоджене при отриманих значеннях змінних, задача вирішена, про що видається повідомлення:

Х=„Використання Турбо-Пролога”

Вихідна мета є цілком доведеної, і робота системи Турбо-Пролог закінчується. Система готова до прийому нових запитів.

Складний об’єкт може уніфікуватись або з простою змінною, наприклад, data(''Квітень'', 2, 1981) зрівнюється з X і зв’язує X з date(“Квітень”, 2, 1981), або ж зі складним об'єктом, який збігається з ним структурно: так, data(''April'', 2, 1981) порівнюється з date(Mo, Da, Yr).

Пролог проводить уніфікацію у двох місцях. По перше, уніфікація проходить, коли є виклик співставлення голови фрази. Інший спосіб виконання уніфікації – це використання знаку (=). У цьому випадку Пролог буде ототожнювати об’єкти, які знаходяться по обидві сторони знаку. Цей підхід є корисним для знаходження значень аргументів складного об’єкту. Наприклад, наступна програма виконує такі дії. Якщо дві особи мають одне й те саме прізвище, тоді другій особі приписується адреса першої.

/* Програма 4.2 */

domains

person = person(name,address)

name = name(first,last)

address = addr(street,city)

street = street(number,street_name)

city, street_name = string

first,last = string

number = integer

goal

P1 = person(name(„Василь”,”Марків”), addr(street(5,"Бучинського"), „Івано-Франківськ”)),

P1 = person(name(_, „Марків”),Address),

P2 = person(name(„Галя”, „Марків”), Address), write(P2).