logo
Моделирование систем / Моделирование систем / Теория / Dop / АИС_Конспект

3.4.6. Особенности работы с базой фактов

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

В VIP используется потоковая технология ввода – вывода информации. Для вывода информации в текстовый файл служит специальный системный домен file . В программу нужно ввести файловый домен в виде:

file=file_domen

Если требуется выполнить вывод содержания предметной области в файл, то для этого нужно создать специальный файловый поток. Файловый поток содается с помощью предикатов:

openwrite(file_domen,”имя файла на диске”)

writedevice(file_domen)

Первый предикат выполняет связывания файлового потока с физическим файлом на диске, а второй предикат инициализирует поток вывода.

После завершения вывода поток должен быть закрыт, переадресован на консоль. Для этого используется системный предикат

closefile(file_domen)

Восстановление вывода на консоль выполняется предикатом writedevice, в качестве аргумента следует указать системное имя консоли screen.

Вывод строк текстового файла на экран производится с помощью системных предикатов:

openread(file_domen,”имя файла”)

readdevice(file_domen)

eof(file_domen)

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

После завершения чтения строк файла нужно файловый поток ввода закрыть, и переадресовать ввод на консоль.

Пример программы записи фактов предметной области в текстовый файл с последующим контрольным выводом содержимого файла на экран.

domains

id,name = symbol

zip = integer

file = outfile

predicates

employee(id,name,zip)

prnlst

getlst

clauses

%факты предметной области

employee("100","Иванова",12).

employee("200","Петров",15).

employee("300","Антонова",12).

%запись фактов на диск

prnlst:- %запись в файл

openwrite(outfile,"employ.lst"),

writedevice(outfile),

employee(Id,N,Z),write(Id," ",N," ",Z),nl,fail.

prnlst:- %закрыть в файл

writedevice(screen),

closefile(outfile),

write("Done !"),nl,readchar(_).

getlst:- %читать строки

readdevice(outfile),not(eof(outfile)),

readln(Bufer),write(Bufer),nl,

getlst.

getlst:- %закрыть файл

writedevice(screen),closefile(outfile),

readchar(_).

goal %печать и открытие файла

prnlst,openread(outfile,"employ.lst"),getlst.

Описание предметной области, построенное в разделе clauses программы – статическое. Для получения динамического описания нужно использовать базу данных фактов. Такая база данных – модель предметной области, размещенная в оперативной памяти ЭВМ. В оперативной памяти можно разместить только факты. После помещения фактов в оперативную память предметную область можно изменять: добавлять и удалять факты. Контроль за наличие в оперативной памяти повторяющихся фактов возлагается на разработчика программы.

Для создания такой базы фактов нужно в программу поместить раздел facts – name. Здесь name – необязательный параметр для присвоения имени динамической базе фактов. По умолчанию используется база фактов с именем dbasedom.

Обслуживание динамических фактов выполняется системными предикатами:

asserta(fact) – добавление факта перед имеющимся;

asserta(fact,name) – добавление факта перед имеющимся;

assertz(fact) – добавление факта после последнего;

assertz(fact,name) – добавление факта после последнего;

retract(fact) – удаление факта по образцу;

retract(fact,name) – удаление факта по образцу;

retractall(fact) – удаление всех фактов по образцу;

retractall(fact,name) – удаление всех фактов по образцу.

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

Примеры. В предметной области хранится информация об отделах и служащих. Для этого используется два предиката:

otdel(integer kodotdela,string nazvotdela,

integer kodrukov)

sotrudniki(integer kodsotr,string familya,

integer kodotdela)

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

Примеры использования предикатов:

%Добавление факта:

assertz(otdel(10,“Бухгалтерия”,100)).

%удаление сотрудника:

retract(sotrudniki(_,”Иванова О.И.”,_),fsotrudniki).

%удаление сотрудников отдела с кодом 10

retractall(sotrudniki(_,_,10),fsotrudniki).

%удаление всех фактов из БД сотрудники:

retractall(_,fsotrudniki).

Предикат retract может использоваться с переменными, в этом случае перед удалением происходит связывание соответствующей переменной со значением из предметной области:

pr:-

retract(sotrudniki(Kod,Fam,KodOtd),fsotrudniki),

write(Kod,”\t”,Fam,”\t”,KodOtd),nl,fail.

Запись содержимого предметной области в текстовый файл выполняется предикатом save, а чтение данных в базу из ранее созданного факта предикатом consult.

Пример.

dbsave:-

save("C:\\temp\\persons.dat").

dbconsult:-

consult("C:\\temp\\persons.dat").

Для записи именованного набора фактов, вторым аргументом нужно указать имя набора.

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

Информация во внешней базе данных хранится в виде цепочки (chain). Цепочка это последовательность термов – фактов связанных между собой адресом, который хранится в адресном поле терма. Адрес формируется системно в процессе помещения факта в цепочку. Термы цепочки хранят информацию, которая обладает одинаковой структурой, но разным содержанием.

Например, цепочка, в которой хранится информация о товарах, будет представлена последовательностью термов со структурой:

Tovar(integer Kod,string Naimenovanie,integer KodPostavshika)

Для работы с внешней базой данных нужно объявить в разделе доменов селектор. Селектор – указатель на внешнюю базу данных. Если в программе несколько баз данных селекторы задают с помощью альтернативного домена. Общий формат задания селекторного домена имеет вид:

db_selector=s1;s2;…si

db_selector – домен селекторов Visual Prolog.

Пример:

domains

db_selector=dbp

Работа с базами данных требует использования определенных системных предикатов.

Создание базы данных выполняется предикатом db_create(Dbase,Name,Place)

Где: Name – имя базы данных, либо имя файла.

Place — размещение базы данных: in_memory (оперативная память), in_file(дисковый файл).

Пример создания базы в оперативной памяти:

db_create(dbp,"persons_list",in_memory).

Закрытие базы данных и ее удаление выполняется с помощью предикатов:

db_close(Dbase)

db_delete(Name,Place).

Пример:

db_close(dbp),

db_delete("persons_list",in_memory).

Если база данных находилась в дисковом файле, удаление базы приводит к уничтожению файла.

Работа с цепочками термов выполняется путем обращения к следующим предикатам:

chain_inserta(Dbase,Chain,Domain,Term,Ref)%(i,i,i,i,o)

chain_insertz(Dbase,Chain,Domain,Term,Ref)%(i,i,i,i,o)

chain_terms(Dbase,Chain,Domain,Term,Ref)%(i,i,i,o,o)

term_delete(Dbase,Chain,Ref)%(i,i,i)

term_replace(Dbase,Domain,Ref,Term)%(i,i,i,i)

Назначение предикатов в порядке следования: добавления терма в начало цепочки, добавление в конец, вывод информационного содержания терма, удаление терма, замена терма на новый.

Таблица 3.3. Аргументы предикатов.

Аргумент

Назначение

Dbase

Селектор базы данных

Chain

Идентификатор цепочки

Domain

Домен терма

Term

Предикат с данными

Ref

Указатель, адрес терма в цепочке

Использование предикатов требует учета спецификации потока ввода – вывода. Назначение аргументов предикатов сведены в таблицу 3.3.