- •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. Предикати, що працюють з атрибутами файлів
- •Література
2.1 Сортування списків на пролозі
Сортування методом простої вставки
Нехай є список: [15, 11, 13, 12]. Треба відсортувати список в порядку зростання.
Алгоритм
Вибирається останній елемент старого списку і приєднується до нового списку. Вибирається другий елемент старого списку з кінця. Для нього шукається місце у новому списку за ознакою “елемент менше інших елементів списку”. Далі процес повторюється для 3, 4 елементів списку з кінця, поки новий список не стане впорядкованим.
Списки будуються за схемою:
Старий список Новий список
[15, 11, 13, 12] [ ]
[15, 11, 13] Вставили 12 [12]
[15, 11] Вставили 13 [12, 13]
[15] Вставили 11 [11, 12, 13]
[] Вставили 15 [11, 12, 13, 15]
Розглянемо програму, що реалізує метод простої вставки.
Domains
Lst=integer*
Predicates
Vk(lst, lst)
Vk2(integer, lst, lst)
Clauses
vk([],[]).
vk([X|L],M):-vk(L,N),vk2(X,N,M).
vk2(X,[A|L],[A|M]):-A<X,!,vk2(X,L,M).
vk2(X,L,[X|L]).
Goal
vk ([15, 11, 13, 12], M), write (M).
Робота процедур vk і vk2:
Процедура написана низхідним методом. Вона відокремлюємо по порядку голови старого списку L і заносить їх у стек. Порядок елементів списку в стеку зворотний. Процес повторюється доти, доки старий список не стане порожнім. Після досягнення граничної умови новий список N стає теж порожнім. Викликається процедура vk2.
Процедура “vk2” шукає місце верхнього елементу стеку в новому списку N. Якщо новий список порожній, то елемент вставляється в список.
Для не порожнього нового списку процедура порівнює фіксований елемент з поточним елементом нового списку. Якщо місце не підходить, то обирається наступний елемент списку. Інакше процедура добавляє елемент до нового списку в знайденому місці.
Процедура повторюється до тих пір, поки зі стеку не виберуться всі елементи. Процедура написана висхідним методом.
Сортування методом пухирця
Нехай є список: [13, 11, 12, 15]. Треба відсортувати список в порядку спадання.
Алгоритм
На кожному проході по списку порівнюється пара елементів, що стоять поряд(перший з другим, другий з третім, ...). Елемент що менше ставлять над більшим. На кожному проході одержується новий список. Далі дії повторюються для нового списку. Процес повторюється до тих пір, поки новий список не стане впорядкованим.
Списки будуються за схемою:
[13, 11, 12, 15]
15 11 11 11
12 15 12 12
11 12 15 13
13 13 13 15
domains
lst=integer*
Predicates
P(lst,lst)
Pr(lst,lst,lst)
Clauses
P(L,S):-pr(X,[A,B|Y],L), A<B, pr(X,[B,A|Y],M ),p(M,S).
p(L,L).
pr([],L,L).
pr([H|L1],L2,[H|L3]):-pr(L1,L2,L3).
Goal
p([15,11,13,12],S),write(S).
Робота процедури P
Процедура Р розбиває список L на різні варіанти підсписків за допомогою першого виклику процедури pr. Це дозволяє двигатися по списку далі, обирати наступні елементи для порівняння. Одночасно другий аргумент процедури pr відокремлює від другого підсписку перші два аргументи А и В для порівняння.
Порівнюються значення елементів А і В. Якщо нерівність невірна, то відбувається повернення на pr, і вона розбиває список на наступні підсписки.
Якщо нерівність вірна, це значить, що елементи стоять не в тому порядку. Друге використання процедури pr приєднує до підсписку Х підсписок, з елементами в іншому порядку. Результат розміщується в М. Процес повторюється доти, доки скрізь А<B буде невірним. Тобто наша відсортованість вірна і результат зберігається. Процедура написана висхідним методом.