
- •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. Стиль програмування.
3.2 Стандартні домени.
Пролог має декілька вмонтованих стандартних доменів, основні з яких приводяться нижче. Ви можете використовувати стандартні домени при опису типів аргументів предикату. Їх не потрібно визначати в розділі domains.
Домен |
Опис |
char integer real |
символ, взятий в одинарні лапки цілі від -32768 до 32767 числа, з необов`язковим знаком + або - , який стоїть перед деяким числом DDDDDDD, потім необов`язкова десяткова крапка (.), яка стоїть перед наступним числом DDDDDDD і необов`якова експоненційна частина (е(+ -)DDD):<+: ->DDDDD<.>DDDDDDD<e<+ : ->DDD>
Приклади дійсних чисел: 42705 9999 86.74 9111.769483 521е238 67.85е+21 Допустимий діапазон чисел від 1е-307 до 1е+308. При необхідності цілі числа автоматично перетворюються в дійсні. |
string |
довільна послідовність символів, які заключені в подвійні лапки. |
symbol |
Існує два формати символів: 1. послідовність букв, чисел і підкреслень, які починаються з великої букви; 2. послідовність символів, які заключені в подвійні лапки (випадок, коли символ не починається з великої букви або ж коли містяться проміжки). |
Число аргументів предикату називається арністю предикату. Пролог допускає предикати з однаковою назвою але різною арністю.
Пролог проводить автоматичне перетворення доменів:
1. між стрічками і символами;
2. між цілим, символьним і дійсним доменом.
3.3.Синтаксис правила.
Як ми вже зазначали, синтаксис правила складається з трьох частин:
голова: - <підціль>, <підціль>, ... , <підціль>.
Кожна підціль викликає відповідний предикат Прологу. Пролог - система тестує викликаний предикат і перевіряє чи може він задовільнитися. Якщо поточна підціль буде задоволена, тоді виклик справджується і обробка переходить до наступної підцілі. Якщо обробка успішно досягла крапки, тоді кажуть, що правило істинне.
Якщо якась з підцілей завершується невдачею, тоді Пролог - система повертається назад і переглядає альтернативи попередньо переглянутих підцілей, але з уже іншими значеннями параметрів. Цей процес називається бектрекінгом.
3.4.Директиви комп`ютеру.
Ви можете включити в програму деякі директиви комп`ютеру безпосередньо в програмі або ж вибравши пункт меню Options /Compiler Directives. Наприклад, директиву include.
За допомогою директиви include ви можете підключити до програми написані вами попередньо процедури. Це робиться наступним чином. Додамо стрічку include “my.pro” на початок вашої програми. А в файлі my.pro описуються процедури, які використовуються в вашій програмі.
3.5.Бектрекінг.
Часто при вирішенні конкретних задач вам необхідно переглядати всі можливі шляхи розв'язку задачі. Якщо розглянутий шлях не дає відповіді, ви мусите переглянути альтернативний шлях. Такий підхід до розв'язку задач дістав назву бектрекінг.
Пролог реалізує бектрекінг таким чином. На початку пошуку вирішення поставленої проблеми, він розміщує маркер на місце проглядання і вибирає першу підціль. Якщо її вирішення закінчиться невдачею, тоді Пролог повертається в точку, відмічену маркером і пробує знайти альтернативну підціль. При поверненні в точку бектрекінгу, він звільня всі змінні, зв`язані після входу в дану точку.
Розглянемо наступну програму.
domains
name, thing = symbol
predicates
likes(name, thing)
reads(name)
is_inquisitive(name)
clauses
likes(john, wine).
likes(lance, skiing).
likes(Z,books) :-reads(Z),
is_inquisitive(Z).
likes(lance, books).
likes(lance, films).
reads(john).
is_inquisitive(join).
Задамо системі запитання у вигляді цілі, яка складається з двох підцілей:
likes(X,wine), likes(X,books)
Пролог починає виведення згідно основного принципу бектрекінгу. Підцілі повинні задовільнюватися послідовно зверху вниз.
Пролог визначає яка підціль буде використовуватись для задоволення відповідного фрагменту предикату згідно другого принципу бектрекінгу. Фрагменти предикату розглядаються в тому порядку, в якому вони розміщені в програмі - послідовно зверху вниз.
Підціль likes(X, wine) відповідає факту likes(john, wine). Тому Х зв'язується з john. Потім Пролог пробує задовольнити наступну підціль справа. Виклик другої підцілі розпочинає новий пошук з Х = john. Перший пункт likes(john,wine) не відповідає підцілі likes(X,books), тому що wine не є тим же, що й books. Тому Пролог пробує підібрати наступний пункт. Подальший пошук визначається третім правилом бектрекінгу. Коли підціль відповідає голові, тоді наступним повинно задовільнятися тіло даного правила. Тіло правила в свою чергу створює нові підцілі, котрі повинні бути задоволені.
І накінець, четвертий принцип бектрекінгу говорить. Ціль буде задоволена, коли будуть знайдені відповідні факти для кожного рівня дерева цілі.