- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •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
- •Програмування мовою пролог
1. Основи мови програмування пролог
1.1. Основні поняття
Програма на ПРОЛОЗі складається з тверджень. Кожне твердження повинне закінчуватися крапкою. Твердження бувають двох виглядів:
факти - твердження не потребуючі доказу;
правила.
Правило має голову й тіло. Правило вважається доведеним, якщо доведені всі твердження, що входять до його тіла. Доказ істинності цілі здійснюється за допомогою вбудованого в систему правила виведення нових тверджень на основі поставленої цілі й бази знань (програми). Правило виведення, застосоване в ПРОЛОЗі, називається методом резолюцій. Цей метод був уперше запропонований Дж. Робінсоном у 1965 р. Він оснований на доведенні від супротивного і став тією базою, що дозволила автоматизувати доведення цілі в численні висловлень 1-го порядку.
Методом розробки програм на ПРОЛОЗі слугує метод поступового нарощування. Тобто спочатку розробляється якась спрощена схема предметної області. У процесі подальшої роботи в систему додаються все нові й нові відношення, що точніше описують предметну область. Але в будь-який момент можна задавати цілі програмі й одержати на них відповіді, основані на тих знаннях, що вже закладені в програму.
Наприклад, відомо, що:
“Марія любить яблука.” і
“Тетяна любить те саме, що й Марія.”
На основі цих тверджень, використовуючи логічні міркування можна укласти, що “Тетяна любить яблука”.
У цьому прикладі:
Марія, Тетяна, яблука - це об'єкти;
любить – це відношення арності 2 між двома об'єктами (тому що в нього два операнди).
Спосіб запису відношення “Марія любить яблука “ є інфіксний (оператор відношення “любить” знаходиться між об'єктами), бінарний (беруть участь два об'єкти), несиметричний (не можна замінити порядок входження операндів у відношення). Перша фраза являє собою приклад фактуального знання – мова йде про конкретні екземпляри об'єктів (Марія і яблука), що знаходяться в конкретному відношенні (любить). Якщо Марія також любить персики й горішки, то це можна виразити у вигляді окремих екземплярів цього відношення:
Марія любить персики.
Марія любить горішки.
А всі ці екземпляри відношення утворюють плоску таблицю:
Таблиця для відношення “любить”
-
Хто (любить)
Що (любить)
Марія
Яблука
Марія
Персики
Марія
Горішки
Відношення, подане у вигляді фактуальных знань, слугує прикладом скінченої функції (таблично заданої функції).
Це відношення в синтаксисі ПРОЛОГу запишуться в такий спосіб:
любить(марія, яблука).
любить(марія, персики).
любить(марія, горішки).
З погляду ПРОЛОГу “любить” - це предикат (оператор ПРОЛОГу), а “марія”, “яблука”, “персики” й “горішки” – це атоми, тобто окремі сутності, що мають у програмі такі позначення. Атоми в ПРОЛОЗі пишуться з малої літери (щоб їх відрізняти від змінних). З погляду ПРОЛОГу “любить” - це головний функтор відношення. Функтор характеризується ім'ям і арністю. Два функтори з тим самим ім'ям, але різною арністю являють собою два різних відношення. Наприклад, двовимірна й тривимірна крапки – це різні функтори:
крапка(3, 5).
крапка(7, -2, 4).
Друге твердження (“Тетяна любить те саме, що й Марія.”) являє собою приклад концептульного знання, тобто справедливого для різних значень змінних, що входять до його визначення. Ми нічого не зможемо сказати про те, що подобається Тетяні, поки не з'ясуємо, що ж любить Марія. І якщо ми знаємо, що Марія любить і яблука, і персики, і горішки, то те саме можемо сказати й про Тетяну. Дане твердження можна перефразувати в такий спосіб:
“Тетяна любить Це, якщо Марія любить Це”.
Тут “Це” є займенник (тобто займенник в українській мові може виступати на місці конкретного імені в реченні). Слово ”якщо” – зв'язка, що поєднує два твердження. Мовою ПРОЛОГ цю фразу можна записати так:
любить(тетяна, Це):-
любить(марія, Це).
Як бачимо, зв'язка ”якщо” мовою ПРОЛОГ записується за допомогою знаків “:-“. Займенник “Це” в ПРОЛОЗі перетворюється на змінну. Змінні в ПРОЛОЗі обов'язково пишуться з великої літери. От чому ми пишемо імена Марія і Тетяна з малої літери, в противному разі слід їх узяти у лапки:
любить(“Тетяна”, Це):-
любить(“Марія”, Це).
Змінна в ПРОЛОЗі служить для тимчасового іменування об'єктів у межах одного твердження, тобто від заголовка твердження до крапки, що закінчує твердження. Змінна в ПРОЛОЗі може перебувати в одному з трьох станів:
- вільна (неконкретизована);
- конкретизована якимсь об'єктом;
- зчеплена з іншою змінною.
Зчеплені змінні можуть бути або обидві вільні, або обидві конкретизовані тим самим об'єктом. Після того як змінна сконкретизована яким-небудь об'єктом, її конкретизація в межах даного твердження не може бути змінена (а значить і взагалі, тому що областю дії змінної є одне твердження). Тому конструкція виду
X = X + 1
в ПРОЛОЗі є безглузда. Якщо ми хочемо що-небудь змінити, то треба ввести іншу змінну і вже з її допомогою запам'ятати нове значення
X1 = X + 1.
Іншим наслідком цього постає те, що змінна, яка зустрічається у твердженні тільки один раз, не має сенсу (її значення ніколи не буде використане). Такі змінні прийнято позначати за допомогою знака “_” і вони називаються анонімними.