
- •1.Пролог - мова логічного програмування.
- •1.1.Загальний огляд мови Пролог.
- •1.2.Переваги і недоліки мови Пролог.
- •1.3.Числення предикатів - математична основа мови.
- •1.4.Побудова теорії деякої області знань.
- •1.5.Від формальної логіки до логічного програмування.
- •1.6.Механізм логічного виведення і керування пошуком.
- •2.Основні концепції прологу.
- •2.1.Факти та правила.
- •2.2.Як змінні отримують свої значення.
- •2.3.Анонімні змінні.
- •2.4.Складні цілі: кон`юнкція та диз`юнкція.
- •2.5.Способи Співставлення.
- •3.Структура програми pdc прологу.
- •3.1.Основні розділи програми.
- •3.2 Стандартні домени.
- •3.3.Синтаксис правила.
- •3.4.Директиви комп`ютеру.
- •3.5.Бектрекінг.
- •3.5.1.Бектрекінг з внутрішньою ціллю.
- •4.Контроль пошуку рішень.
- •4.1.Використання предикату fail.
- •4.2.Відміна бектрекінгу.
- •1.Коли ви знаєте попередньо, що певні варіанти ніколи не дадуть поштовху в знаходженні розв'язку, тоді використання cut(зелений cut) відкидає перегляд альтернативних шляхів.
- •2.Коли логіка програми потребує використання cut для відкидання перегляду альтернативних підцілей, тоді його називають червоним відтинанням.
- •4.3.Предикат not - заперечення як неуспіх.
- •4.4.Труднощі у використанні відтинання і заперечення.
- •4.5.Засоби керування.
- •4.6.Узагальнення.
- •5.Прості та складні об'єкти.
- •5.1 Прості дані.
- •5.1.1. Константи як об'єкти даних.
- •5.2.Складні об'єкти даних і функтори.
- •5.2.1.Уніфікація складних об`єктів.
- •5.2.2.Приклад застосування функторів.
- •5.3.Приклад використання складних об'зктів.
- •5.4.Опис доменів складних об'єктів.
- •5.5.Багаторівневі складні об'єкти.
- •5.6.Приклад, який ілюструє задання структури речення англійської мови.
- •5.7.Опис змішаних складних об'єктів.
- •5.7.1.Аргументи, які можуть мати різний тип.
- •5.7.2 Cписковий тип.
- •5.8.Порівняння складних об`єктів.
- •5.9.Узагальнення.
- •6. Ітерація і рекурсія.
- •6.1.Реалізація ітераційного процесу за допомогою бектрекінгу.
- •6.2.Дії типу до і після.
- •6.3.Застосування бектрекінгу для реалізації циклів.
- •6.4.Рекурсивні процедури.
- •6.5.Використання аргументів в якості параметрів циклу.
- •7. Рекурсивні структури даних.
- •7.1.Структура даних типу дерева.
- •7.2.Обходи дерева.
- •7.3.Створення дерева.
- •7.4.Бінарний пошук на дереві.
- •7.5. Сортування по дереву.
- •7.5. Програмна реалізація лексикографічного впорядкування при символьному вхідному потоці.
- •8. Робота з списками в пролозі.
- •8.1.Рекурсивна сутність списку.
- •8.2.Обробка списків.
- •8.2.1.Друк списків.
- •8.2.2.Підрахунок кількості елементів.
- •8.2.3.Іще один варіант підрахунку довжини списку.
- •8.2.4.Модифікація списку.
- •8.2.5.Належність елемента списку.
- •8.3.Використання одного й того ж предикату для вирішення різних задач.
- •8.4. Знаходження зразу всіх розв`язків.
- •8.5.Складні списки.
- •8.6.Реалізація синтаксичного аналізу за допомогою списків.
- •9. Техніка програмування в пролозі.
- •9.1.Принципи побудови експертної системи.
- •9.2. Макетування: задача маршрутизації.
- •9.3.Пригоди в дивних печерах.
- •9.4. Моделювання апаратних засобів.
- •9.5.Задача про ханойські башні.
- •9.6.Ділення слів на склади.
- •9.7. Задача про n королев.
- •10.Особливі технічні прийоми для професіоналів.
- •10.1.Потоковий аналіз.
- •10.2.Керування потоковим аналізом.
- •10.3. Стиль програмування.
5.8.Порівняння складних об`єктів.
Складні об'єкти повинні зрівнюватись на еквівалентність з предикатами, визначеними програмістом, подібно до предикату are_equal із наступної програми:
domains
d = pair(integer, integer) ;
single(integer) ;
none
predicates
are_equal(d, d)
clauses
are_equal(X, X).
Задамо ціль goal: are_equal(5,4). Бачимо помилку в визначенні домену. Для фіксації проблеми додамо опис:
are_equal(integer, integer).
5.9.Узагальнення.
1.Програма Прологу може містити наступну множину типів даних: простий або складний, стандартний або визначений користувачем.
2.Складні структури даних дозволяють об`єднувать окремі частини інформації в один об`єкт. Він складається з імені (функтора) і одного або більше аргументів.
3.Функтор Прологу не відповідає функціям традиційних мов програмування типу Паскаль. Він не викликає ніякої дії.
4.Складна структура даних може уніфікуватись з простою змінною, або з складним об`єктом, який має відповідну структуру. Знак “=“ використовується для уніфікації складних об`єктів.
Вправи.
5.1. Виберіть деяку форму задання бази даних, в якій містяться повідомлення про операції з кредитними карточками. Кожний запис повинен мати інформацію про прізвище особи, яка тратить гроші, про тип операції і кількість грошей. Напишіть програму, яка буде видавати значення кінцевої суми всіх операцій для конкретної особи.
5.2. Нехай нам потрібно створити базу даних про сім`ї, яка б дозволяла оперувати з наступною інформацією. Кожна сім`я складається з трьох компонент: чоловік, дружина і діти. Оскільки кількість дітей в різних сім`ях може бути різною, тому бажано їх задавати у вигляді списку, який складається з довільної кількості елементів. Кожного члена сім`ї в свою чергу можна задати структурою, яка складається з чотирьох компонент: ім`я, прізвище, дата народження і місце роботи. Інформація про роботу може бути такою - це або “не працює”, або вказівка на місце роботи і заробітної плати.
Напишіть терм, який би дозволяв:
а)посилатись на всіх Іванових;
б)посилатись на всі сім`ї, які мають трьох дітей.
Побудуйте запит:
а)який би дозволяв знаходити всіх заміжніх жінок, які мають не менше трьох дітей.
Побудуйте набір предикатів, який би дозволив використати наступні запити до бази даних:
а)знайти всіх людей із бази даних;
b)знайти всіх дітей, які народились в 1990 році;
с)знайти всіх дружин, які працюють;
g)знайти людей, які народились до 1960 року;
е)знайти загальний заробіток кожної сім`ї.
6. Ітерація і рекурсія.
6.1.Реалізація ітераційного процесу за допомогою бектрекінгу.
В цьому розділі ми розглянемо спочатку організацію циклічної обробки, а потім рекурсивні структури даних.
Пролог допускає тільки два типи повторних дій: бектрекінг і рекурсію. В програмі, зображеній на мал.6.1, показано використання бектрекінгу для реалізації циклу. На поставлений запит будуть друкуватись всі можливі рішення.
predicates
country(symbol)
print_countries
clauses
country(england).
country(france).
country(germany).
country(denmark).
print_countries :- country(X),
write(X), /* write the value of X */
nl, /* start a new line */
fail.
print_countries.
мал.6.1.
Перша фраза говорить: "Знаходячи розв'язок предикату cuntry(x), надрукувати країну Х і перейти на нову стрічку.” Потім викликається предикат fail. В цьому випадку fail позначає наступне: якщо розв'язок поставленої цілі ще може бути знайдений, тоді повернутись і пошукати альтернативний розв'язок.
Вмонтований предикат fail завжди має хибне значення, але ми могли б форсувати бектрекінг, використавши якийсь інший, завжди хибний предикат типу 10 = 3 + 4, або country(abracadabra) .
Таким чином, будуть надруковані всі країни і процес обробки системою першої фрази закінчиться. Після, почнеться обробка другої фрази того ж предикату print-countries. Вона нічого не робить, а тільки завершає успіхом роботу системи. Кінцеве виведення буде мати вигляд:
england
france
germany
denmark Yes
Якби не було другої фрази, виведення закінчувалось - No, а все інше виведення залишилось без змін.