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).
Выводы.
Была написана программа, реализующая поставленную задачу. При написании программы автор ознакомился с основными понятиями, касающимися баз данных, использованием предикатов и правил для работы с файлами, списками, элементами списков. Работа над составлением программы позволила детально ознакомиться с вопросами организации данных в БД и извлечения из неё необходимой пользователю информации.
Литература.
Ц. Ин, Д. Соломон «Использование Турбо-Пролога» , Издательство «Мир»