- •1. Основи мови програмування пролог
- •1.1. Основні поняття
- •1.2. Синтаксис мови пролог
- •1.3. Класифікація даних у пролозі
- •1.4. Приклад доказу в пролозі
- •1.5. Подання задачі у вигляді і-або дерева
- •1.6. Структура програми в системі tp
- •2. Підстави логічного програмування
- •1.7. Убудовані типи даних мови tp
- •1.8. Висновки
- •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. Метапрограмування (мп)
- •Список рекомендованої літератури
- •Програмування мовою пролог
4.2.4. Подання у вигляді рекурсивних структур
Службовців нашої установи можна подати, наприклад, у вигляді такої рекурсивної структури:
/* Ім'я Відділ Посада Оклад */
рс(іванов, 100, оператор, 200,
рс(петров, 200, керівник, 700,
рс(сидоров, 100, менеджер, 715, end)))
Тут end – це атом, що зображує кінець структури.
Дістати інформацію з такої структури можна аналогічно до попереднього випадку:
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
рс(Ім'я, Відділ, Посада, Оклад, Залишок)) .
Далі – проігнорувати елемент, розташований на початку структури і викликати цю ж процедуру із залишком як другий параметр для одержання чергового елемента (знову ж за допомогою першого правила цієї процедури):
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
рс(_, _, _, _, Залишок) ):-
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад), Залишок).
Запит про всіх службовців відділу 200 буде мати такий вигляд:
один_ц_інф_елемент( сл(Ім'я, 200, Посада, Оклад),
рс(іванов, 100, оператор, 200,
рс(петров, 200, керівник, 700,
рс(сидоров, 100, менеджер, 715) ) )
).
Така подібність в поданні й обробці для третього й четвертого способу представлення бази даних не випадкова, тому що список є окремий і дуже важливий вид рекурсивної структури.
4.2.5. Подання у вигляді двійкового дерева
Перетворення рекурсивної структури на двійкове дерево досягається шляхом введення одного додаткового аргументу. Зміст використання двійкового дерева полягає в тому, щоб зберігати базу даних у відсортованому вигляді. Наприклад, відсортуємо за іменем службовця (рис. 6).
Рис. 6. Подання бази даних у вигляді двійкового дерева
Тепер у структурі буде шість аргументів:
/* Ім'я Відділ Посада Оклад ЛівеПіддерево ПравеПіддерево */
дд(іванов, 100, оператор, 200,
дд(петров, 200, керівник, 700, end, end),
дд(сидоров, 100, менеджер, 715, end, end))
Діставати інформацію з двійкового дерева по одному можна за допомогою наступної процедури:
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
дд(_, _, _, _, ЛівеПіддерево, _ ) ):-
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад), ЛівеПіддерево).
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
дд(Ім'я, Відділ, Посада, Оклад, _, _)) .
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
дд(_, _, _, _, _, ПравеПіддерево ) ):-
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад), ПравеПіддерево).
Запит про всіх службовців відділу 200 буде мати такий вигляд:
один_ц_інф_елемент(сл(Ім'я, 200, Посада, Оклад),
дд(іванов, 100, оператор, 200,
дд(петров, 200, керівник, 700, end, end),
дд(сидоров, 100, менеджер, 715, end, end)
)
).
Цікавою властивістю постає те, що процедура в такому випадку завжди буде видавати цілісні інформаційні елементи, які утворюють дерево, у відсортованому порядку.
