Лабораторная работа № 2 Работа с базами данных
Цель работы: приобретение навыков организации запросов к базам данных в т.ч. и динамических, построения простых рекурсивных функций.
Отчет по работе должен включать:
Пример. В базу данных включены факты, составленные согласно 2-м типам отношений:
команда(номер, название)
чемпионат(год, номер, место)
Необходимо определить, сколько раз команда участвовала в чемпионатах с Год1 по Год2 и какое место заняла.
В программе с помощью искусственного отката производится отбор команд, удовлетворяющих поставленному условию. Соответствующие факты добавляются в динамическую базу данных. Далее факты динамической базы данных используются для построения списка мест, занятых командой (предикат findall), и с помощью рекурсивной процедуры count подсчитывается длина списка. Последнее действие - очистка динамической базы данных.
DATABASE
чемпионатDB(integer,integer,integer)
domains
list=integer*
PREDICATES
nondeterm команда(integer,symbol) %(id, название)
nondeterm чемпионат(integer,integer, integer)% (год, id, занятое_место)
count (list, integer)
очистить_БД
start
CLAUSES
команда(1,"ЦСКА").
команда(2,"Рубин").
чемпионат(2008,2,1).
чемпионат(2009,2,1).
чемпионат(2007,1,1).
%рекурсивная процедура
count([],0).
count([_|T],N):-count(T,N1),N=N1+1.
очистить_БД:-retract(_), fail.
start:-
%Отбор команд
write("Команда?"),readln(Name),команда(ID,Name),
write("С какого года ?"),readint(Ye1),write("По ?"),readint(Ye2), write("Какое место?"),nl, readint(Mx),
чемпионат(G,ID,M),G>=Ye1,G<=Ye2,M=Mx,
%Добавление к БД
asserta(чемпионатDB(G,ID,M)),
fail;
%Построение списка
findall(N,чемпионатDB(_,_,N),L),
%Подсчет
count(L, B),write(B),nl,
%Чистка БД
очистить_БД.
GOAL
start.
Примечание: если прибегнуть к терминологии БД, то “отбор команд” эквивалентен SQL – запросу к таблицам команда и чемпионат, связанным номером команды. Сравните по сложности.
Варианты заданий
1. Футбольный чемпионат.
Отношения: команда( номер, название, город),чемпионат( год, команда, место).
Составить запросы:
-сколько раз команда Х участвовала в первенствах с Год1 по Год2 ?
- определить среднее место команды X за все годы участия в чемпионатах;
сколько раз команда X занимала место N ?
2.Адресный справочник
Отношения: улица(номер, название, тип), дом(номер, улица, количество_жильцов).
Запросы:
-сколько домов на улице Y ?
- какое среднее количество жителей в домах по улице Y ?
- какое среднее количество жильцов в одном доме на улице Y?.
3. Библиотечный каталог
Отношения: раздел (название, номер), книга (раздел, назва-ние, авторы, год, издательство).
Запросы:
- сколько книг по разделу Х ?
- в скольких разделах находятся книги автора Y ?
- подсчитать среднее число книг в 1 разделе.
4. Хит-парад
Отношения: исполнитель(имя, номер), результат_опроса(год, номер_исполнителя, место, название песни, композитор).
Запросы:
- сколько раз песня Х исполнителя Y появлялась в списке хитов?
- какие песни композитора Х в период с Год1 no Год2 были в списке хитов?
- подсчитать средний результат композитора Х.
5. Магазин
Отношения: товар(название, номер), статистика(номер_товара, категория, цена, год_поставки, месяц_поставки, количество).
Запросы:
- какое количество товара X имеется в магазине?
- какие товары и в какие месяцы поступили в период с Год1 по Год2?
- подсчитать среднюю цену товаров категории X.
6. Казино
Отношения: посетитель(имя, фамилия, номер), статистика(номер_посетителя, дата_посещения, игра, ставка, выигрыш).
Запросы:
- какие игроки (имя) любят играть в игру X?
- кто (имя, фамилия) и когда делал в казино ставки больше X?
- подсчитать средний выигрыш игроков с фамилией X.
7. Аэровокзал
Отношения: рейс(пункт_отправки, пункт_назначения, номер), информация(номер_рейса, дата_вылета, цена_билета, длительность_полета).
Запросы:
- сколько стоит перелет из пункта A в пункт B?
- в какие пункты можно попасть из пункта X за цену не более Y?
- подсчитать среднюю длительность перелетов для рейсов с датой вылета X.
8. Театр
Отношения: постановка(название, номер), информация(номер_спектакля, дата_премьеры, цена_билета, длительность, кто_в_главной_роли).
Запросы:
- найти самую дешевую постановку;
- подсчитать среднюю длительность постановок с актером X в главной роли;
- когда была премьера постановки X?
9. Зоопарк
Отношения: животное(название, номер), информация(номер_животного, рост, вес, возраст, хищник/травоядное, страна проживания)
Запросы:
отобрать хищников из страны X;
определить самое старое травоядное;
определить средний возраст хищников;
10. Результаты сессии
Отношения(№, фио), информация (№, оценка_1, оценка_2, оценка_3, оценка_4, ценка_5)
Запросы:
количество неудовлетворительных оценок;
список студентов без троек;
средний балл в группе.
11. Автобусный парк
Отношения: автобус(марка, №_гос_регистрации, номер), информация (номер_автобуса, дата изготовления, дата_техосмотра,
Запросы
список автобусов, не прошедших техосмотр на дату X;
самый старый и самый новый автобус;
средний возраст автобусов.
12. Вычислительный центр
Отношения: компьютер(инвентарный номер, номер), информация( год приобретения, тип материнской платы, процессор, память, емкость жесткого диска)
Запросы:
список компьютеров, процессор у которых имеет тактовую частоту больше Х;
общая емкость жестких дисков у всех компьютеров;
средний возраст компьютеров .
Контрольные вопросы:
1. Какие действия выполняют предикаты asserta и retract?
2. Что возвращает предикат findall?
3. Для чего нужен предикат fail в предикате очистить_БД?
4. Какой из предикатов в рекурсивной процедуре count выполняется раньше: count([],0) или N=N1+1?
5.Для чего используется константа 0 в предикате count([],0) рекурсивной процедуры count? Что произойдет, если ее заменить на 1?
6. Как будет работать программа, если вместо символа “;” после предиката fail (перед коммент. %Построение списка) поставить символ “,” .
