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