- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •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.2.2. Подання атрибутів у вигляді фактів
Можна застосовувати як факти окремі атрибути (тобто властивості) інформаційних елементів.
відділ (іванов,100).
посада (іванов, оператор).
оклад (іванов,100).
відділ (петров,200).
посада (петров, керівник).
оклад (петров, 700).
відділ (сидоров, 200).
посада (сидоров, менеджер).
оклад (сидоров, 715).
У разі потреби їх можна зібрати в єдине ціле за допомогою правила. Один з атрибутів повинен відігравати роль ключа, що поєднує всі окремі властивості. У даному випадку атрибут ім'я може виступати як такий ключ.
сл2 (Ім'я, Відділ, Посада, Оклад):-
відділ (Ім'я, Відділ),
посада (Ім'я, Посада),
оклад (Ім'я, Оклад).
Запит може мати точно такий вигляд, як і для першого випадку:
сл2 (Ім'я, 200, Посада, _ ).
Застосування атрибутів є більш гнучкий спосіб подання бази даних, ніж за допомогою цілісних фактів, оскільки нові атрибути можна буде додавати без переписування всієї існуючої бази даних. Наприклад, додамо атрибути “премія” і “стаж роботи”:
премія(Ім'я, 50):- % Видати премію в розмірі 50 грн.
відділ(Ім'я, 100). % службовцем відділу 100
стаж_роботи( іванов, 10).
стаж_роботи( петров, 15).
стаж_роботи( сидоров, 5).
Додавання цих атрибутів ніяк не вплине на вищенаведене правило для сл2.
4.2.3. Представлення знань у вигляді списку структур
Кожен елемент списку – це цілісний інформаційний елемент. Наприклад:
/* Ім'я Відділ Посада Оклад */
[сл(іванов, 100, оператор, 200),
сл(петров, 200, керівник, 700),
сл(сидоров, 100, менеджер, 715)]
При такому підході до структури бази даних потік цілісних інформаційних елементів не потрібно включати в поточну програму. Він може існувати як аргумент запиту, що входить у різні підцілі, які обробляють цей потік.
Наприклад, результат виконання процедури повертається через її перший аргумент – по одному цілісному інформаційному елементу за одне звернення:
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
[сл(Ім'я, Відділ, Посада, Оклад) | Залишок_списку]).
Далі – проігнорувати елемент, розташований у голові списку, і викликати цю ж процедуру, передаючи хвіст як другий параметр, для одержання чергового елемента (знову ж за допомогою першого правила цієї процедури):
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
[сл(_, _, _, _) | Залишок_списку] ):-
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад), Залишок_списку)
Запит про всіх службовців відділу 200 може мати такий вигляд:
один_ц_інф_елемент( сл(Ім'я, 200, Посада, Оклад),
[сл(іванов, 100, оператор, 200),
сл(петров, 200, керівник, 700),
сл(сидоров, 100, менеджер, 715) ] ).
4.2.4. Подання у вигляді рекурсивних структур
Службовців нашої установи можна подати, наприклад, у вигляді такої рекурсивної структури:
/* Ім'я Відділ Посада Оклад */
рс(іванов, 100, оператор, 200,
рс(петров, 200, керівник, 700,
рс(сидоров, 100, менеджер, 715, end)))
Тут end – це атом, що зображує кінець структури.
Дістати інформацію з такої структури можна аналогічно до попереднього випадку:
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
рс(Ім'я, Відділ, Посада, Оклад, Залишок)) .
Далі – проігнорувати елемент, розташований на початку структури і викликати цю ж процедуру із залишком як другий параметр для одержання чергового елемента (знову ж за допомогою першого правила цієї процедури):
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),
рс(_, _, _, _, Залишок) ):-
один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад), Залишок).
Запит про всіх службовців відділу 200 буде мати такий вигляд:
один_ц_інф_елемент( сл(Ім'я, 200, Посада, Оклад),
рс(іванов, 100, оператор, 200,
рс(петров, 200, керівник, 700,
рс(сидоров, 100, менеджер, 715) ) )
).
Така подібність в поданні й обробці для третього й четвертого способу представлення бази даних не випадкова, тому що список є окремий і дуже важливий вид рекурсивної структури.