Смекни!
smekni.com

Базы и банки знаний (стр. 2 из 2)

write("Enter author to delete: "),

readln(Aut),

delete_it(Aut,List,List1),

dbretract(kniga(Name,_,_,_)),

dbassert(kniga(Name,List1,Izd,God)),

write(Name,"has been modified in database."),nl,!,

write("Press space bar."),

readchar(_),!.

/*если запись не существует*/

proc(3):-

write("Can't find that book in the database."),nl,

closefile(datafile),

closefile(indexfile),nl,!,

write("Press space bar."),

readchar(_),!.

/*возврат в основное меню*/

proc(6).

/*Повтор*/

repeat.

repeat:-repeat.

/* Правила для работы с БД */

dbassert(Term):-

dbass(Term,"cbook.ind","cbook.dba").

dbretract(Term):-

dbret(Term,"cbook.ind","cbook.dba").

dbread(Term):-

dbrd(Term,"cbook.ind","cbook.dba").

/* Правило dbass записывает информацию в файл datafile и модифицирует файл indexfile */

/*запись данных в уже существующий файл*/

dbass(Term,Indexfile,Datafile):-

/*проверка существования файлов*/

existfile(Indexfile),

existfile(Datafile),

/*открывает файл данных на добавление*/

openappend(datafile,Datafile),

writedevice(datafile),

/*зпоминает позицию*/

filepos(datafile,Pos,0),

/*добавление записи*/

write(Term),nl,

/*закрыват файл данных*/

closefile(datafile),

/*открывает индексный файл на добавление*/

openappend(indexfile,Indexfile),

writedevice(indexfile),

/*Запись значения индекса, задаваемого переменной Pos.

Для записи индекса отводится поле, состоящее из 7 позиций.*/

writef("%7.0\n",Pos),

/*закрывает индексный файл*/

closefile(indexfile).

/*если файлы не существуют*/

dbass(Term,Indexfile,Datafile):-

/*создаёт файл данных для записи*/

openwrite(datafile,Datafile),

writedevice(datafile),

/*запоминает позицию*/

filepos(datafile,Pos,0),

/*добавление записи*/

write(Term),nl,

/*закрывает файл данных*/

closefile(datafile),

/*создаёт индексный файл для записи*/

openwrite(indexfile,Indexfile),

writedevice(indexfile),

/*Запись значения индекса, задаваемого переменной Pos.

Для записи индекса отводится поле, состоящее из 7 позиций.*/

writef("%7.0\n",Pos),

/*закрывает индексный файл*/

closefile(indexfile).

/* Правило dbret удаляет данные из БД */

dbret(Term,Indexfile,Datafile):-

/*открывает файл данных на чтение*/

openread(datafile,Datafile),

/*открывает индексный файл на модификацию*/

openmodify(indexfile,Indexfile),

/*испльзуется вспомогательный модуль, который осуществляет поиск

нужной записи и её удаление */

dbret1(Term,-1),

/*закрывает файл данных*/

closefile(datafile),

/*закрывает индексный файл*/

closefile(indexfile).

dbret1(Term,Datpos):-

Datpos>=0,

filepos(datafile,Datpos,0),

readdevice(datafile),

readterm(dbasedom,Term),!,

filepos(indexfile,-9,1),

/*Этот предикат вызывает запись на диск содержимого внутреннего буфера индексного файла. Таким образом dbret1 предотвращает возможность работы с

данными, которые были удалены до этого.*/

flush(indexfile),

writedevice(indexfile),

writef("%7.0\n",-1),

readdevice(keyboard),

writedevice(screen).

/*осуществляет поиск нужного индекса в индексном файле*/

dbret1(Term,_):-

readdevice(indexfile),

readreal(Datpos1),

dbret1(Term,Datpos1).

/* Правило dbrd извлекает информацию из файла datafile */

dbrd(Term,Indexfile,Datafile):-

openread(datafile,Datafile),

openread(indexfile,Indexfile),

/*испльзуется вспомогательный модуль dbaaccess, осуществляющий

поиск и выборку данных из файла БД*/

dbaaccess(Term,-1),

closefile(datafile),

closefile(indexfile).

/*Этот предикат читает данные, логически связанные со значением индекса,

задаваемым переменной Datapos.*/

dbaaccess(Term,Datpos):-

Datpos>=0,

filepos(datafile,Datpos,0),

readdevice(datafile),

readterm(dbasedom,Term).

/*Это правило пытается найти в базе такую запись, индекс которой присутствует в индексном файле. Если индекс находится, то правило успешно; если нет, то неуспешно.В случае успеха переменная Term получает нужные пользователю значения*/

dbaaccess(Term,_):-

readdevice(indexfile),

readreal(Datpos1),

dbaaccess(Term,Datpos1).

/* Правила работы со списками */

/*Чтение списка*/

readlist([H|T]):-

write("> "),nl,

readln(H),!,

readlist(T).

readlist([]).

/*Вывод списка*/

writelist([H|T]):-

write(H, " "),

writelist(T).

writelist([]).

/*Присоединение списка*/

append([],L,L).

append([N|L1],L2,[N|L3]):-

append(L1,L2,L3).

/*Удаление элемента списка*/

delete_it(_,[],[]).

delete_it(X,[H|T],L):-H=X,!,delete_it(X,T,L).

delete_it(X,[H|T],[H|L]):-delete_it(X,T,L).

Выводы.

Была написана программа, реализующая поставленную задачу. При написании программы автор ознакомился с основными понятиями, касающимися баз данных, использованием предикатов и правил для работы с файлами, списками, элементами списков. Работа над составлением программы позволила детально ознакомиться с вопросами организации данных в БД и извлечения из неё необходимой пользователю информации.

Литература.

Ц. Ин, Д. Соломон «Использование Турбо-Пролога» , Издательство «Мир»