Бэктрекинг   Рекурсия  

РАЗДЕЛЫ САЙТА


ДИНАМИЧЕСКИЕ БАЗЫ ДАННЫХ

База данных в Прологе это совокупность фактов. Факты статичны и не меняются при каждом новом запросе (запуске программы).
Пример:

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.


Для удобства работы пользователя с динамической базой данных следует подготовить несколько предикатов (добавить факт, удалить факт, отобрать факты по условию и т.п.) и сгруппировать их в специально подготовленное меню. Пользователю останется лишь выбирать опции меню и вводить параметры запросов. Подробнее можно посмотреть в методическом пособии по динамическим базам данных.




©Copyright 2007 - Беляков Андрей Юрьевич - Про Пролог / proprolog.narod.ru - All Rights Reserved