
- •1. Вступ в логічне програмування
- •1.1. Виникнення логічного програмування
- •1.2. Сучасний стан логічного програмування
- •Опис задачі на пролозі. Факти і правила
- •2.1. Опис задачі на пролозі
- •2.2. Факти
- •Цільове твердження
- •Умовні твердження
- •Приклад програми на пролозі
- •2.6. Виконання програми на пролозі
- •2.7. Статична та динамічна бази даних
- •2.8. Підготовка фактів для внутрішньої бази даних
- •2.9. Опис фактів внутрішньої бази даних
- •2.10. Предикати роботи з внутрішньою базою даних
- •2.11. Приклади використання внутрішньої бази даних
- •3. Основні поняття visual-prolog
- •3.1. Загальні відомості
- •3.3. Домени елементарних об’єктів
- •3.4. Терми
- •3.4.1. Константа
- •Анонімна змінна
- •3.4.3. Структури
- •3.5. Програма на пролозі
- •4. Механізми прологу
- •Механізм узгодження цілі з базою даних
- •4.2. Механізм звороту
- •4.3. Механізм звороту і відсік
- •4.4. Рекурсія
- •4.4.1. Рекурсивний метод розв’язку задач
- •Рекурсивні методи 2-х доменів:
- •Застосуємо висхідний метод рекурсії до розв’язку задачі:
- •Висхідна рекурсія
- •4.4.4. Предикат repeат
- •Міркування про те, як треба писати програму
- •5. Обробка рядків
- •5.1. Загальні відомості
- •1.1 Стандартні предикати обробки рядків
- •5.3. Лексиграфічне порівняння рядків
- •2Низхідна рекурсія
- •6.1. Метод низхідної рекурсії
- •6.2. Загальна характеристика рекурсивних методів
- •6.3. Низхідна та висхідна рекурсії
- •7. Робота зі списками
- •7.1. Списки. Оголошення списків
- •7.2. Увід-вивід списків
- •7.3. Основна операція на списках
- •7.4. Формування списків стандартним предикатом
- •Процедура з’єднує два списки.
- •Процедура розділяє список на два за вказаним елементом.
- •2.1 Сортування списків на пролозі
- •Сортування методом пухирця
- •7.8. Складені списки
- •8. Предикати вводу-вивіду
- •8.1. Предикати вводу
- •8.2. Предикати виводу
- •9. Файли
- •9.1. Символічне ім’я файлу
- •9.2. Вхідний і вихідний потоки
- •9.3. Організація файлу та методи доступу до файлу
- •9.4. Робота з файлами різними методами доступу
- •9.5. Закриття файлу
- •9.6. Предикати роботи з каталогами
- •9.7. Предикати, що працюють з атрибутами файлів
- •Література
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 твердженнях. Значення Х буде виведено один раз.