- •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. Предикати, що працюють з атрибутами файлів
- •Література
7.4. Формування списків стандартним предикатом
Предикат Findall(Змінна, Факт, Список)
Предикат findall розглядає групу певних фактів. Вибирає значення вказаного аргументу для кожного факту і формує з цих значень список.
Аргумент „Факт” задає які факти розглядати. Аргумент „Змінна” вказує на аргумент факту, значення якого вибирається. Аргумент „Список” одержує сформований список.
Наприклад.
Завдання: Сформувати список прізвищ пасажирів літаку, у яких відсутній багаж.
Predicates
Do
Bag(string, integer, real)
Goal
Do.
Clauses
Bag(“Кузенко”,10,10.0).
Bag(“Крот”,0,0.0).
Bag(“Михайлов”,12,6.4).
Bag(“Грач”,0,0.0).
Do:- findall(F, bag(F,0,_), L), write(L).
7.5. СПИСКИ І МНОЖИНИ
Множини можна подавати списками. При роботі з такими списками треба пам’ятати:
1 В множині немає елементів, що повторюються.
2 Для множини не важливий порядок елементів.
7.6. ПРОЦЕДУРИ РОБОТИ ЗІ СПИСКАМИ
Список рекурсивний об’єкт, тому що хвіст списку теж список. Такі структури зручно оброблювати рекурсивними процедурами.
Подамо список у формі дерева, що дозволить зрозуміти рекурсивність списку.
Розглянемо список [3, 1, 5, 11]. Розділимо список на голову і хвіст. Хвіст списку в свою чергу теж список. Його теж можна розділити на голову і хвіст. Процес можна повторювати до тих пір, поки список не стане порожнім.
[3, 1, 5, 11]
3 [1, 5, 11]
1 [5, 11]
5 [ 11]
11 []
Зображене дерево бінарне, але можна відокремлювати зразу декілька голів.
Розглянемо приклад програми, яка виводить на екран елементи списку в зворотному порядку. Програма написана низхідним методом рекурсії.
Domains
Lst = integer*
Predicates
Do (lst)
Goal
Do([3, 1, 5, 11]).
Clauses
Do ([]).
Do ([H|T]):-do (T), write (H).
При зіставленні цілі Do([3, 1, 5, 11]) з секції Goal з умовним твердженням Do ([H|T]) змінна Н конкретизується 3, а Т=[1, 5, 11] і значення змінних зберігаються у стеку. Далі процедура Do викликається з хвостом списку – Т = [1, 5, 11]. Процес зображено у вигляді дерева, що подано вище і закінчується узгодженням цілі do (T) з фактом, коли список стане порожнім.
Тобто ціль do (T) стає істинною і може бути виконана наступна процедура write. Процедура write виводить верхній елемент стеку, який є останнім елемент списку. Після виводу елементу він вилучається зі стеку і верхнім елементом стеку стає другий з кінця списку. Тобто елементи списку будуть виводитися в зворотному порядку.
Стандартні рекурсивні процедури
Нижче подано стандартні рекурсивні процедури, відомі з літератури. Але Visual Prolog їх не знає, тому для використання їх треба визначати в програмі.
Процедура „Належить”
Процедура перевіряє чи входить елемент у список:
Domains
list = integer*
Predicates
in (integer, list)
Goal
readterm (list, L)
readint (N), in (N, L),
write (“Входить ”, N,” в ” L);
write (“Не входить ”).
Clauses
in (H, [H | _] ).
in (X, [_ | T] ): - in (X, T).
Граничною умовою рекурсивної процедури є факт: елемент знайдено.
Рекурсивна умова виконується, якщо елемент не знайдено. Пошук продовжується у хвості списку.
Процедура “ Приєднати (pr) ”
Процедура працює в трьох режимах залежно від завдання цілі: