- •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.10. Предикати роботи з внутрішньою базою даних
Завантаження фактів з файлу під час роботи програми виконується за допомогою предикату consult.
Consult (“Ім'я_файлу”, Ім'я_Facts) -
(string, symbol) завантажує факти, що описані в іменованій секції.
Consult (“Ім'я_файлу”) - завантажує файли,
(string) що описані в неіменованій секції.
Виконуюча програма Visual Prolog зчитує по одному факту. При завантаженні факти компілюються і розміщуються в кінець внутрішньої бази даних. Факти внутрішньої бази даних можна використовувати як звичайні факти, які описано в секції Predicates. При вводі факту з помилкою видається повідомлення, а попередні факти залишаються у внутрішній базі даних.
Факти можна вставляти в кінець групи фактів з вказаним предикатом за допомогою стандартного предикату Assertz і в початок групи фактів з вказаним предикатом за допомогою стандартного предикатом Asserta.
Assertz (факт)
Приклад: assertz ( vlast (“дерево”, ”зелене”))
Assertz (факт, ім’я_facts)
Приклад: assertz ( vlast (“дерево”, ”зелене”), flora)
Asserta (факт)
Приклад: asserta (klass(”список”,”структура”))
Asserta (факт, ім’я_facts)
Приклад: asserta (klass (”список”,”структура” ), dani)
Для сполучення з більш ранніми версіями у Пролозі існує предикат assert, який тотожний з assertz.
Розглянемо приклад, що додає факт в кінець динамічної бази даних, яку завантажено з файлу :
Facts
Kub(string, string, real)
Predicates
do
Goal
Consult (”F.dat”), do, save(“F.dat”).
Clauses
do: - write (“Ведіть матеріал, колір, довжину ребра ”), readln(Mat), readln(Color), readreal(Dl), assertz (kub (Mat, Color, Dl)).
Предикат Consult завантажує факти з файлу F.dat.
Файл F.dat має такі факти:
kub(“дерево”,”білий”,3.5) (1)
kub(“дерево”,”зелений”,3.4) (2)
Введені з клавіатури дані розміщуються у факті з функтором kub і заносяться в динамічну базу даних після факту (2).
Аналогічно можна додати факт в кінець динамічної бази даних, яка розміщена в секції Clauses. Розглянемо приклад програми.
Facts
Kub(string, string, real)
Predicates
do
Goal
do, save(“F.dat”).
Clauses
kub(“дерево”,”білий”,3.5).
kub(“дерево”,”зелений”,3.4).
do: - write (“Ведіть матеріал, колір, довжину ребра ”), readln(Mat), readln(Color), readreal(Dl), assertz (kub (Mat, Color, Dl)).
Після роботи програми у файлі F.dat зберігаються факти з секції Clauses в кінці котрих розташовано новий факт.
Предикати retract та retractall вилучають факти з внутрішньої бази даних.
retract (факт) – вилучає перший факт із вказаним предикатом і вказаними значеннями його аргументів, що зустрічається, від початку внутрішньої неіменованої бази даних. Якщо аргументи предикату задають змінною, то вилучається факт з будь-яким значенням цього аргументу.
Наприклад:
retract (Kub (“дерево”, _, _)) - вилучає перший знайдений факт про кубики, що зроблені з дерева.
retract (Kub (_, _, _)) - вилучає перший знайдений факт про кубики.
retract ( _ ) – вилучає перший факт з будь-яким функтором внутрішньої бази даних.
retract (факт, ім’я_facts) – вилучає перший факт із вказаним предикатом, що зустрічається, від початку внутрішньої іменованої бази даних.
retract (Kub (“дерево”, _, _), igrushki) - вилучає перший знайдений факт про кубики, що зроблені з дерева з бази даних igrushki.
retractall (факт)
retractall (факт, ім’я_Facts) – вилучає усі факти з внутрішньої бази даних(неіменованої або іменованої) із вказаним предикатом і значеннями його аргументів. Дії, які виконує предикат, еквівалентні дії предикату retract, що використовують при роботі механізму звороту.
Предикат retractall завжди істинний.
Наприклад,
retractall (Kub (“дерево”, _, _)) - вилучає всі знайдені факти про кубики, що зроблені з дерева.
Порівняйте: do:- retract(Kub (“дерево”, _, _)), fail.
Використання вільної змінної в предикаті не має сенсу. Тому в предикаті застосовують анонімну змінну.
retractall (Kub (_, _, _)) вилучає всі знайдені факти про кубики.
retractall ( _ ) вилучає всі факти з будь-яким функтором із внутрішньої бази даних.
retractall ( _, flora ) вилучає всі факти з будь-яким функтором з внутрішньої бази даних flora.
В результаті роботи програми динамічна база даних може змінюватися. Для зберігання бази даних призначено предикат save.
Якщо зберігати базу даних з тим же ім’ям, то нова база замінить стару.
save (“F.dat”) – зберегти базу даних з неіменованої секції.
save (“F.dat”, figura) – зберегти базу даних з іменованої секції.