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),