
- •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. Стиль програмування.
9. Техніка програмування в пролозі.
В цьому розділі ми розглянемо базові підходи до реалізації основних типів алгоритмів в Пролозі.
9.1.Принципи побудови експертної системи.
Розглянемо наступну задачу. Потрібно реалізувати експертну систему, яка б визначала тварину, яку мав на увазі користувач із семи зазначених. Експертна система знайде тварину за допомогою опитування користувача. Цей приклад демонструє бектрекінг для перегляду бази даних і показує ефективне використання предикату not. Типовим діалогом користувача з експертною системою може бути наступний:
goal: run.
Has it hair?
yes
does it eat meat?
yes
has it a fawn color?
yes
has it dark spots?
yes
Your animal may be a (an) cheetah!
Для програмування діалогу потрібні два кроки. Перший крок заключається в наповненні бази системи знаннями, а результуючий - в побудові виведення відповіді. Повна програма приведена на малюнку 9.1.
database
xpositive(symbol, symbol)
xnegative(symbol, symbol)
predicates
animal_is(symbol)
it_is(symbol)
ask(symbol, symbol, symbol)
remember(symbol, symbol, symbol)
positive(symbol, symbol)
negative(symbol, symbol)
clear_facts
run
clauses
animal_is(cheetah) :- it_is(mammal),
it_is(carnivore),
positive(has, tawny_color),
positive(has, dark_spots).
animal_is(tiger) :- it_is(mammal),
it_is(carnivore),
positive(has, tawny_color),
positive(has, black_stripes).
animal_is(giraffe) :- it_is(ungulate),
positive(has, long_neck),
positive(has, long_legs),
positive(has, dark_spots).
animal_is(zebra) :- it_is(ungulate),
positive(has,black_stripes).
animal_is(ostrich) :- it_is(bird),
negative(does, fly),
positive(has, long_neck),
positive(has, long_legs),
positive(has, black_and_white_color).
animal_is(penguin) :- it_is(bird),
negative(does, fly),
positive(does, swim),
positive(has, black_and_white_color).
animal_is(albatross) :-
it_is(bird), positive(does, fly_well).
it_is(mammal) :- positive(has, hair).
it_is(mammal) :- positive(does, give_milk).
it_is(bird) :- positive(has, feathers).
it_is(bird) :- positive(does, fly),
positive(does,lay_eggs).
it_is(carnivore) :- positive(does, eat_meat).
it_is(carnivore) :- positive(has, pointed_teeth),
positive(has, claws),
positive(has, forward_eyes).
it_is(ungulate) :- it_is(mammal),
positive(has, hooves).
it_is(ungulate) :- it_is(mammal),
positive(does, chew_cud).
positive(X, Y) :- xpositive(X, Y), !.
positive(X, Y) :- not(xnegative(X, Y)),
ask(X, Y, yes).
negative(X, Y) :- xnegative(X, Y), !.
negative(X, Y) :- not(xpositive(X, Y)),
ask(X, Y, no).
ask(X, Y, yes) :- !,
write(X, " it ", Y, '\n'),
readln(Reply),
frontchar(Reply, 'y', _),
remember(X, Y, yes).
ask(X, Y, no) :- !,
write(X, " it ", Y, '\n'),
readln(Reply),
frontchar(Reply, 'n', _),
remember(X, Y, no).
remember(X, Y, yes) :- assertz(xpositive(X,Y)).
remember(X, Y, no) :- assertz(xnegative(X,Y)).
clear_facts :-
write("\n\nPlease press the space bar to exit\n"),
retractall(_, dbasedom), readchar(_).
run :-
animal_is(X), !,
write("\nYour animal may be a (an) ",X),
nl, nl, clear_facts.
run :-
write("\nUnable to determine what"),
write("your animal is.\n\n"), clear_facts.
Кожна тварина описується деяким числом характерних атрибутів, які вона має або ж не має. Вони задаються в предикатах animal_is і it_is. Питання, на які користувачу потрібно відповісти, реалізуються за допомогою використання предикатів рositive (X,Y) і negative (X,Y). Але система, між іншим, може задати і питання типу :
Does it have hair?
Отримавши відповідь, система приєднує її до попередньої інформації для подальшого використання.
Для простоти цей приклад програми буде розглядати тільки стверджувальні та заперечувальні відповіді. Тому вона використовує базу даних, яка містить тільки два предикати:
database
xpositive(symbol,symbol)
xnegative(symbol,symbol)
Наприклад, твердження , що тварина не має волосся тоді може бути задане таким чином:
xnegative(has,hair).
Але, попередньо, перед тим , як задавати запитання, система перевіряє чи відповідь не була відома раніше:
positive(X,Y):-
xpositive(X,Y),!.
positive(X,Y):- not (xnegative(X,Y)), ask(X,Y,yes).
negative(X,Y):-
xnegative(X,Y),!.
negative(X,Y):- not (xpositive(X,Y)), ask(X,Y,no).
Відмітимо, що останні правила, які використовуються тут при визначенні предикатів positive і negative забезпечують реалізацію тієї ситуації, щоб спростування не трапилось раніше, ніж пройшло опитування користувача.
Предикат ask задає питання і організовує обробку відповіді. Якщо відповідь починається з букви Y, тоді система приймає відповідь Yes, а, якщо відповідь починається з N, тоді в якості відповіді приймається - No.
ask(X,Y,yes):- !, write(X,"it",Y,'\n'),
readln(Reply),
frontchar(Reply, 'y',_),
remember(X,Y,yes).
ask(X,Y,no):- !, write(X,"it",Y,'\n'),
readln(Reply),
frontchar(Reply, 'n',_),
remember(X,Y,no).
remember(X,Y,yes):- assertr(xpositive(X,Y)).
remember(X,Y,no) :- assertr(xnegative(X,Y)).
При роботі з базами даних потрібно також пам`ятати наступне. Під час поповнення бази новими фактами, старі факти повинні зсуватись, щоб не затертись новими. Цю функцію в програмі виконує вмонтований предикат retractall, який використовується при визначенні предикату clearfacts.
clear_facts:-
write("\n\n Please press the space bar to exit\n"),
retractall(_, dbasedom),
readchar(_).
Якщо ви попередньо наберете програму і наповните базу, тоді для запуску програми ви можете використати предикат run.
run:-
animal_is(X),!,
write("\nYour animal may be a(an)", X),
nl,nl, clear_facts.
run:- write("\nUnable to determine what"),
write("your animal is.\n\n"),
clear_facts.