База данных в Прологе это совокупность фактов. Факты статичны и не меняются при каждом новом запросе (запуске программы).
Пример:
PREDICATES
fact(string,integer)
CLAUSES
fact("Иван",20).
fact("Петя",25).
fact("Коля",16).
|
К такой базе можно делать запросы на выборку информации, но добавлять или удалять факты (редактировать базу) нельзя. Пример запроса в окне Диалога: fact(Name,Age),Age>20. Такой запрос осуществит выборку всех имен, которым соответствует возраст более 20 лет.
Аналогичный запрос, но оформленный в виде внутренней цели программы с выводом результатов в окно и предполагающий диалог с пользователем выглядит так:
PREDICATES
fact(string,integer)
print(integer)
CLAUSES
fact("Иван",20).
fact("Петя",25).
fact("Коля",16).
print(V):-
fact(Name,Age),
Age>=V,
write(" - ",Name),nl,
fail.
print(_).
GOAL
makewindow(1,126,7,"факты",2,2,18,25),
cursor(1,0),
write("введите возpаст - "),
readint(V),
print(V),
readchar(_).
|
Динамические базы данных называются динамическими, потому что факты в них не являются статичными, их можно удалять и добавлять.
Предикаты для работы с динамическими базами данных:
assert(факт) assertz(факт) |
добавить факт в конец базы |
asserta(факт) |
добавить факт в начало базы |
retract(факт) |
удалить факт из базы |
retractall(_) |
удалить все факты из базы |
save("имя файла") |
сохранить базу в файл |
consult("имя файла") |
загрузить базу из файла |
Несколько примеров употребления предикатов:
assert(fact("Степан",29)) - добавить в базу данных факт
retract(fact("Степан",29)) - удалить из базы данных факт
save("my.txt") - сохранить все факты в файл
consult("my.txt") - загрузить все факты из файл
Сделаем базу данных динамической, для чего введем раздел DATABASE и предикат fact(string,integer) объявим в нём:
DATABASE
fact(string,integer)
GOAL
clearwindow(),
write("введите имя - "),
readln(Name),
write("введите возpаст - "),
readint(Age),
assert(fact(Name,Age)),
save("my.txt").
|
В этой программе нет раздела CLAUSES, так как мы и не собираемся хранить факты в теле программы. Все факты мы вынесем в отдельный файл, который будет загружаться, редактироваться и сохраняться во время работы основной программы. Но эту программу уже можно запустить на исполнение - она позволит добавить один факт в базу и затем сохранит его в файл. Файл с базой будет сохраняться в текущей папке. При каждом последующем запуске, предыдущий файл стирается и записывается новый с одним фактом. Просмотрите содержимое файла после работы программы. Так работать неудобно, нужно сделать так, чтобы можно было добавлять факты к ранее сохраненной версии базы данных. Для реализации указанной возможности достаточно добавить в программу два предиката: выгрузить из памяти предыдущее содержимое базы данных и добавить факты из файла:
DATABASE
fact(string,integer)
GOAL
clearwindow(),
write("введите имя - "),
readln(Name),
write("введите возpаст - "),
readint(Age),
retractall(_),
consult("my.txt"),
assert(fact(Name,Age)),
save("my.txt").
|
Предикат consult именно добавляет факты из файла не затирая предыдущие, поэтому, если предварительно не использовать retractall, в памяти будут оставаться дубликаты фактов и при последующем сохранении базы в файл вы увидите их повторы, а при запросах к такой базе вы будете получать повторяющиеся результаты.
Если вы уже несколько раз запускали программу, то в файле динамической базы данных будет содержаться несколько фактов. Используя ранее разработанный предикат print, можно вывести содержимое базы на экран:
PREDICATES
print
DATABASE
fact(string,integer)
CLAUSES
print:-
fact(Name,Age),
write(Name," - ",Age),nl,
fail.
print.
GOAL
clearwindow(),
retractall(_),
consult("my.txt"),
print.
|
Для удобства работы пользователя с динамической базой данных следует подготовить несколько предикатов (добавить факт, удалить факт, отобрать факты по условию и т.п.) и сгруппировать их в специально подготовленное меню. Пользователю останется лишь выбирать опции меню и вводить параметры запросов. Подробнее можно посмотреть в методическом пособии по динамическим базам данных.
|