- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •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
- •Програмування мовою пролог
5.10. Метод організації висхідних рекурсивних обчислень (вро)
За допомогою даного методу можна будувати рекурсивну структуру, починаючи з константного терма, маркіруючего її кінець.
Метод застосовується в таких випадках:
1. Коли для об'єктів структури запропонований особливий порядок, що не може бути забезпечений прогресуючою підстановкою;
2. Коли в рекурсивних станах обчислення залежать від наявного доступу до побудованої на даний момент структури.
Містить такі кроки:
1. Константний терм постає аргументом у викликах процедури;
2. Аргумент кожного рекурсивного виклику – нова структура, одним із компонентів якої служить попередньо побудована структура;
3. Змінна, призначена для розташування в ній кінцевого результату, передається “внутрішнім чином” і до неї не застосовується ніяких підстановок, поки не буде досягнутий базовий стан;
4. У базовому стані зазначена змінна узгоджується з аргументом, що позначає побудовану структуру.
Цей метод протилежний методу спадної рекурсії з прогресуючою підстановкою. Розглянемо цей метод на прикладі розв’язання такої задачі.
Задача. Скласти процедуру, що виконує реверсування списку:
реверс(вихідний_список, реверсований_список)
Будемо будувати результуючий список з кінця. Для цього перекладемо роботу на допоміжну процедуру “прихований_реверс”, додавши до неї ще один параметр – список, побудований до даного моменту. У початковий момент цей допоміжний список буде порожній. Тому можна написати
реверс(L1, L2):-
прихований_реверс(L1, [ ], L2).
Процедуру “прихований_реверс” будемо розробяти методом аналізу станів.
Етапи:
1. Вигляділення двох станів:
а) L1 – порожній;
б) L1 – непорожній.
2. Розпізнання станів за допомогою аргументів, що мають такий вигляд:
а) [ ];
б) [H|T].
3. Реалізація поводження процедури в цих станах у такий спосіб:
а) фактом
прихований_реверс([ ], L, L).
% Якщо перший список порожній, то результатом буде другий
% список
б) правилом
прихований_реверс([H|T], L1, L2):-
прихований_реверс(T, [H|L1], L2).
% Якщо перший список не порожній, то розв’язок нашої
% задачі буде отримано реверсуванням хвоста (список T), коли
% голова вихідного списку ( елемент H) буде додана до
% попередньо реверсованої до цього моменту частини вхідного
% списку (за допомогою рекурсивного виклику)
4. Упорядкування тверджень у процедурі – довільне.
5. Доведення взаємовиключності тверджень: вид першого аргументу в першому і другому твердженні виключають один одного.
У результаті одержимо розв’язок
реверс(L1, L2):-
прихований_реверс(L1, [ ], L2).
прихований_реверс([ ], L, L).
прихований_реверс([H | T], L1, L2).
прихований_реверс(T, [H | L1], L2).
Проілюструємо поводження цієї процедури на прикладі реверсування списку [3, 4, 5, 6] (рис. 19).
Ціль: реверс([3, 4, 5, 6], R).
Вхідний список [3, 4, 5, 6]
(перший аргумент)
Допоміжний список: [ ] Вхід Результуючий список [6, 5, 4, 3]
(другий аргумент)
3
[3] Вихід
4 (Третій аргумент
[4, 3] у базовому
5 стані )
[5, 4, 3]
6
[6, 5, 4, 3] [ ]
Рис. 19. Реверсування списку
Застосуємо цей метод для більш ефективного розв’язку задачі побудови списку чисел Фібоначчі. Раніше ми цю задачу розв’язували спадним методом і відзначали неефективність такого розв’язання.
DOMAINS
список = integer *
PREDICATES
числа_фіб(integer, список)
скр_числа_фіб(integer, integer, список, список)
CLAUSES
числа_фіб(N, L):-
скр_числа_фіб(N, 1, [0, 1], L).
скр_числа_фіб(N, N, L, L).
скр_числа_фіб(N, N1, [Останнє, Передостаннє | T], L2):-
Чергове_число = Останнє + Передостаннє,
N2=N1+1,
скр_числа_фиб(N, N2, [Чергове_число, Останнє, Передостаннє | T], L2).