На этом шаге мы рассмотрим изменение структуры базы данных.
Одним из способов изменения структуры базы данных является копирование старой базы данных в новую с внесением изменений. Другой путь заключается в том, чтобы выгрузить базу данных в текстовый файл, внести изменения с помощью редакта текста, а затем считать (загрузить) обратно в обновленном виде.
Предикат dump_Dba, описанный ниже, предназначен для выгрузки базы данных в текстовый файл, если база данных удовлетворяет следующим условиям:
Эта методика не требует выгрузки В+ деревьев в текстовый файл, мы предполагаем имея в виду первое условие, что В+ дерево может быть порождено из отношений. В этом примере все термы принадлежат родовому домену mydom, в момент применения можно заменить mydom на требуемое имя домена и соответствующее его объявление.
Следующая программа записывает содержание базы данных в текстовый файл, открытый предикатом outfile. Каждая строка текстового файла содержит терм и имя содержащей его цепочки. Имена цепочки и терма записываются в сложный объект домена chamterm.
constants
filename="\\vip\\vpi\\programs\\register\\exe\\register.bin"
domains
Db_selector=myDba
chainterm=chain(string,mydom)
file=outfile
mydom=city(zipcode,cityname);
person(firstname,lastname,street,zipcode,code)
zipcode,cityname,firstname,lastname=string
street,code=string
predicates
wr(chainterm)
dumpDba(string,string)
clauses
wr(X):-
write(X),nl.
dumpDba(Db_selector,OutFile):-
db_open(myDba,Db_selector,in_file),
openwrite(outfile,OutFile),
writedevice(outfile),
db_chains(myDba,Chain),
chain_terms(myDba,Chain,mydom,Term,_),
wr(chain(Chain,Term)),
fail.
dumpDba(_,_):-
closeflie(outfile),
db_close(myDba).
goal
dumpDba(filename,"register.txt").
Используя приведенную выше программу, можно сгенерировать текстовый файл, вызвав dumpDba. И вы можете перегрузить базу данных, используя предикат readterm для домена chainterm. Предикат dba_insert, определенный на шаге, производит это обновление.
domains
chainterm=chain(string,dbdom)
predicates
nondeterm repfile(flie)
copyDba
loadDba(string)
clauses
repfile(_).
repfile(File):-
not(eof(File)),
repfile(File).
loadDba(OutFile):-
openread(Prn_file,OutFile),
readdevice(Prn_file),
repfile(Prn_file),
readterm(Chainterm,chain(Chain,Term)),
write(Term),nl,
Dba_insert(Chain,Term),
fail.
loadDba(_):-
closefile(Prn_file).
copyDba:-
createDba,
db_open(Dba,"register.bin",in_file),
open_indices,
loadDba("register.txt"),
db_close(Dba).
На этом мы заканчиваем знакомство с Visual Prolog'ом.