Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / ЛЕКЦИИ / POSIBNIK / ПРОГР НА ПРОЛОГЕ.doc
Скачиваний:
42
Добавлен:
23.03.2015
Размер:
669.7 Кб
Скачать

1.4. Приклад доказу в пролозі

ПРОЛОГ починає роботу, якщо йому задано ціль. Ціль не є частина бази даних ПРОЛОГу, а служить для вказівки інтерпретатору ПРОЛОГу того, що йому необхідно довести.

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

Розглянемо поводження інтерпретатора ПРОЛОГу на прикладі, (рис. 3).

База даних (програма) : Ціль:

любить(марія, персики). любить(тетяна, Що)

^2 любить(марія, горішки).

^4 любить(марія, яблука). Відповідь:

любить(тетяна, X):- ЩО = яблука

любить(марія, X), ЩО = горішки

фрукти(X),

колір(X, червоний). 2 розв’язку

^1 любить(тетяна, X):-

любить(марія, X),

X = горішки.

фрукти(персики).

^3 фрукти(яблука).

колір(персики, жовтий).

колір(апельсини, оранжевий).

колір(яблука, червоний).

^5 колір(яблука, жовтий).

Рис. 3. Приклад доказу в ПРОЛОЗі

Розглянемо, як відбувається доведення даної цілі. Переглядаючи програму, зверху вниз, ПРОЛОГ намагається зіставити ціль із твердженнями, що зберігаються в базі даних. Перше твердження, з яким вихідна ціль може зіставитися, – це

любить(тетяна, X):-

любить(марія, X),

фрукти(X),

колір(X, червоний).

Це твердження – правило, тому ціль буде зіставлена з ним, якщо будуть доведені всі підцілі, що входять до тіла правила. Оскільки рішення питання про істинність цілі відкладається, ПРОЛОГ дивиться, чи є далі твердження в базі даних, що можуть бути використані при доведенні цілі, якщо перший шлях не приведе нас до результату. Таке твердження є – це правило

любить(тетяна, X):-

любить(марія, X),

X = горішки.

Тому біля цього твердження ПРОЛОГ ставить перший покажчик відкоту ^1.

Після цього ПРОЛОГ приступає до узгодження підцілей даного правила. Перша підціль – це “любить(марія, X)”. Її доводять за тією самою схемою. Тобто, починаючи з першого твердження бази даних, ПРОЛОГ намагається знайти в базі даних твердження, з яким ця ціль може зіставитися. Перше твердження “любить(марія, персики)” якраз підходить. Оскільки правило, яке згенерувало цю підціль, згенерувало й інші підцілі, що ще повинні бути доведені, то встановлюється покажчик відкоту ^2, який показує, що існує принаймні ще одне твердження для “любить”, що може бути застосоване для обчислення поточної цілі. У випадку, якщо наступна підціль виявиться неуспішною, механізм відкоту буде мати точку для пошуку іншого кандидата для обчислення цілі. При такому зіставленні X одержує значення “персики”.

Наступна підціль у тілі, що вимагає доказу, – це “фрукти(X)”, що при “X = персики” має вигляд “фрукти(персики)”. Пошук доказу цієї цілі знову починається з початку бази даних. Перше придатне твердження – це “фрукти(персики)”. Так як існують інші альтернативи для цілі з функтором фрукти, ПРОЛОГ встановлює покажчик відкоту ^3 і приступає до доказу цілі “колір(персики, червоний)”. Ця спроба завершується невдало (у базі даних немає інформації про червоні персики).

Далі зробимо відкіт аж до покажчика ^2, запам'ятовуючи нову точку відкоту ^4. Так буде продовжуватися доти, поки при “X = яблука” ціль не буде досягнута. ПРОЛОГ видає відповідь X = яблука. Оскільки була використана зовнішня ціль (у вікні Dialog інтегрованого середовища), то ПРОЛОГ продовжує пошук інших розв’язків для цієї цілі. Для цього змінна X стає вільною (і отже, може бути конкретизована іншими значеннями).

Пошук розв’язку знову починається з останнього покажчика відкоту. Це покажчик ^1.

Тепер пошук починається з правила

любить(тетяна, X):-

любить(марія, X),

X = горішки.

Перша підціль є “любить(марія, персики)”. X одержує значення “персики”. Далі набирає сили друга підціль, що тепер має вигляд “персики = горішки”. Терми непорівнянні, тому підціль хибна і змінна X знову звільняється. Здійснюється відкіт до факту “любить(марія, горішки)”. X одержує значення “горішки”. Остання підціль тепер має вигляд “горішки = горішки”. Відповідь – “так” і оскільки ця підціль остання в правилі, то ПРОЛОГ видає відповідь “X = горішки”.

Змінна X звільняється і ПРОЛОГ здійснює відкіт до останнього покажчика і намагається знайти новий розв’язок. Нагадаємо, що даний шлях слугує альтернативою для другої підцілі другого правила для підцілі “любить”, тобто маємо підціль “любить(марія, X)”. Після твердження “любить(марія, горішки)” нам підійде твердження “любить(марія, яблука)”. Тому X набуває значення “яблука”. Перевіряючи другу підціль “яблука = горішки”, ПРОЛОГ її відкидає, а оскільки ніяких інших покажчиків відкоту немає, ПРОЛОГ підбиває підсумок, видаючи рядок “2 розв’язку” у вікно діалогу.