
- •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. Предикати, що працюють з атрибутами файлів
- •Література
3.4. Терми
Будь-який елемент програми на Пролозі називають термом. До термів відносять: змінні, константи, об’єкти, функтори, предикати.
3.4.1. Константа
Константа – це дане, котре не може змінити свого значення під час роботи програми. Константи бувають іменовані і неіменовані.
Неіменовані константи записуються прямо у виразі в програмі.
Наприклад, Col (X, Y):- Y=X+10 , де 10 не іменована константа.
Іменовані константи записуються в секції Constants.
Тип константи визначається з форми її запису.
Наприклад: Constants
N=14.
Іменовану константу зручно використовувати в програмі. При корегуванні програми не треба переглядати всю програму, достатньо відкоригувати константу в секції Constants.
Константи можуть бути стандартними. Стандартні константи використовують стандартні предикати.
ЗМІННА
Змінна може змінювати своє значення під час роботи програми. Тобто змінна може набувати будь-яких значень, визначених контекстом програми.
Проводжуючи аналогію між твердженням на Пролозі і реченням на природній мові, можна сказати, що змінній в твердженні на Пролозі відповідає займенник в реченні на природній мові. Значення займенника теж визначається контекстом речення. Наприклад: Книгу „Господар обручок” написав Р. Толкієн. Він був професором університету. Займенником „Він” означає Р. Толкієн.
Предикатом зі змінною можна записувати твердження в яких є квантор загальності, або квантор існування.
Щоб відрізняти змінну від константи, змінну пишуть з великої букви.
Змінна предикату (якщо він не оголошений у глобальній секції), має значення, доступне тільки в твердженні, що містить предикат. Тобто змінна предикату – локальна.
Тип змінної визначається в предикаті користувача або закріплено в стандартному предикаті, в якому вона використовують.
Змінна може бути вільною або конкретизованою значенням. Розглянемо приклад програми, де є змінні вказаних доменів.
Завдання: Вивести на екран прізвище студента з № залікової книжки 2034.
Predicates
reader (string, integer )
do (string, int
Goal
Do (F, 2034), write(F).
Clauses
reader (“Іванов”,1567).
reader (“Петров”,2034).
do (F,K):-reader (F,K).
Змінна F, що задається в цілі вільна на початку роботи програми. Область її дії тільки цільове твердження. Вона має тип string, як вказано в об’яві предикату do для першого аргументу. Другий аргумент предикату константа типу integer - 2034.
Область дії змінних F та К з правила тільки правило. Ці змінні теж вільні на початку роботи програми. Типи змінних F та К з правила визначаються описом предикату do з секції Predicates.
Кожна з локальних змінних розташовується у стеку і існує тільки під час роботи з твердженням. Зв’язок між твердженнями встановлюється під час співставлення цілі і голови правила(умовного твердження) або цілі і факту.
Зіставлення предикату do з цілі із предикатом do із правила, встановлює зв'язок між відповідними вільними змінними і конкретизує змінну К числом 2034.
F цілі --- F правила
2034 цілі --- K правила
При зіставленні константи і вільної змінної, вільна змінна конкретизується константою.
При зіставленні вільних змінних вони зчіплюються. Це зчеплення тримається доти, доки одна зі змінних у ланцюжку не буде конкретизована. Як тільки одна змінна в ланцюжку конкретизується, конкретизуються й інші змінні в цьому ланцюжку.
Взагалі конкретизація змінної виконується в двох випадках:
При зіставленні предикатів різних тверджень.
При використанні предикату “=”.
Предикат „=”
Предикат „=” працює в двох режимах:
для привласнювання змінній значення;
для порівняння значень виразів.
Приклад використання предикату „=” для привласнювання.
Завдання: Збільшити число 105 на 1 і результат вивести на екран.
Goal
Go (105).
Clauses
Go (K):- К1 = К+1, write(K1). , де К1- вільна перемінна, а К конкретизована змінна.
Приклад використання предикату для порівняння значень виразу. Завдання: Ввести з клавіатури число. Перевірити, чи дорівнює воно 16*2.
Goal
Readln(N),Go(16,N).
Clauses
Go(K, K1):- K1 = K * 2, write(“Дорівнює”). , де К і К1 конкретизовані змінні.