Для описания предикатов динамической базой данных предназначен раздел database. База данных (БД) называется динамической потому, что во время работы можно добавлять, удалять содержащиеся в них утверждения. Другая важная особенность динамических баз данных состоит в том, что она может быть записана на диск и считана с диска в оперативную память.
Иногда предпочтительно иметь часть информации БД в виде утверждений статической БД. Эти данные заносятся в динамическую сразу после активизации программы. В общем случае, предикаты статической БД имеют другое имя, но ту же самую форму представления данных, что и предикаты динамической.
Предикаты для работы с динамической БД:
Asserta заносит новый факт в БД, новый факт помещается перед всеми уже внесенными утверждениями.
Assertz помещает новый факт в БД за всеми имеющимися утверждениями.
Retract удаляет утверждение из БД.
Save сохраняет находящуюся в оперативной памяти БД в текстовом файле. Синтаксис этого предиката таков Save(DOS_file_name)
consult(DOS_file_name)считывает в память файл БД
|
|
readterm(Domain,Term) используется для чтения из файла объектов, относящихся к определенному в программе домену.
Предикатfindall позволяет собрать все имеющиеся в базе данные в список, который может быть полезен при дальнейшей работе.
В качестве примера рассмотрим БД по игрокам футбольных команд, БД допускает следующие операции: добавление, удаление и просмотр данных. Эта программа создает БД и содержит её в оперативной памяти. Для работы с ней использовался предикат player с аргументами p_name -имя игрока, k_name -название клуба, p_number -номер игрока, pos -позиция игрока, height -рост, weight -вес, nfl_exp -стаж выступлений, college -учебное заведение)
Программа 32. Динамическая база данных «Футбольная команда»
Domains
p_name,k_name, pos, college = string
p_number, height, weight, nfl_exp = integer
Database
dplayer(p_name, k_name,p_number,pos, height,weight,nfl_exp, college)
Predicates
repeat
do_mbase
assert_database
menu
process(integer)
clear_database
player(p_name, k_name,p_number,pos, height,weight,nfl_exp, college)
error
Goal
do_mbase.
Clauses
repeat.
repeat:-repeat.
/*База данных футбол*/
player("Иванов Иван","Спартак",13,"з", 205,90,3, "ГГПИ").
player("Петров Петр","Динамо",96,"пз", 185,78,4, "ГТК").
player("Сидоров Денис","Локомотив",69,"в", 190,88,2, "ГТУ").
player("Васечкин Илья","Торпедо",5,"в", 195,80,5, "ГГПИ").
player("Алексеев Дима","ЦСКА",1,"н", 165,67,2, "ГТК").
player("Карпов Павел","Зенит",12,"н",170,74,1, "ГКК").
/*конец начальных данных*/
assert_database:-
player(P_name,K_name,P_number,Pos,Height,Weight,Nfl_exp,College), assertz(dplayer(P_name,K_name,P_number,Pos,Height,Weight,Nfl_exp,
College)),
fail.
assert_database:-!.
clear_database:-
retract(dplayer(_,_,_,_,_,_,_,_)),
fail.
clear_database:-!.
do_mbase:-
assert_database,
makewindow(1,7,7," FOOTBALL DATABASE ",0,0,25,80),
|
|
menu,
clear_database.
menu:-
repeat, clearwindow,
nl,
write(" ************************************* "),nl,
write(" * 1. Добавление нового игрока в БД * "),nl,
write(" * 2. Удаление игрока из БД * "),nl,
write(" * 3. Просмотр данных * "),nl,
write(" * 4. Выход из программы * "),nl,
write(" ************************************* "),nl,
write(" Пожалуйста, сделайте свой выбор 1, 2, 3 or 4: "),
readint(Vibor),nl,process(Vibor),Vibor = 4,!.
/* Добавление информации об игроке в БД */
process(1):-
makewindow(2,7,7,"Добавление данных",2,20,18,58),shiftwindow(2),
write("Введите, пожалуйста:"),nl,
write("Имя игрока: "), readln(P_name),
write("Название клуба: "), readln(K_name),
write("Номер игрока: "), readint(P_num),
write("Позицию: "), readln(Pos),
write("Рост: "), readint(Ht),
write("Вес: "), readint(Wt),
write("Стаж выступлений: "), readint(Exp),
write("Название учебного заведения: "), readln(College),
assertz(dplayer(P_name, K_name, P_num,Pos,Ht,Wt,Exp, College)),
write(P_name," добавлен в БД"), nl,!,
write("Press space bar. "), readchar(_),
removewindow, shiftwindow(1).
/* Удаление */
process(2):-
makewindow(3,7,7,"Удаление данных",10,30,7,40),shiftwindow(3),
write("Введите имя удаляемого игрока: "), readln(P_name),
retract(dplayer(P_name,_,_,_,_,_,_,_)),
write(P_name," удален из БД "), nl,!,
write("Press space bar."), readchar(_), removewindow,
shiftwindow(1).
/* Просмотр данных об игроке*/
process(3):-
makewindow(4,7,7," Просмотр ", 7,30,16,47), shiftwindow(4),
write("Введите имя для просмотра: "), readln(P_name),
dplayer(P_name,T_name,P_number,Pos,Ht,Wt,Exp,College),nl,
write(" Имя игрока: ",P_name),nl,
write(" Название клуба: ",T_name),nl,
write(" Номер игрока: ",P_number),nl,
write(" Позиция: ",Pos),nl,
write(" Рост: ",Ht), nl,
write(" Вес: ",Wt),nl,
write(" Стаж выступлений: ",Exp), nl,
write(" Учебное заведение: ",College),nl, nl,!,
write("Press space bar"), readchar(_),
removewindow, shiftwindow(1).
process(3):-
makewindow(5,7,7," Неудача ",14,7,5,60), shiftwindow(5),
write("К сожалению, данных нет."),nl,
write("Извините, пока!"),nl,!,
write("Press space bar."),readchar(_),
removewindow,shiftwindow(1).
/* Выход */
process(4):-
write("До новых встреч! "),readchar(_),exit.
/*Обработка ошибки*/
process(Vibor):-
Vibor<1, error; Vibor>5, error.
error:-
write("Пожалуйста выберите число от 1 до 4"),
write("(Press the spase bar to continue)"),readchar(_).