
- •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. Стиль програмування.
4.3.Предикат not - заперечення як неуспіх.
Розглянемо фразу "Ваня любить всі ігри крім баскетболу." Попробуємо записати її на Пролозі. Першу частину цього твердження виразити легко: "Ваня любить довільне Х, якщо Х - гра", або ж :
like(wanja,X):-game(X).
Aлe ж потрібно виключити баскетбол. Це можна зробити використавши інше формулювання:
Якщо Х - баскетбол, тоді "Ваня любить Х" не буде істиною, інакше, якщо Х - гра, тоді "Ваня любить Х".
Для реалізації цього на Пролозі, використаємо предикат fail, який завжди закінчується невдало, вимагаючи закінчитися невдало і ту ціль, яка є її батьком:
like(wanja, X):- basketball(X),!,fail.
like(wanja, X):- game(X).
Тут відтинання відкине із розгляду друге правило, коли гра - баскетбол, а fail викличе неуспіх.
Цей приклад показує, що бажано мати унарний предикат not, такий що not(Ціль) буде істинним у випадку, коли Ціль не є істиною. На Пролозі його можна описати наступним чином:
not(P):- P,!, fail;
true.
Пролог система має вмонтований предикат not, реалізований подібним чином.
Тоді наш приклад можна переписати в такому вигляді:
like(wahja,X):- game(X),
not( basketball(X)).
Наступна программа показує використання предикату not.
Єдине, що потрібно відмітити, це те, що: предикат not виконується успішно, коли підціль не є істиною. Іншими словами, not виконується успішно, коли ассоційована з ним підціль не може довести істинність.
domains
name = symbol
gpa = real
predicates
honor_student(name)
student(name, gpa)
probation(name)
clauses
honor_student(Name):-
student(Name, GPA),
GPA>=3.5,
not(probation(Name)).
student("Betty Blue", 3.5).
student("David Smith", 2.0).
student("John Johnson", 3.7).
probation("Betty Blue").
probation("David Smith").
На запит honor_student(Name) вона видрукує список студентів, середній бал яких більший або ж дорівнює 3.5 за виключенням студентів Betty Blue і David Smith, які проходять випробувальний термін.
4.4.Труднощі у використанні відтинання і заперечення.
Виділимо спочатку переваги використання відтинання:
1.За допомогою предикату cut можна підвищити ефективність програми.
2.Використовуючи cut, можна описати взаємовиключні правила, тому є можливість запрограмувати твердження: якщо умова P, тоді розв'язок Q, інакше розв'язок R.
Обмеження на використання відтинання виходять із декларативної сторони прологівської програми. Якщо в програмі немає відтинання, тоді ми можемо міняти місцями порядок речень і цілей. Якщо ж предикат cut присутній в програмі, тоді зміна порядку речень в програмі може вплинути на її декларативний зміст (дати інший розв'язок).
Якщо видалення відтинання з програми не міняє її декларативного змісту, тоді таке відтинання називають "зеленим". В іншому випадку відтинання називають "червоним".
Працювати з запереченням також треба обережно. Труднощі виникають тому, що заперечення, яке ми використовуємо, не повністю відповідає математичному запереченню.
Якщо ми побудуємо запит системі:
goal: not(dog(baks)),
вона, можливо, відповість "так". Але цю відповідь не можна розуміти як повідомлення про те, що "Бакс не собака", а потрібно трактувати те, що системі не вистачає інформації для доведення твердження " Бакс - собака". Такий підхід бере свій початок від припущення про замкнутість світу. В відповідності до цього постулату світ замкнутий в тому розумінні, що все, що в ньому існує або ж вказане в програмі, або може бути із неї виведене. І в іншому випадку, якщо щось не міститься в програмі (не може бути з неї виведеним), тоді воно хибне, і відповідно буде істинним його заперечення.
Ми ж традиційно не вважаємо світ замкнутим: якщо в програмі явно не сказано, що dog(baks), тоді це ще не значить, що ми хочемо сказати, що Бакс не собака.
Приведемо ще один приклад обережного використання not:
predicates
r(symbol)
g(symbol)
p(symbol)
clauses
r(a).
g(b).
p(X):-not(r(X)).
На запит goal: g(X), p(X) cистема відповість Х=b, а на запит goal: p(X), g(X) система відповість no (ні). Вся різниця заключається у тому, що в першому випадку змінна Х до моменту обчислення Р(X) була вже зв'язана, а в другому випадку цього ще не трапилось.