Page 55 - 4800
P. 55
випадків, доцільніше застосовувати метод двійкового пошуку. Ці методи значно
спрощують доступ до фактів БД.
Розглянемо БД, що описується відношенням:
Студент(Прізвище, Група, Оцінки_сесії),
і яка зберігається на диску у файлі з ім'ям „stud.dba”. Їй відповідає індексний файл
„stud.ind”.
/* Програма 6_4 */
domains
name = symbol
grup, mark = integer
session = mark*
file= dbf; ind
database
stud(name, grup, session)
predicates
use(string, string)
dbassert(dbasedom)
dbass(dbasedom, string, string)
new_rec(dbasedom, real)
new_ind(real)
dbdelete(dbasedom)
dbdel(dbasedom, string, string)
dbdel1(dbasedom, real)
dbread(dbasedom)
dbrd(dbasedom, string, string)
dbaccess(dbasedom, real)
clauses
use(“stud.ind”, “stud.dba”).
/* предикати створення інтерфейсу СУБД */
dbassert(Term):- use(Ind, Db), dbass(Term, Ind, Db).
dbdelete(Term):- use(Ind, Db), dbdel(Term, Ind, Db).
dbread(Term):- use(Ind, Db), dbrd (Term, Ind, Db).
/* модуль вводу даних у файл бази даних */
dbass(Term, Ind, Db):- existfile(Ind), existfile(Db), openappend(dbf, Db),
new_rec(Term, Pos), openappend(ind, Ind), new_ind(Pos).
dbass(Term, Ind, Db):- openwrite(dbf, Db), new_rec(Term, Pos), openwrite(ind, Ind),
new_ind(Pos).
new_rec(Term, Pos):- writedevice(dbf), filepos(dbf, Pos, 0), write(Term),
closefile(dbf).
new_ind(Pos):- writedevice(ind), writef(“%7.0\n”, Pos), closefile(ind).
/* модуль виводу даних з файлу бази даних */
dbrd(Term, Ind, Db):- openread(dbf, Db), openread(ind, Ind), dbaccess(Term, -1).
dbrd(_, _, _):- closefile(dbf), closefile(ind), fail.
dbaccess(Term, Pos):- Pos>=0, filepos(dbf, Pos, 0), readdevice(dbf),
readterm(dbasedom,Term).
dbaccess(Term, _):- readdevice(ind), readreal(Pos), dbaccess(Term, Pos).
/* модуль видалення даних з БД (запис -1 в індексний файл) */
dbdel(Term, Ind, Db):- openread(dbf, Db), openmodify(ind, Ind), dbdel1(Term, -1).
dbdel(_, _, _):- closefile(dbf), closefile(ind), fail.
dbdel1(Term, Pos):- Pos>=0, filepos(dbf, Pos, 0), readdevice(dbf),
readterm(dbasedom, Term), filepos(ind,9,1), flush(ind), writedevice(ind), writef("%7.0\n",-1),
flush(ind), writedevice(screen).
dbdel1(Term, _):- readdevice(ind), readreal(Pos), dbdel1(Term, Pos).
Предикат use() використовується для задання імені файлу робочої БД і імені,
відповідного йому індексного файлу.
Предикати dbassert(), dbdeletе() і dbrеad() призначені для запису, видалення і
читання даних із файлу БД. Ці предикати реалізовані, з використанням індексного
файлу для запису позицій фактів, у файлі даних. Кожна позиція представляється
55