- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •1. Основи мови програмування пролог
- •1.1. Основні поняття
- •1.2. Синтаксис мови пролог
- •1.3. Класифікація даних у пролозі
- •1.4. Приклад доказу в пролозі
- •1.5. Подання задачі у вигляді і-або дерева
- •1.6. Структура програми в системі tp
- •1.7. Убудовані типи даних мови tp
- •1.8. Висновки
- •2. Підстави логічного програмування
- •2.1. Принцип резолюцій
- •2.3. Способи застосування принципу резолюцій
- •2.4. Диз’юнкти хорhа
- •3. Три семантичні моделі пролог-програми
- •4. Подання знань
- •4.1. Процес подання знань
- •4.2. Способи подання бази знань
- •4.2.1. Представлення цілісних інформаційних елементів у вигляді фактів
- •4.2.2. Подання атрибутів у вигляді фактів
- •4.2.3. Представлення знань у вигляді списку структур
- •4.2.4. Подання у вигляді рекурсивних структур
- •4.2.5. Подання у вигляді двійкового дерева
- •4.2.6. Порівняння різних виглядів подання бази даних
- •4.2.7. Компонування даних у список
- •4.3. Використання складених об'єктів
- •4.4. Використання альтернативних доменів
- •4.5. Засоби документування програми
- •4.6. Типи й властивості відношень предметної області
- •4.6.1. Обмеження, що забезпечують цілсність відношень
- •4.6.2. Властивості відношень бази знань і їхня підтримка в програмі на tp симетрія і асиметрія
- •Рефлексивность і нерефлексивность
- •Транзитивність
- •Симетричність і транзитивність
- •Спроба 1
- •Спроба 2.
- •Запам'ятовування списку відвіданих місць
- •4.7. Списки
- •4.7.1. Подання й зображення списків
- •4.7.2. Використання списків
- •4.7.3. Метод поділу списку на голову і хвіст (псгх)
- •4.7.4. Списки списків
- •Методи програмування
- •5.1. Повторення і відкіт (пв)
- •5.2. Метод відкоту після невдачі (впн)
- •5.3. Метод відсікання та відкоту (вв)
- •5.4. Повторення та рекурсія (пр)
- •5.5. Метод узагальненого правила рекурсії (упр)
- •5.6. Побудова рекурсивних структур методом прогресуючої підстановки (пп)
- •5.7. Предикат відсікання
- •5.8. Організація багаторазово виконуваних інтерактивних програм (бвіп)
- •5.9. Метод аналізу станів (ас)
- •5.10. Метод організації висхідних рекурсивних обчислень (вро)
- •5.11. Комбінація спадних і висхідних рекурсивных обчислень (ксвро)
- •5.12. Предикат fail-if (not)
- •5.13. Предикат true
- •5.14. Модифікація бази даних (мбд)
- •5.15. Керування базою даних (кбд)
- •5.16. Глобальні змінні (гз)
- •5.17. Накопичування результатів у базі даних за допомогою вимушеного відкоту і глобальної змінної (нрввгз)
- •5.18. Метапрограмування (мп)
- •Список рекомендованої літератури
- •1. Основи мови програмування пролог 4
- •2. Підстави логічного програмування 14
- •3. Три семантичні моделі пролог-програми 20
- •4. Подання знань 23
- •Програмування мовою пролог
4.7.4. Списки списків
Як уже зазначалося компонентами списків можуть бути списки, причому списки різних доменних типів. Визначимо, наприклад, список, що складається зі списків цілих чисел, списків дійсних чисел і списків тварин. Щоб TP зміг відрізнити один вид списку від іншого, елементи цих списків і сам список слід описати зі спеціальним тэгом (ярличком). Це можна зробити, наприклад, у такий спосіб:
DOMAINS
llist = l(list); ц(integer); д(real); т(symbol)
list = llist *
CLAUSES
список_списків( [
l( [ ц(1), ц(5), ц(7)] ),
l( [ д(3.2), д(4.6), д(5.7), д(1.5) ]),
l( [ т(кішка), т(собака), т( кінь) ])
] ).
список_списків( [
l( [ ц(1), ц(5), ц(7)] ),
т(папуга), ц(9),
l( [ д(3.2), д(4.6), у(5.7), д(1.5) ]),
д(3.14),
l( [ т(кішка), т(собака), т( кінь) ])
] ).
Списки навіть можна чергувати зі скалярними елементами. Тобто llist – це список списків і скалярних елементів заданих доменних типів. Альтернативи при описі такого типу розділяються символом “;”.
Методи програмування
Досить часто в програмах необхідно виконувати деякі дії багаторазово. Такі програми прийнято називати циклічними, а фрагменти програми, що організують таке багаторазове виконання – циклами. Для цього в імперативних алгоритмічних мовах існують спеціальні оператори – оператори циклу (наприклад, конструкції типу for ... do ; while ... do або repeat ... until). У крайньому випадку цикли можна організувати за допомогою операторів розгалуження й переходу. Як зазначалося, у ПРОЛОЗі нічого подібного немає. Але в системі ПРОЛОГ існує два інших альтернативних механізми для організації повторення. Це повторення на базі механізму відкоту (повторення) і рекурсії (самовиклику).
Ці методи можуть забезпечити однаковий результат, хоча алгоритми їхнього виконання різні. Кожний із них має свою область застосування і має в конкретній ситуації свої переваги. Рекурсія потребує більше системних ресурсів: при кожному рекурсивному виклику нові копії значень, що використовуються, містяться у стек. Стек використовується для передачі значень між правилами. Це використання стеку буде оправдане, якщо проміжні результати будуть зберігатись для подальшого використання у певному порядку. TP має засоби для автоматичного звільнення частини стеку, що використовується. Але для правил на базі відкоту ці засоби не використовуються: вони не збільшують зайняту частину стеку.
Повторення. Правила повторення мають такий вигляд:
правило_повторення :-
< предикати >,
fail.
Убудований предикат fail (невдача) викликає відкіт, що зобумовлює попередні предикати шукати інші шляхи для узгодження цілі (якщо вони можуть узгоджуватись повторно при відкотах).
Рекурсія. Правила рекурсії мають такий вигляд:
правило_рекурсії :-
< предикати >,
правило_рекурсії.
Правила рекурсії мають у тілі виклик себе.
Всі методи програмування можна класифікувати за такою схемою (рис. 13) .
Алгоритми на базі відкоту застосовуються для обробки бази данних ПРОЛОГу, що зберігається у вигляді фактів (див. розд. 4.2.1, 4.2.2). Алгоритми на базі рекурсії можуть використовуватись тільки при обробці рекурсивних структур (списки, дерева та загальні рекурсивні структури (див. розд. 4.2.3, 4.2.4, 4.2.5)). Зв’язок між ними забузпечується убудованим предикатом findall (див. розд. 4.2.7).
Методи програмування
на базі відкоту на базі рекурсії
. findall .
ОПН МБД ПР УПР АС ПСГХ
ПВ ВВ КБД ПП ВРО МП
БВІП ГЗ КСВРО
НРВВГЗ
Рис. 13. Класифікація методів програмування