- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •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.7. Списки
4.7.1. Подання й зображення списків
Список – це структура, що широко застосовується у нечисловому програмуванні. Список – послідовність, складена з довільної кількості елементів. Список може бути порожнім чи непорожнім. Порожній список у ПРОЛОЗі зображується атомом [ ]. Непорожній список можна розглядати як структуру, що складається з двох частин:
1) голова списку – перший елемент;
2) хвіст списку – список без голови.
Якщо проаналізувати це визначення, то можна помітити, що воно рекурсивне. І ця його властивість багато в чому визначає способи обробки (і побудови) списків.
Наприклад. Список того, що полюбляє Марія можна записати у вигляді
[персики, яблука, апельсини]
Тут “персики” – це голова списку, а [яблука, апельсини] – хвіст. Головою списку може бути що завгодно (атом, довільна структура або список). А хвіст – це завжди список (порожній чи непорожній). Голова з'єднується з хвостом за допомогою спеціального функтора (як правило, це крапка “.”) у такий спосіб:
.(Голова, Хвіст)
Наведений вище список можна переписати у вигляді структури з функтором “.” таким чином:
.(персики, .(яблука, .(апельсини, [ ])))
Подання списків за допомогою квадратних дужок альтернативне й підкреслює важливу роль, що відведена спискам при програмуванні мовою ПРОЛОГ. Будь-яка структура в ПРОЛОЗі зберігається в базі знань у вигляді дерева, тому що єдиний спосіб зображення списків – деревоподібний (рис. 12).
.
персики .
яблука .
апельсини [ ]
Рис. 12. Зображення списку у вигляді дерева
На практиці зручно трактувати голову і хвіст списку як самостійні об'єкти.
Наприклад, список того, що полюбляє Марія можна розділити на Перше й Інші в такий спосіб:
Нехай L = [персики, яблука, апельсини]. Якщо Перше = персики, а Інші = [яблука, апельсини], То буде справедливо
L = [Перше | Інші].
Тут символ “|” відокремлює будь-яку кількість елементів на початку списку від хвоста списку.
Можна визначити свої власні види списків, якщо задати свій атом кінця й функтор для з'єднання голови списку з хвостом.
Наприклад:
потім(устати, потім(умитися, потім(попрацювати, потім(лягти_спати, нічого_не_робити).
Тут застосовується визначена користувачем структура, подібна до вбудованого списку з функтором “крапка”, що як закінчення використовує атом “нічого_не_робити”, а для з'єднання голови списку з хвостом використовує функтор “потім”. У деяких реалізаціях ПРОЛОГу бінарний функтор можна визначити як бінарний інфіксний оператор. Тоді приведений вище список можна подати у вигляді:
устати потім умитися потім попрацювати потім лягти_спати потім нічого_не_робити.
Це дозволяє писати програми на ПРОЛОЗі у вигляді близькому до природної мови, тобто перетворює мову ПРОЛОГ на мову із синтаксисом, що прилаштовується програмістом на потреби задачі.