
- •Лекція 3.5. Основи мови vіsual prolog
- •1. Основні елементи мови
- •2. Основні розділи програм
- •3. Розділ тверджень
- •4. Розділ предикатів
- •5. Розділ доменів
- •1 Solutіon
- •6. Розділ цілі
- •7. Розділ констант
- •8. Уніфікація й пошук з вертанням
- •8.1. Зіставлення й уніфікація
- •2 Solutions
- •1 Solutіon.
- •1 Solutіon
- •9. Директиви компілятора
- •10. Прості об'єкти даних
- •11. Складені об'єкти даних і функтори
- •11.1. Уніфікація складених об'єктів
- •11.2. Використання кількох значень як єдиного цілого
- •11.4. Багаторівневі складені об'єкти
- •Лекція 7
8. Уніфікація й пошук з вертанням
8.1. Зіставлення й уніфікація
Розглянемо наступну програму з погляду того, як будуть відшукуватись всі рішення цілі wrіtten_by(X, Y).
domains
title, author = symbol
pages= unsigned
predicates
book(title, pages)
written_by(author, title)
long_novel (title)
clauses
written_by(fleming, "DR NO").
written_by(melville, "MOBY DICK").
book("MOBY DICK", 250).
book("DR NO", 310).
long_novel (Title) :- written_by(_, Title),
book(Title, Length),Length > 300.
Намагаючись виконати цільове твердження wrіtten_by(X, Y), Vіsual Prolog повинен перевірити кожне твердження wrіtten_by(X, Y) у програмі. Співставляючи аргументи X і Y з аргументами кожного твердження wrіtten_by, Vіsual Prolog виконає пошук від початку програми до її кінця. Виявивши твердження, що відповідає цільовому, Vіsual Prolog зв’язує вільні змінні із значеннями таким чином, що твердження цілі й бази знань стають ідентичними. Говорять, що цільовий предикат уніфікується із предикатом програми. Така операція співставлення називається уніфікацією.
Оскільки X і Y є вільними змінними в цільовому предикаті, а вільна змінна може бути уніфікована з будь-яким іншим аргументом (і навіть із іншою вільною змінною), то цільовий предикат може бути уніфікованим з першим предикатом wrіtten_by у програмі, як показано нижче:
written_by(X,Y).
written_by(fleming,"DR NO").
Visual Prolog встановлює відповідність, X стає зв’язаним з fleming, a Y – із “dr no”. Тоді Visual Prolog надрукує:
X=fleming, Y="DR NO"
Оскільки система шукає всі рішення для заданої цілі, цільове твердження також буде уніфіковано ще й із другим твердженням written_by:
written_by(melville, "MOBY DICK").
Система надрукує і друге рішення:
X=melville, Y="MOBY DICK"
2 Solutions
Розглянемо, як Vіsual Prolog виконає наступне цільове твердження:
long_novel(X).
Коли Vіsual Prolog намагається виконати цільове твердження, він перевіряє, чи дійсно виклик може відповідати факту або заголовку правила. У нашому випадку встановлюється відповідність із
long_novel(Tіtle)
Vіsual Prolog перевіряє предикат для long_novel, намагаючись завершити співставлення уніфікацією аргументів. Оскільки в цільовому твердженні X - вільна змінна, то вона може бути уніфікована з будь-яким іншим аргументом. Tіtle також не є зв'язаним у заголовку правила long_novel. Тому цільове твердження відповідає заголовку правила, і уніфікація здійснюється. Згодом Vіsual Prolog намагатиметься погодити підцілі із правила
long_novel(Tіtle) :- wrіtten_by(_, Tіtle),
book(Tіtle, Length), Length>300.
Намагаючись виконати тіло правила, система звернеться до першої його підцілі - wrіtten_by(_, Tіtle). Оскільки авторство книги є несуттєвим, на місці аргументу author з'явиться анонімна змінна (_). Звернення wrіtten_by (_, Tіtle) стає поточною підціллю, і Пролог шукає рішення для неї.
Пролог шукає від вершини й до кінця програми відповідність із даною підціллю. У результаті досягається уніфікація з першим фактом для wrіtten_by, а саме:
written_by(_, Title),
written_by (fleming, "DR NO").
Змінна Tіtle зв'язується з "DR NO", і до наступної підцілі book (Tіtle, Length) звернення виконується вже із цим значенням змінної. Далі Vіsual Prolog починає черговий процес пошуку, намагаючись знайти відповідність зі зверненням до book. Оскільки Tіtle зв'язаний з "DR NO", фактичне звернення виглядає як book("DR NO", Length). Процес пошуку знову починається з вершини програми. Зауважимо, що перша спроба співставлення із фактом book("MOBY DІCK", 250) завершиться невдало, і Vіsual Prolog перейде до другого факту book у пошуку відповідності. Тут заголовок книги відповідає підцілі, і Vіsual Prolog зв'язує змінну Length із константним значенням 310.
Тепер поточною підціллю стає третє твердження в тілі long_novel:
length > 300.
Vіsual Prolog виконує успішне порівняння двох числових констант: 310 більше, ніж 300. У цей момент всі підцілі в тілі правила виконано, і, отже, запит long_novel(X) успішний. Оскільки X у запиті був уніфікований із змінною Tіtle у правилі, то значення, з яким зв'язується Tіtle, повертається і уніфікується зі змінною X. Змінна Tіtle у випадку підтвердження правила має значення "DR NO", тому Vіsual Prolog виведе:
X="DR NO"