
- •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.6.Приклад, який ілюструє задання структури речення англійської мови.
Розглянемо приклад задання граматичної структури речення, використовуючи складний об'єкт. Найбільш просте речення має підмет і присудкову частину:
sentence = sentence(noun,verbphrase)
Де підмет є простим словом:
noun=noun(word),
а присудкова частина може мати або ж дієслово з пояснюючою частиною, або ж просто дієслово
verbphase=verbphrase(verb,noun);
verb(word)
verb = verb(word)
Використовуючи такий опис, речення 'Еllen owns the book.' може бути представлене
sentence(noun(ellen),verbphrase(verb(owns),noun(book)))
Відповідне дерево прийме вигляд
sentence
/ \
/ \
noun verbphrase
/ / \
/ verb noun
| | |
ellen owns the book
Подібний підхід може бути використаний при написанні блоку синтаксичного аналізу компілятора.
5.7.Опис змішаних складних об'єктів.
В цьому розділі ми розглянемо три різні типи опису доменів, які ви можете використовувати у ваших програмах. Ці описи дозволяють вам використовувати предикати, які:
мають аргумент , який може бути різного типу;
мають змінну кількість аргументів, кожний з яких окремого типу;
мають змінну кількість аргументів, деякі з яких можуть бути різного типу.
5.7.1.Аргументи, які можуть мати різний тип.
Для того, щоб дозволити предикату допустити аргументи різного типу, ви повинні додати опис функтору. Наприклад, в наступному прикладі фраза your_age, буде допускати аргумент типу age, який може бути стрічковим, цілим, дійсним.
predicates
your_age(age)
clauses
your_age(i(AGE)):-write(AGE)
your_age(r(AGE)):-write(AGE)
your_age(s(AGE)):-write(AGE)
тоді домен повинен бути наступним:
domains age = i(integer);
r(real);
s(string)
predicates your_age(age)
Поряд з тим Пролог не дозволяє наступні описи доменів:
domain
age = integer, real, string
5.7.2 Cписковий тип.
Припустимо, нам необхідно створити базу-довідник, в якій ми будемо зберігати дані про лекційні курси, які можуть читати професори. Її можна реалізувати наступною програмою:
predicates
teacher(symbol, symbol, symbol)
clauses
teacher(ed,willis,english).
teacher(ed,willis,math1).
teacher(ed,willis,hystory1).
teacher(mary,marker,english2).
teacher(mary,marker,math2).
teacher(cris,grim, geometry).
Тут в нас виникає необхідність повторювати прізвище для кожного предмету. Це марудно, тому краще використати тип списку. В наступному прикладі, аргумент classes, описаний як списковий тип.
domains
classes = symbol*
predicates teacher(symbol,symbol, classes)
clauses
teacher(ed, willis,[ english,math1, history1]).
teacher(mary, maker,[history2, math2 ]).
teacher(chris,grahm,[geometry]).
В цьому прикладі відмітимо опис DOMAINS :
domains
class = symbol*
Тут ми показуємо, як представляються в Пролозі списки.
Символ (*) означає, що class є символьним списком. Аналогічно можна визначити список цілих чисел:
domains
integer_list = integer*