Теоретическая часть лабораторной работы №7

Работа с внутренней базой данных в Visual Prolog.

1. ВСТРОЕННЫЕ ПРЕДИКАТЫ VISUAL PROLOG ДЛЯ РАБОТЫ С ВНУТРЕННЕЙ БАЗОЙ ДАННЫХ

У стандартных предикатов баз данных Visual Prolog (assserta,assertz,retract, retactall, consult и save) может быть один или два аргумента. Необязательный второй аргумент - это имя внутренней базы данных.

 consult(ИмяФайлаДос)

       (string) - (i)

 consult(ИмяФайлаДос,ИмяВнутреннейБазыДанных)

       (string,InternalDatabaseName) - (i,i)

Оба предиката consult предназначены для того, чтобы прочитать существующий файл ИмяФайлаДос и добавить его в конец текущей базы данных.

Предикат consult с одним аргументом (без имени базы данных) позволяет считывать факты, объявленные в стандартном разделе database.

При вызове предиката consult с двумя аргументами извлекаются факты только базы данных с именем ИмяВнутреннейБазыДанных.

/*===========================================================

Примеры добавления фактов базы данных из файла с помощъю предиката consult с

                                            одним и двумя аргументами            */

DOMAINS

  ILIST=INTEGER*

FACTS

  p1(INTEGER,CHAR,REAL,STRING,SYMBOL,ILIST)

  p2(INTEGER)

GOAL

consult("dd.dat"),     % чтение фактов р1 и р2 из файла dd.dat для текущей базы данных

retract(p1(1,_,_,_,_,_)),% удаление факта р1 из теущей базы  данных, описание предиката см.ниже

save("dd. dat").        % сохранение фактов р1 и р2 текущей  базы данных в файле dd. dat  

/*---------- Пусть содержимое файла dd. dat было:-------------

p1(1,'a',44.44,"Turbo","Prolog",[1,2,3,4])

p1(2,'b',-4.444E-98,"---","++++",[])

p2(88)

p2(99)

Проверьте содержимое файла dd. dat после одноразового выполнения программы.

/*===========================================================

 save(ИмяФайлаДос)

    (string) - (i)

save(ИмяФайлаДос,ИмяВнутреннейБазыДанных)

    (string,DatabaseName) - (i,i)

Оба предиката служат для сохранения фактов внутренней базы данных в файле с именем ИмяФайлаДос. Предикат save с одним аргументом сохраняет все факты стандартной базы данных, описанные в программе, в указанный файл (см.пример выше для consult с одним аргументом). Предикат save с двумя аргументами сохраняет в файле ИмяФайлаДос все факты базы данных ИмяВнутреннейБазыДанных.

/*===========================================================

Пример работы предиката save с одним аргументом                  */

DOMAINS

  LIST = INTEGER*

DATABASE

  fact1(INTEGER,STRING,LIST)

  fact2(INTEGER,STRING)

CLAUSES

  fact1(1,"факт1",[1,2,3]).

  fact1(2,"факт2",[1,3]).

  fact1(3,"факт2",[3,2,1]).

  fact2(1,"один").

  fact2(1,"один ещё раз").

  fact2(2,"два").

Goal

  save("fact. dat").   /* сохранение фактов fact1 и fact2 стандартной базы данных в файле fact. dat */

===========================================================*/

Следующие три предиката предназначены для добавления факта в текущую базу данных.

assert(Отношение)

      (InternalDatabaseDomain) - (i)

Использование предиката assert в точности соответствует использованию предиката assertz.

asserta(Отношение)

       (InternalDatabaseDomain) - (i)

Предикат asserta добавляет новый факт ОбъектВнутреннейБазыДанных к базе данных перед существующими фактами - в начало базы данных.

assertz(Отношение)

       (InternalDatabaseDomain) - (i)

Предикат assertz добавляет новый факт ОбъектВнутреннейБазыДанных после существующих фактов - в конец базы данных.

 /*===========================================================

Пример работы предиката asserta c двумя аргументами */

DOMAINS

  имя,адрес,название_города = STRING

  возраст,код = INTEGER

FACTS - люди

  человек(имя,возраст,адрес,код)

FACTS - города

  город(код,название_города)

GOAL

  assertа(человек("Петр",26,"",8600),люди), % все факты будут

  assertа(человек("Лука",27,"",8600),люди), % добавляться в

  assertа(человек("Хома",23,"",9800),люди), % начало соответ-

  assertа(город(8600,"Жмеринка"),города),   % ствующей базы

  assertа(city(6800,"Париж"),города).       % данных - люди  или города

/*=========================================================*/

Предикат retract обеспечивает удаление первого факта базы данных (стандартной или соответствующей второму аргументу предиката - ИмяВнутреннейБазыДанных) соответствующего первому аргументу предиката Отношение. Предикат истинен, если удалось удалить что-либо из базы данных.

retract(Отношение)

       (InternalDatabaseDomain) - (_)

retract(Отношение,ИмяВнутреннейБазыДанных)

       (InternalDatabaseDomain) - (_,i)

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

retractall(Отношение)

          (InternalDatabaseDomain) - (_)

retractall(_,ИмяВнутреннейБазыДанных)

          (InternalDatabaseDomain) - (_,i)

 

readterm(ИмяВнутреннейБазыДанных,Отношение)

        (DomainName,Domain) - (i,_)

Предикат предназначен для чтения факта Отношение внутренней базы данных с текущего устройства ввода.

 /*===========================================================

Пример использования предиката  readterm                             */

domains

   file = dbase

database - mydbase   

   ...                            % факты базы данных

predicates

   my_consult(string)

   repeat(file)

clauses

   my_consult(ИмяФайла) :-

                               openread(dbase, ИмяФайла),  % открыть файл для чтения,

                               readdevice(dbase),       % назначение устройства ввода,

                               repeat(ИмяФайла),

                               readterm(mydbase,Отношение),%чтение факта из базы данных

                               assertz(Отношение),         %добавление факта Отношение

                               fail.                       

   my_consult(_).

   repeat(_).                     

   repeat(File) :- not(eof(File)), repeat(File).

%============================================================