На этом шаге мы рассмотрим внутреннюю базу фактов.
На этом шаге мы опишем, как нужно объявлять разделы внутренних баз фактов Пролога (internal fact databases) и как можно изменить содержание вашей внутренней базы фактов.
Внутренняя база фактов состоит из фактов, которые вы можете непосредственно добавлять и удалять из вашей программы на Прологе во время ее исполнения. Вы можете объявлять предикаты, описывающие внутреннюю базу данных в разделе database программы и применять эти предикаты таким же образом, как используются предикаты, описанные в разделе predicates.
Для добавления новых фактов в базу данных в Прологе используются предикаты insert, asserta, assertz, а предикаты retract и retractall служат для удаления существующих фактов. Вы можете изменить содержание вашей базы фактов, сначалa удалив факт, а потом вставив новую версию этого факта (или совершенно другой факт). Предикаты consult/1 и consult/2 считывают факты из файла и добавляют их к внутренней базе данных, a save/1 и save/2 сохраняют содержимое внутренней базы фактов в файле.
Пролог интерпретирует факты, принадлежащие к базе данных, таким же образом, как обычные предикаты. Факты предикатов внутренней базы фактов хранятся в таблице, которую можно легко изменять, тогда как обычные предикаты для достижения максимальной скорости компилируются в двоичный код.
Ключевое слово database определяет начало объявления раздела database. Раздел database состоит из последовательности объявлений предикатов, описывающих соответствующую внутреннюю базу фактов. Во время выполнения можно с помощью предикатов assert и assertz добавлять факты (но не правила) в базу фактов. Или, вызвав стандартный предикат consult, вы можете извлечь добавляемые факты из файла на диске. Раздел database может выглядеть так, как в следующем примере:
domains name,address=string age=integer gender=male; female database person(name,address,age,gender) predicates male(name,address,age) female(name,address,age) child(name,age,gender) clauses male(Name,Address,Age):- person(Name,Address,Age,male). ...
В этом примере вы можете использовать предикат person таким же образом, как используются другие предикаты (male, female, child). Единственное отличие состоит в том, что вы можете добавлять и удалять факты для предиката person во время работы программы.
Следует отметить следующие два ограничения на предикаты, объявленные в разделе фактов:
Допускается наличие нескольких разделов database, но для этого нужно явно указать имя каждого раздела database.
database - mydatabase
myFirstRelation(integer)
mySecondRelation(real,string)
myThirdRelation(string)
/* etc. */
Описание раздела database с именем mydatabase создает базу данных фактов с именем mydatabase. Если вы не даете имени внутренней базе фактов, то по умолчанию ей присваивается стандартное имя dbasedom.
На следующем шаге мы рассмотрим использование внутренних баз фактов.