- •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.2. Увід-вивід списків
Для введення списків використовують універсальний предикат: readterm(тип списку, Змінна).
Розглянемо приклад вводу списку.
Domains
list1=char*
Predicates
do (list1)
Goal
readterm (list1, L), do(L).
Clauses
do (L):- write(“Список ”,L).
Вводиться список: [‘5’, ‘1’, ‘3’]
Вивід списку виконують стандартним предикатом write:
Список [‘5’, ‘1’, ‘3’]
7.3. Основна операція на списках
Пролог розглядає списки типу стек. Тому з елементами списку працюють через голову списку. Для того, щоб працювати з елементом списку, треба спочатку відкинути попередні елементи списку, зробивши цей елемент головою списку.
Для відсіку голови списку, його подають у вигляді структури:
[H | T], де подовжена двокрапка “|” - основна операція на списку.
Відсік голови списку застосовують у двох випадках:
При співставленні предикатів;
При співставленні списків.
Розглянемо приклад відсіку голови списку при співставленні предикатів.
Завдання: Ввести список. Вивести на екран голову і хвіст списку.
Domains
sp= real*
Predicates
prnt (sp)
Goal
readterm (sp, L), prnt (L).
Clauses
prnt ([H | T]):- write(H), nl, write (T).
Введемо список: [3, 5, 7, 9]. При співставленні змінної L, яка конкретизована введеним списком , і структури в голові правила, список поділяється на голову Н=3 і хвіст Т=[5, 7, 9].
Вивід: 3
[5, 7, 9]
Співставлення списків може виконуватися предикатом „=”.
Розглянемо завдання: Ввести список. Вивести на екран голову і хвіст списку.
Domains
Sp= real*
Goal
Readterm (sp, L), L = [H | T], write (H,’ ‘, T).
Введемо список [7]. При співставленні змінної L, яка конкретизована введеним списком , і структури в голові правила, список поділяється на голову Н=7 і хвіст Т=[].
Вивід: 7
[]
Основна операція на списку працює залежно від конкретизації змінних в різних режимах. Режими роботи операції аналогічні режимам роботи предикату frontchar:
Змінна L конкретизована, а змінні Н та L вільні.
Тоді операція L=[H|T], працює на відсікання голови в списку.
Приклад1: do:- L = [1,2,3], L = [H|T], write (H), nl, write (T).
Вивід: Н= 1, Т=[2, 3].
Приклад2: do:- L=[ ], L = [H|T].
Порожній список не можна поділити на голову і хвіст. Операція повертає fail.
Приклад3: do:- L = [[1],[2],[3]], L = [H|T], write (H), nl, write (T).
Вивід: Н= [1], Т=[[2], [3]].
У прикладі подано список списків. Тому елемент списку також список.
Змінні Н і Т конкретизовані: H=2, T=[3, 5], а L вільна змінна. Тоді операція L = [H|T], приєднує елемент Н до початку Т.
Приклад: do : - H=2, T = [3, 5], L = [H | T], write (L).
Вивід: [2, 3, 5].
Операція „|” може працювати на порівняння конкретизованої змінної Н та голови списку. При вірному порівняні вільна змінна Т конкретизується хвостом списку.
Приклад1: do : - L=[1, 2, 3], H=1, L=[H | T], write (Т).
Значення змінної Н дорівнює голові списку. Змінна Т одержує значенням хвіст списку. Вивід: [2, 3].
Приклад2: do : - L=[1, 2, 3], H=2, L=[H | T].
Значення змінної Н не дорівнює голові списку. Предикат повертає fail.
Операція „|” може працювати на порівняння конкретизованої змінної Т та хвоста списку. При вірному порівняні вільна змінна Н конкретизується головою списку.
Приклад1: do : - L=[1, 2, 3], Т=[2, 3], L=[H | T], write (Н).
Значення змінної Т список [2, 3] дорівнює хвосту списку. Змінна Н одержує голову списку. Вивід: 1.
Приклад2: do : - L=[1, 2, 3], Т=[1, 3], L=[H | T].
Значення змінної Т список [1, 3] не дорівнює хвосту списку. Предикат повертає fail.
Операція „|” може працювати на з’ясування чи складається список з вказаних частин. При вірному порівняні операція повертає TRUE.
Приклад: do : - L=[1, 2, 3], H=1, T=[2, 3], L=[H | T].
У списку можна виділити відразу 2, 3 голови, а хвіст завжди один
Приклад: do : - L = [1, 2, 3, 4], L = [H1, H2 | T],
write (H1,’ ‘,H2,’ ‘,T).
Вивід: 1 2 [3, 4].