Динамические БД в Прологе

В ПРОЛОГе сущ. средства для хранения однор. структурой во встроенной БД и зад. именем. Утверждения ДБД (факты) в отл. от хран. в разделе “клауза” мож. загружать с диска, выгружать на диск, созд. и уничтож. в процессе работы. Сущ различные программы.

При использовании ДБД вводится новый раздел

database

<имя базы>(<тип 1-го элем-та>,..., тип n-го эл.)

student (name, gr, b)

clauses

student (“Петров”, 140, 4.2)

В основном используется для загрузки переменной составляющей знаний и для ответов пользователей.

Динамическую базу можно загружать из файла и выгружать на файл.

Рассмотрим использование ДБД для фиксации ответов пользователя на вопрос.

Пусть в БЗ хранятся сведения о животных. Сии может запрашивать у пользователя недостающую информацию, если раньше этот вопрос не задавался и не был получен положительный ответ.

database

otvet_da (symbol)

predicates

.......

da (symbol)

clauses

giv (“обез”):- da (“млекоп”), da (“тёмн. пятна”).

....................

da(X):- otvet_da(X),!. /*ранее был положительный ответ на вопрос Х?*/

da(X):- write (X,”Y/N?”), nl

readchar (P)

P=’Y’,

Assert (otvet_da(X)). /*фиксация ответов в ДБД*/

При отрицательном ответе подцель “да” не сопоставляется, но сам отрицательный ответ не фиксируется. При начале нового сеанса все ответы предыдущего должны быть стёрты, поэтому запуск делается следующим образом

Run(X):- retractall (otvet_da(_)), giv(X).

Желательно использовать и фиксировать и отрицательные ответы.

Рассмотрим один из вариантов использования и положительных и отрицательных ответов

da(X):- otvet_da(X),!.

da(X):- not (otvet_net(X)),

ask(X), otvet_da(X).

ask(X):- write (X, “Y/N?”), nl,

readchar (P),

fix (X,P), /*фиксировать отчёт Р на вопрос Х*/

fix (X,P):- P=’Y’, assert (otvet_da(X)),!.

fix (X,P):- P=’N’, assert (otvet_net(X)),!.

fix (X,P):- write (“Проверить ответ”), ask(X).

net(X):- otvet_net(X),!.

net(X):- not (otvet_da(X),

ask(X), otvet_net(X).

Примечание: продумать свои варианты.

 

Hosted by uCoz