- •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. Предикати, що працюють з атрибутами файлів
- •Література
2.7. Статична та динамічна бази даних
Факти і правила, які описано в секції Predicates, називають статичною базою даних. Такі твердження компілюються в бінарний код і їх не можна змінювати під час роботи програми.
Visual Prolog дозволяє також завантажувати факти з текстового файлу, додавати або вилучати їх під час роботи програми. Для зміни факту внутрішньої бази даних його вилучають і замінюють іншим. Такі факти називають внутрішньою базою даних або динамічною базою даних.
Факти внутрішньої бази даних описують в секції Facts. Ці факти використовуються так само, як факти статичної бази даних.
Завантаження фактів під час роботи програми дозволяє економити оперативну пам’ять і прискорювати роботу програми, тому що можна завантажувати тільки ті факти, що необхідні в певний час. Завантаженою внутрішньою базою даних можуть користуватися всі програми, що виконуються під час одного сеансу Visual Prolog.
2.8. Підготовка фактів для внутрішньої бази даних
Внутрішня база даних Visual Prolog повинна містити тільки факти. Факти можна розташувати в секції Clauses або підготовити текстовим редактором у файлі, окремо від програми. Їх утворюють за наступними правилами:
Кожний факт розташовується в окремому рядку. Факти повинні відображуватися тільки в тому форматі, в якому записує в файл предикат Save.
Факти, що утворені одним предикатом, повинні розміщатися підряд.
Факти можуть мати великі букви тільки усередині рядкових даних.
Факти можуть мати пропуски тільки усередині рядкових даних.
Факти не можуть мати константи типу symbol.
В файлі не можна розміщувати коментарії.
Файл не може мати порожніх рядків.
Наприкінці факту крапка не обов’язкова.
2.9. Опис фактів внутрішньої бази даних
Факти, що завантажуються динамічно, описуються в секціях Facts. У програмі на Visual Prolog може бути одна неіменована секція Facts і декілька іменованих секцій Facts. Ідентифікатори іменованих секцій обирає програміст. По замовчанню ім’я неіменованої секції Facts dbasedom.
Опис фактів в секції Facts має такий же синтаксис як в секції Predicates. Секції Facts розташовують за принципом: опис об’єкту записується перед застосуванням об’єкту.
Розглянемо приклади опису фактів.
Приклад неіменованої секції Facts:
Domains
nazva = char
koord_x, koord_y = integer
Facts
koord(nazva, koord_x, koord_y)
rast(real)
Приклад іменованої секції Facts:
Facts – figura
Krug(integer, real)
Kvadrat(integer)
Ім’я іменованої секції записується за правилом ідентифікатору.
В одній і тій же секції Facts може бути об’явлено скільки завгодно предикатів. Факти, що об’явлені в секції Facts, можуть розміщуватися в одному файлі або різних файлах.
На роботу стандартних предикатів, які працюють з динамічною базою даних впливають ключеві слова nondeterm, determ, single.
Кожний предикат, який описано в секції Facts, по замовчанню вважається nondeterm (не детермінованим), тобто за допомогою предикату можна записати більше одного факту. Для таких предикатів компілятор вказує, що предикат може бути декілька розв’язків. Ця інформація використовують при роботі механізмів Прологу.
Якщо користувач бажає вказати, що для предикату буде існувати не більше одного факту (0 або 1), то вказують:
Facts
determ sum (real)
Пролог контролює такі факти і не дозволяє заносити другий такий факт.
Для вказівки, що з предикатом буде існувати один і тільки один факт, то вказують:
Facts
single dobutok (real)
Факт з ознакою singl не можна вилучати. Пролог контролює цю помилку на етапі компіляції, тому факт розташовують в секції Clauses при написанні програми(ініціалізація факту). Виклик такого факту завжди істинний, якщо його аргументи вільні змінні. Такий факт можна змінювати за допомогою предикатів assert, assertz, asserta, consult. Вказані предикати вилучають предикат і вставляють новий.
Функтори предикатів в межах одного модуля не повинні повторюватися. Тобто, в двох різних секціях Facts не можна вказувати один функтор. Не можна також вказувати один функтор в секціях Predicates i Facts.
Якщо програма складається з декількох модулів, то неіменована секція Facts повинна бути глобальною: Global Facts. Ця вимога не потрібна при застосовуванні під час компіляції утиліти Test Goal.
