- •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. Предикати, що працюють з атрибутами файлів
- •Література
6.2. Загальна характеристика рекурсивних методів
Рекурсивні методи мають ряд переваг перед ітераційними методами при реалізації операцій, що повторюються:
Ними зручно оброблювати рекурсивні дані.
За допомогою рекурсії можна реалізувати такі алгоритми, які не можна реалізувати ітерацією. При ітераційному методі змінна не зберігає свого значення від однієї ітерації до другої. При рекурсії значення змінних автоматично зберігаються для кожного рівня виклику у стеку.
Рекурсивна програма більш компактна.
6.3. Низхідна та висхідна рекурсії
Порівняємо низхідний і висхідний типи рекурсії:
Рекурсивна процедура, що написана висхідним методом рекурсії, може мати всередині предикати з декількома рішеннями. Такий тип рекурсивної процедури використовує стек. При поверненні з рекурсивного предикату змінні зі стеку звільнюються. Тому для збереження рішення використовують додаткові змінні. Низхідний метод додаткових змінних не вимагає.
При утворенні нового списку зі старого, висхідний метод змінює порядок елементів на зворотний. Низхідний метод зберігає порядок елементів в списку.
При утворенні нового файлу зі старого, висхідний метод залишає порядок компонент файлу. Низхідний метод змінює порядок компонент файлу на зворотний.
При роботі з рядками порядок елементів залежить від засобів, якими користується програміст. Предикат Concat дозволяє приєднувати до рядку інший рядок як з початку, так і в кінець. Предикати Frontchar та Fronttoken приєднують рядок тільки з початку.
7. Робота зі списками
7.1. Списки. Оголошення списків
Списком називають об’єкт, що має впорядкований набір інших об’єктів. Список може мати будь-яке скінчене число об’єктів. В Пролозі об’єкти списку можуть бути усякого типу, але всі об’єкти повинні бути одного типу. Такі списки називають однодоменними.
Кожний об’єкт списку називають елементом. Списки можуть містити елементи, що повторюються. Список записується у квадратних дужках і кожний елемент відокремлюється комою.
Наприклад список цілих чисел: [1, 2, 5, 7, 3, 2]. Порожній список записується [ ].
Перший елемент списку називають головою списку. Якщо відокремити від списку перший елемент, то залишок списку теж список. Такий залишок називають хвостом списку.
За першими буквами слів Head(голова) та Tail(Хвіст) в літературі прийняті позначення голови – Н, хвоста – Т. Однак, програміст може вибирати будь-які ідентифікатори для елементів списку або хвосту.
Тип списку визначається в секції Domains:
Domains
list = integer * /*список цілих чисел */
list1 = char* /*список символів */
Ідентифікатор типу список задає користувач. Він записується перед „=”. В наших прикладах: list, list1. Після „=” записується тип елементів списку. Для першого прикладу тип елементів integer для другого прикладу char. Символ „*” означає, що об’являється список.
Пролог дозволяє оголошувати тип список списків.
Наприклад:
Domains
lst1 = integer *
lst = lst1*
Щоб визначити список з елементами різних доменів, треба об’явити типом елементу складений тип. До складеного типу можуть відноситися елементи різних доменів.
Наприклад:
Domains
d = kol( integer);
ves( real);
fam(string)
lst=d*
Список визначеного типу може бути:
[fam(“Петренко”),kol(4), ves(30.2), fam(“Ким”), kol(2), ves(12.3)]