На этом шаге мы рассмотрим внутреннюю базу фактов.
На этом шаге мы опишем, как нужно объявлять разделы внутренних баз фактов Пролога (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.
На следующем шаге мы рассмотрим использование внутренних баз фактов.