
- •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. Предикати, що працюють з атрибутами файлів
- •Література
4.4.4. Предикат repeат
Організувати дії, що повторюються можна за допомогою рекурсивного предикату Repeat.
Означення предикату має вид:
Repeat .
Repeat :- Repeat .
Предикат використовують в таких процедурах, де немає предикатів з декількома розв’язками, проте необхідно повторювати дії за допомогою механізму звороту.
Приклад: Написати програму, що обчислює корінь квадратний для кожного введеного числа.
Predicates
Repeat
Do
Control (integer)
Goal
Do.
Clauses
Repeat.
Repeat :- Repeat.
Do:- repeat, readint(N), control(N).
Сontrol (N):- N=0;
K= sqrt (N), write (K), nl, fail.
Кожний раз після обчислення коріння механізм звороту повертає керування на предикат Repeat. Предикат може пере узгоджуватися скільки – завгодно раз, бо компілятор перетворює просту рекурсію на ітерацію. Програма закінчить свою роботу по вводу 0.
Предикат Repeat невідомий Прологу, тому програміст повинен сам дати означення предикату. Предикат не зобов’язаний мати вказане ім’я.
Наприклад: Clauses
r.
r :- r.
Міркування про те, як треба писати програму
Програму на Пролозі пишуть за таким планом:
Описати факти, які подано у завданні.
Для цього треба:
Визначити об’єкти і відношення між об’єктами.
Визначити за мнемонікою функтор предиката для факту і типи даних для аргументів предикату.
З'ясувати, що потрібно знайти в завданні, і які для цього потрібні укрупнені дії.
Визначити предикат для кожної дії.
Для цього треба:
Визначити функтори предикатів.
Визначити для кожного предикату вхідні і вихідні дані.
4. Визначити метод рекурсії для повторюваних операцій у кожному предикаті. Використовуйте механізм звороту там, де це можливо.
При написанні програми треба визначити призначення кожного правила і факту, призначення гілок правил.
5. Обробка рядків
5.1. Загальні відомості
У Пролозі розглядаються типи: String для рядків та Symbol для ідентифікаторів.
Об’єкти даних доменів String та Symbol містять дані і методи, які працюють з цими даними. Тобто для рядків існують ряд стандартних предикатів - методів, які оброблюють дані цих доменів.
Типи String та Symbol сумісні і автоматично перетворюються друг в друга, якщо довжина рядку String не виходить за дозволену для рядку типу Symbol. Пролог дозволяє працювати з рядками типа string довжиною <= 64 КБ.
Рядок типу String може містити між лапками будь-які символи. Наприклад, ”Пролог V 2.0”.
Завдяки використанню керуючого символу ”\” всередині рядка типу String, можна записувати коди символів, будь-які керуючі символи. Наприклад, “\65\13”. Символи “\n” переводять курсор в начало наступного рядку.
Рядок типу Symbol записується за правилами запису ідентифікатора. Рядок записується без лапок, починається з маленької англійської букви чи підкреслення містить англійські букви, цифри та підкреслення. Довжина рядку типу symbol <= 250.
Використання констант типу String робить Exe.програми великими. Скільки раз константа зустрічається в програмі, стільки разів вона резервується в пам'яті. Тип Symbol – зберігається як рядок таблиці і Пролог звертається до цього рядка за індексом. У таблиці рядок зберігається один раз.
В Пролозі типи String і Symbol не сумісні з типом Char.