Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФиЛП_материалы / Материалы / Prolog / ЛаборПролог.doc
Скачиваний:
37
Добавлен:
01.06.2015
Размер:
84.48 Кб
Скачать

Лабораторная работа № 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 (перед коммент. %Построение списка) поставить символ “,” .

Соседние файлы в папке Prolog