Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекц по Visual Prolog.doc
Скачиваний:
4
Добавлен:
02.05.2019
Размер:
937.47 Кб
Скачать

4.2. Механізм звороту

Часто поточне цільове твердження може бути зіставлено з декількома твердженнями. Такі твердження називають точками розв’язку цільового твердження.

Механізм звороту (backtracking) дозволяє переузгоджувати ціль, якщо попередня точка розв’язку не підходить. Переузгодження може виконуватися двома способами:

  • Ціль, що зіставлялася з умовним твердженням, може перелагоджуватися з іншим умовним твердженням чи фактом при прямому трасуванні.

  • Розглядається кон’юнкція цілі в тілі правила чи в секції Goal при пошуку вглиб. Механізм звороту виконує переузгодження попередньої цілі, якщо поточна ціль не узгоджується.

В нашому прикладі розглянуто другий варіант.

Як видно з прикладу, при роботі механізму звороту виконуються дії:

  • У випадку невірного предикату передається керування на найближчий ліворуч предикат, що має ще розв’язки.

  • Звільнюються змінні, що одержали в цьому предикату значення або після нього.

  • Предикат перелагоджується і знову узгоджуються цілі, які стоять праворуч нього.

  • Якщо у найближчого ліворуч предиката всі розв’язки вичерпано, то вибирається предикат, що стоїть далі ліворуч, тощо. Процес повторюються до тих пір поки для всіх умов в тілі правила розв’язки будуть вичерпані.

У Пролозі немає стандартних предикатів для виконання повторюваних операцій. Повторювані операції можна виконати за допомогою механізму звороту. Для цього використовують за відомо невірну умову - стандартний предикат fail. Застосування предикату fail для дій, що повторюються показано в попередньому прикладі.

4.3. Механізм звороту і відсік

Часто механізм звороту включається автоматично і шукає такі розв’язки, які непотрібні. Щоб виключити механізм, використовують стандартний предикат !(відсік).

Відсік можна також використати щоб:

  • обмежити нескінченні цикли;

  • усунути протилежні за змістом твердження;

  • рішення одержано, завершити породження розв'язків і перевірки;

  • закінчити роботу процедури при збою( комбінація "!,fail");

Предикат відсік завжди істинний. Його призначення вилучати маркери на предикатах, які мають декілька розв’язків.

Робота предикату „Відсік”:

  • При виконанні предикату „Відсік” вилучаються маркери на предикатах, які мають декілька розв’язків і, які стоять в тілі правила ліворуч відсіку.

  • При виконанні предикату „Відсік” вилучаються маркери на інших твердженнях процедури, що стоять нижче твердження з відсіком і утворенні за допомогою того ж предикату, що і твердження з відсіком.

Розглянемо приклад.

Clauses

Calc (X):- X<10, Write(X).

Calc (X):- X<20, Write(X).

Calc (X):- X<30, Write(X).

Goal

Calc (5), fail.

Дана процедура виведе на екран тричі значення Х тому, що предикат fail включає механізм звороту. Щоб усунути зайві розв’язки запишемо процедуру з використанням відсіку.

Clauses

Calc (X):- X<10, Write(X), !.

Calc (X):- X<20, Write(X), !.

Calc (X):- X<30, Write(X).

Goal

Calc (5), fail.

Ціль узгоджується з першим твердженням, а відсік витирає маркери на 2 і 3 твердженнях. Значення Х буде виведено один раз.