- •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. Метапрограмування (мп)
- •Список рекомендованої літератури
- •Програмування мовою пролог
Рефлексивность і нерефлексивность
Відношення, що завжди дотримується, коли обидва аргументи однакові, називається рефлексивним, наприклад, відношення “рівні”.
Відношення, що порушується, коли обидва аргументи однакові, називається нерефлексивним, наприклад, “вище”.
За умовчанням ПРОЛОГ уважає, що всі предикати рефлексивні.
Наприклад:
конкурент(К1, К2):-
подорож(К1, МістоА, МістоБ, автобус),
подорож(К2, МістоА, МістоБ, автобус).
Тут відсутня умова, яка вказує, що К1 повинно відрізнятися від К2. Тому за умовчанням розуміється, що відношення “конкурент” рефлексивне. Це означає, що можна довести, що деяка транспортна компанія конкурує сама із собою. Тому доцільно переписати це правило таким чином, щоб воно стало нерефлексивним:
конкурент(К1, К2):-
подорож(К1, МістоА, МістоБ, автобус),
подорож(К2, МістоА, МістоБ, автобус),
К1 <> К2.
Транзитивність
Відношення між аргументами називається транзитивним, якщо воно зберігається при переході від прямого відношення до непрямого, наприклад “дорівнює”, “вище”, “предок”.
У мові ПРОЛОГ транзитивне відношення звичайно реалізується за допомогою рекурсивної процедури.
Наприклад, реалізація відношення “предок”. Будемо говорити, що деякий X є предком деякого Z, якщо між X і Z існує ланцюжок людей (можливо, порожній), зв'язаних між собою відношенням “дитина-батько” (рис. 10).
батько
батько предок
батько предок
. . .
Рис. 10. Схема відношень “дитина-батько” і “предок”
Усі відношення можна виразити за допомогою двох правил:
1) безпосередніх предків (найближчих);
2) віддалених предків.
Перше правило легко записати у вигляді
предок(X, Z):-
батько(X, Z).
Друге правило складніше. Можна було б додавати такі правила:
предок(X, Z):-
батько(X, Y),
батько(Y, Z).
предок(X, Z):-
батько(X, Y1),
батько(Y1, Y2),
батько(Y2, Z).
та ін.
Ця програма тривала і працює тільки до певної глибини фамільного дерева (обмеженої максимальною кількістю екземплярів відношення “батько” у визначенні відношення “предок”).
Але є, однак, коректне вдале формулювання відношення “предок”, що буде працювати щодо предків довільної віддаленості. Ключова ідея – визначити відношення “предок” через самого себе:
предок(X, Z):-
батько(X, Y),
предок(Y, Z).
Ці два правила й дають разом визначення процедури “предок”:
предок(X, Z):-
батько(X, Z).
предок(X, Z):-
батько(X, Y),
предок(Y, Z).
Таке визначення, у формулюванні якого було використано саме обумовлене відношення, називається рекурсивним. ПРОЛОГ-система дуже легко обробляє такі визначення. Рекурсія – один із фундаментальних прийомів програмування на ПРОЛОЗі.
Симетричність і транзитивність
Розглянемо особливості реалізації відношень, що є одночасно симетричними й транзитивними. Прикладом такго відношення може служити відношення “можна-проїхати”. Попередньо ми навчилися ці властивості забезпечувати окремо. Особлива складність при одночасному їх забезпеченні – можливість зациклення.
