Лабораторна робота №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', _),