Шаг 60.
Основы логического программирования.
Внутренняя база фактов

    На этом шаге мы рассмотрим внутреннюю базу фактов.

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

    На следующем шаге мы рассмотрим использование внутренних баз фактов.




Предыдущий шаг Содержание Следующий шаг