5
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
старший преподаватель |
|
|
|
Е.П. Виноградова |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №5 |
Представление сложных структур данных |
по курсу: Информатизация и анализ информационных ресурсов общества |
|
|
РАБОТУ ВЫПОЛНИЛА СТУДЕНТКА ГР. |
4716 |
|
|
|
С.А. Янышева |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург
2021
Цель работы
Изучить способы представления в языке Prolog сложных структур данных, представляющих составные объекты.
Вариант 2
Сформировать с использованием структур статическую БД об авторах. Для каждого автора хранить следующую информацию: Фамилия, Имя, Отчество, год рождения, список произведений. Каждое произведение задается структурой: название, год, вид, жанр. Сформировать следующие запросы к базе данных:
Названия всех произведений заданного автора;
Все жанры, в которых проявил себя указанный автор;
Все авторы, отметившиеся в указанном жанре;
Какие виды произведений встречаются среди произведений указанного жанра.
Ход выполнения работы
Рисунок 1 – Добавление нового автора
Рисунок 2 – Добавление информации о новом произведении
Рисунок 3 – Запрос 1
Рисунок 4 – Запрос 2
Рисунок 5 – Запрос 3
Рисунок 6 – Запрос 4
Рисунок 7 – Получившаяся база данных
Выводы
В ходе лабораторной работы были изучены способы представления в языке Prolog сложных структур данных, представляющих составные объекты.
Листинг программы:
run:- retractall(writer/3), add_writer.
add_writer:-
write('Введите данные писателя:'),
nl,
repeat,
write('Имя_Фамилия:'),
read(FullName),
write('Год рождения:'),
read(BirthYear),
write('Список работ ["1-е произведение","2-е произведение",...]'),
read(WorksList),
assertz(writer(FullName, BirthYear, WorksList)),
quest1,
!.
quest1:-
write('Добавить ещё одного автора? (y/n)'),
read(ANS),
answer1(ANS).
answer1(_):-fail.
answer1(y):-fail.
answer1(n):- retractall(works/4), add_works_info.
add_works_info:-
write('Введите данные произведения:'),
nl,
repeat,
write('Название:'),
read(WorkName),
write('Год написания:'),
read(ReleaseYear),
write('Тип:'),
read(Type),
write('Жанр:'),
read(Style),
assertz(works(WorkName, ReleaseYear, Type, Style)),
quest2,
!.
quest2:-
write('Добавить инф. о ещё одном произведении? (y/n)'),
read(ANS),
answer2(ANS).
answer2(_):-fail.
answer2(y):-fail.
answer2(n):-db_save.
save_db:-
tell('db.txt'),
listing(writer),
listing(works),
told,
write('Информация сохранена.').
load_db:- consult('db.txt'), write('Информация загружена.').
run_query1:-
write('Введите Имя_Фамилию автора:'),
read(X),
nl,
writer(X,_,WL),
write('Названия всех произведений автора:'),
write(WL).
run_query2:-
write('Введите Имя_Фамилию автора:'),
read(X),
writer(X,_,WL),
qwe(WL,LST),
unique(LST,ANS),
nl,
write('Все жанры, в которых проявил себя заданный автор:'),
write(ANS).
run_query3:-
write('Введите название жанра:'),
read(X),
findall(Name,writer(Name,_,_),NL),
zxc(NL,X,LST),
write('Все авторы отметившиеся в указанном жанре:'),
write(LST).
run_query4:-
write('Введите название жанра:'),
read(X),
findall(Name,writer(Name,_,_),NL),
asd(NL,X,LST),
unique(LST,ANS),
write('Какие виды произведений встречаются среди произведений указанного жанра:'),
write(ANS).
unique([H|T],[H|TU]) :- delete(T,H,TN), unique(TN,TU).
unique([],[]).
qwe([],_).
qwe([W|WL],L):- works(W,_,_,S), qwe(WL,L1), append(L1,[S],L).
qwe1([],_,_).
qwe1([W|WL],X,L):- findall(Type, works(W,_,Type,X), S), qwe1(WL,X,L1), append(L1,S,L).
style_check([],_,_).
style_check([W|WL],X, L):- works(W,_,_,S), style_check(WL,X,L), X\=S, L = false; L = true, !.
zxc([],_,_).
zxc([A|NL],X,L):- writer(A,_,WL), zxc(NL,X,L1),style_check(WL,X,C),C==true,append(L1,[A],L).
asd([],_,_).
asd([A|NL],X,LST):- writer(A,_,WL), asd(NL,X,L1), qwe1(WL,X,L), append(L1,L,LST).