Лабораторная работа №8. Создание динамической базы данных. Предикаты для работы с базой данных

Для описания предикатов динамической базой данных предназначен раздел 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(_).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: