- •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. Метапрограмування (мп)
- •Список рекомендованої літератури
- •Програмування мовою пролог
Міністерство освіти і науки України
Дніпропетровський національний університет
В. М. ЄФІМОВ
ПРОГРАМУВАННЯ МОВОЮ ПРОЛОГ
Ухвалено вченою радою університету
як навчальний посібник
Дніпропетровськ
РВВ ДНУ
2004
УДК 681.319
Є 91
Рецензенти: д-р екон. наук, проф. К.Ф. Ковальчук
канд. фіз.-мат. наук, доц. В.Я. Марецький
Є 91 Єфімов В.М. Програмування мовою ПРОЛОГ: Навч. посіб.- Д.: РВВ ДНУ, 2004.- 92с.
Розглянуті особливості мови програмування ПРОЛОГ, описані методи програмування, наведені приклади програм, основаних на даних методах.
Для студентів ДНУ, які навчаються за спеціальністю « Прикладна математика», «Комп’ютерні науки».
© Єфімов В.М., 2004
ВСТУП
Назва мови ПРОЛОГ походить від слів ПРОграмування мовою ЛОГіки. Мова ПРОЛОГ була створена в 1973 р. Аленом Колмерое в Марсельському університеті. Створення мови й системи програмування даною мовою дозволило автоматизувати доказ у логіці предикатів 1-го порядку. Теоретичною підставою для розробки інтерпретатора (а надалі й компілятора) мови ПРОЛОГ стало створення нового правила виведення в логіці предикатів 1-го порядку - принципу резолюцій (Дж. Робінсон, 1965 р.). Це правило виведення зосноване на поданні висловлень у логіці предикатів 1-го порядку в спеціальному вигляді, а саме – діз'юнктів Хорна. Доказ теореми за допомогою методу резолюцій – це доказ методом від супротивного.
Велику роль у створенні ефективної реалізації мови ПРОЛОГ відіграла група математиків з Единбургу (Шотландія). Мова ПРОЛОГ, що описана У. Клоксиним і К. Мелишем у книзі “Программирование на языке ПРОЛОГ”, тривалий час залишається фактичним стандартом цієї мови.
Мова ПРОЛОГ істотно відрізняється від традиційних алгоритмічних мов. Насамперед мова ПРОЛОГ – це декларативна мова, що визначило наступні області її застосування:
- обробка знань;
- експертні системи;
- створення динамічних реляційних баз даних;
- переклад програм з однієї мови на іншу;
- створення пакетів символьних обчислень;
- доказ теорем;
- швидке створення прототипів прикладних програм.
Мова ПРОЛОГ також є універсальною мовою програмування. Це одна з компактних мов з досить малою системою понять, але могутніми засобами розширення. До цього класу мов відносять такі мови, як РЕФАЛ, ЛІСП, ФОРТ. Мова ПРОЛОГ (разом з мовою ЛІСП) служить основою для розробки додатків штучного інтелекту (ШІ). Основою для мов ШІ є їх здатність подавати знання. Маючи базу знань, система ШІ здатна самостійно шукати й знаходити потрібні розв’язки. Пошук розв’язок може містити багато кроків. Тому ефективність роботи додатків ШІ – одне зі слабких місць усіх мов ШІ й особливо мови ПРОЛОГ. Багато мов ШІ є мовами, орієнтованими на інтерпретацію, що ще більше позначається на їх ефективності. Типова схема додатків ШІ має такий вигляд (рис. 1).
БАЗА ЗНАНЬ
ІНТЕРПРЕТАТОР
Рис. 1. Типова схема додатків ШІ
Розв’язання задачі будується шляхом взаємодії інтерпретатора з базою знань деякої предметної області, описаної цією ж мовою. Задача перед системою ставиться у вигляді цілі, заданої засобами цієї ж мови.
Фірма Борланд створила компілювальну версію мови ПРОЛОГ – TURBO PROLOG (TP). На даний час найбільш популярна версія TP 2.0. Вона містить інтегроване середовище розробки з можливістю налагодження програми в режимі інтерпретації, а також компілятор і завантажник, що дозволяють створювати виконуючі модулі, здатні працювати без системи ПРОЛОГ (у вигляді EXE-файлів). Обробна система (інтерпретатор) разом з базою даних вбудовується у виконуючий код. Таким способом можна розробляти більш ефективні за швидкодією програми.
У пакет, що поставляється разом із системою TP 2.0, входить інтерпретатор PIE, написаний мовою TP, що дозволяє працювати суто в режимі інтерпретації.
Основні ознаки мови ПРОЛОГ:
це декларативна мова (тобто мова описів);
це мова обробки символів;
наявність механізму виведення з пошуком і поверненням;
наявність механізму уніфікації (зіставлення зі зразком);
проста й виразна структура даних (основою подання даних служить дерево);
нероздільність програм і даних;
відсутність покажчиків, операторів переходу, циклів;
механізм рекурсії – основа для організації повторень.
Повна могутність мови ПРОЛОГ визначається не однією якоюсь окремою ознакою, а сукупністю всіх цих особливостей. Декларативне програмування – це програмування в термінах цілей, тобто замість того, щоб указати програмі ЯК це необхідно зробити, ми задаємо ЩО ми хочемо одержати від програми. А вже сама система за допомогою убудованого механізму виведення шукає потрібний нам розв’язок.
Наприклад, нехай СУМА – це предикат, що встановлює залежності між двома складниками (останні два операнди) і сумою двох дійсних чисел (перший операнд). Потужність декларативного програмування можна проілюструвати на прикладі виконання таких цілей:
СУМА(8, 3, 5) – так, тому що 8 = 3 + 5;
СУМА(10, 3, 5) – ні, тому що 10 3+ 5;
СУМА(8, X, 5) – так при X = 3;
СУМА(X, 3, 5) – так при X = 8;
СУМА(X,3,Y) – так при X = 3 + Y,
де X, Y – вільні змінні. ПРОЛОГ шукає такі значення змінних, що входять у ціль, при яких цей предикат перетворюється на істину. Головне для ПРОЛОГу – довести істинність або хибність поставленої цілі. Все інше – конкретизація змінних, виведення їх значень тощо – побічний ефект доказу (узгодження) цілі.
1. Основи мови програмування пролог
1.1. Основні поняття
Програма на ПРОЛОЗі складається з тверджень. Кожне твердження повинне закінчуватися крапкою. Твердження бувають двох виглядів:
факти - твердження не потребуючі доказу;
правила.
Правило має голову й тіло. Правило вважається доведеним, якщо доведені всі твердження, що входять до його тіла. Доказ істинності цілі здійснюється за допомогою вбудованого в систему правила виведення нових тверджень на основі поставленої цілі й бази знань (програми). Правило виведення, застосоване в ПРОЛОЗі, називається методом резолюцій. Цей метод був уперше запропонований Дж. Робінсоном у 1965 р. Він оснований на доведенні від супротивного і став тією базою, що дозволила автоматизувати доведення цілі в численні висловлень 1-го порядку.
Методом розробки програм на ПРОЛОЗі слугує метод поступового нарощування. Тобто спочатку розробляється якась спрощена схема предметної області. У процесі подальшої роботи в систему додаються все нові й нові відношення, що точніше описують предметну область. Але в будь-який момент можна задавати цілі програмі й одержати на них відповіді, основані на тих знаннях, що вже закладені в програму.
Наприклад, відомо, що:
“Марія любить яблука.” і
“Тетяна любить те саме, що й Марія.”
На основі цих тверджень, використовуючи логічні міркування можна укласти, що “Тетяна любить яблука”.
У цьому прикладі:
Марія, Тетяна, яблука - це об'єкти;
любить – це відношення арності 2 між двома об'єктами (тому що в нього два операнди).
Спосіб запису відношення “Марія любить яблука “ є інфіксний (оператор відношення “любить” знаходиться між об'єктами), бінарний (беруть участь два об'єкти), несиметричний (не можна замінити порядок входження операндів у відношення). Перша фраза являє собою приклад фактуального знання – мова йде про конкретні екземпляри об'єктів (Марія і яблука), що знаходяться в конкретному відношенні (любить). Якщо Марія також любить персики й горішки, то це можна виразити у вигляді окремих екземплярів цього відношення:
Марія любить персики.
Марія любить горішки.
А всі ці екземпляри відношення утворюють плоску таблицю:
Таблиця для відношення “любить”
-
Хто (любить)
Що (любить)
Марія
Яблука
Марія
Персики
Марія
Горішки
Відношення, подане у вигляді фактуальных знань, слугує прикладом скінченої функції (таблично заданої функції).
Це відношення в синтаксисі ПРОЛОГу запишуться в такий спосіб:
любить(марія, яблука).
любить(марія, персики).
любить(марія, горішки).
З погляду ПРОЛОГу “любить” - це предикат (оператор ПРОЛОГу), а “марія”, “яблука”, “персики” й “горішки” – це атоми, тобто окремі сутності, що мають у програмі такі позначення. Атоми в ПРОЛОЗі пишуться з малої літери (щоб їх відрізняти від змінних). З погляду ПРОЛОГу “любить” - це головний функтор відношення. Функтор характеризується ім'ям і арністю. Два функтори з тим самим ім'ям, але різною арністю являють собою два різних відношення. Наприклад, двовимірна й тривимірна крапки – це різні функтори:
крапка(3, 5).
крапка(7, -2, 4).
Друге твердження (“Тетяна любить те саме, що й Марія.”) являє собою приклад концептульного знання, тобто справедливого для різних значень змінних, що входять до його визначення. Ми нічого не зможемо сказати про те, що подобається Тетяні, поки не з'ясуємо, що ж любить Марія. І якщо ми знаємо, що Марія любить і яблука, і персики, і горішки, то те саме можемо сказати й про Тетяну. Дане твердження можна перефразувати в такий спосіб:
“Тетяна любить Це, якщо Марія любить Це”.
Тут “Це” є займенник (тобто займенник в українській мові може виступати на місці конкретного імені в реченні). Слово ”якщо” – зв'язка, що поєднує два твердження. Мовою ПРОЛОГ цю фразу можна записати так:
любить(тетяна, Це):-
любить(марія, Це).
Як бачимо, зв'язка ”якщо” мовою ПРОЛОГ записується за допомогою знаків “:-“. Займенник “Це” в ПРОЛОЗі перетворюється на змінну. Змінні в ПРОЛОЗі обов'язково пишуться з великої літери. От чому ми пишемо імена Марія і Тетяна з малої літери, в противному разі слід їх узяти у лапки:
любить(“Тетяна”, Це):-
любить(“Марія”, Це).
Змінна в ПРОЛОЗі служить для тимчасового іменування об'єктів у межах одного твердження, тобто від заголовка твердження до крапки, що закінчує твердження. Змінна в ПРОЛОЗі може перебувати в одному з трьох станів:
- вільна (неконкретизована);
- конкретизована якимсь об'єктом;
- зчеплена з іншою змінною.
Зчеплені змінні можуть бути або обидві вільні, або обидві конкретизовані тим самим об'єктом. Після того як змінна сконкретизована яким-небудь об'єктом, її конкретизація в межах даного твердження не може бути змінена (а значить і взагалі, тому що областю дії змінної є одне твердження). Тому конструкція виду
X = X + 1
в ПРОЛОЗі є безглузда. Якщо ми хочемо що-небудь змінити, то треба ввести іншу змінну і вже з її допомогою запам'ятати нове значення
X1 = X + 1.
Іншим наслідком цього постає те, що змінна, яка зустрічається у твердженні тільки один раз, не має сенсу (її значення ніколи не буде використане). Такі змінні прийнято позначати за допомогою знака “_” і вони називаються анонімними.
