Одесский национальный университет им. И.И.Мечникова Министерство науки и образования Украины
Лабораторная работа №6
по курсу «Специализированные языки программирования»
выполнил студент III курса гр. МОКС
Свиридов Артём
Одесса 2012
Цель работы: Цель работы – создание справочной системы «Расписание занятий преподавателей кафедры». Программа разрабатывается на РЕАЛЬНЫХ данных ВАШЕЙ кафедры.
Работа должна содержать:
–описание предметной области. Рекомендуется использовать табличный способ описания формализма.
–описание и назначение используемых доменов. Рекомендуется использовать в том числе и составные домены.
–описание отношений между объектами предметной области. Описание правил и фактов, описывающих эти отношения.
–система должна позволять давать пользователю ответы на следующие вопросы:
+педагогический состав кафедры;
+перечень предметов, занятия по которым проводятся на кафедре;
+в какие дни недели и кем проводятся занятия по указанному курсу;
+кто из преподавателей кафедры проводит занятия в указанный день
недели;
+расписание указанного преподавателя;
+когда, кто и по каким курсам проводит занятия в указанной студенческой группе;
–запросы к системе, результаты работы системы.
–исходный текст программы в отдельном файле.
Код программы на Visual Prolog 7.3:
implement main
open core, console, string, file
constants
className = "main". classVersion = "".
clauses
classInfo(className, classVersion).
domains tutor=string. subject=string.
where=where(string Day, integer Para, integer Classroom). group=string*.
stringlist=string*.
class facts - timetable
lesson: (tutor,subject,where,group).
class predicates
findbytutor : () procedure(). findbygroup : () procedure(). load : () procedure(). findtutors : () procedure(). findsubjects : () procedure(). whoday : () procedure(). whoteaches : () procedure().
whoteaches2 : (stringlist,subject) procedure(i,i). add : (stringlist,stringlist,string) procedure(i,o,i).
no_repeat : (stringlist, stringlist, stringlist) procedure(i,i,o). writelist : (stringlist) procedure(i).
writelist_line : (stringlist) procedure(i). menu : () procedure().
do_it : (string) procedure(i). isMember : (string, group) determ(i,i).
clauses
findbytutor():- T = readline(), lesson(T,B,where(C,D,E),F), write(B,", ",C,", ",D," пара, ауд. ",E,", "), writelist_line(F), nl,fail.
findbytutor().
load():-consult("timetable.dba",timetable),fail. load().
findtutors() :- findall(X,lesson(X,_,_,_),K), no_repeat(K,[],Q), writelist(Q).
findsubjects() :- findall(X,lesson(_,X,_,_),K), no_repeat(K,[],Q), writelist(Q).
whoteaches() :- A = readline(), findall(X,lesson(X,A,_,_),K), no_repeat(K,[],Q), whoteaches2(Q,A).
whoteaches2([],_) :- !.
whoteaches2([H|T],A) :- findall(X,lesson(H,A,where(X,_,_),_),K), no_repeat(K,[],Q), write(H,": "),nl,writelist(Q),whoteaches2(T,A).
whoday() :- A = readline(), findall(X,lesson(X,_,where(A,_,_),_),K), no_repeat(K,[],Q), writelist(Q).
findbygroup():- T = readline(), lesson(A,B,where(C,D,E),F), isMember(T,F), write(A,": ",B,", ",C,", ",D," пара, ауд. ",E),nl,fail.
findbygroup().
add([],[E],E) :- !. add([H|T],[H|T],E) :- H=E, !. add([H|T],[H|T1],E) :- add(T,T1,E).
no_repeat([],RES,RES):-!.
no_repeat([H|T],L,RES) :- add(L,L1,H), no_repeat(T,L1,RES).
writelist_line([]) :- !. writelist_line([H]) :- write(H), !.
writelist_line([H|T]) :- write(H,"+"), writelist_line(T).
writelist([]) :- !.
writelist([H|T]) :- write(H), nl, writelist(T).
isMember(H, [H|_]) :- !. isMember(H, [_|T]) :- isMember(H,T).
menu() :- nl,write("Введите опцию (1-6): "),K=readLine(), do_it(K).
do_it("1") :- findtutors(), menu(), !. do_it("2") :- findsubjects(), menu(), !.
do_it("3") :- write("Введите предмет: "),nl,whoteaches(), menu(), !. do_it("4") :- write("Введите день недели: "),nl,whoday(), menu(), !.
do_it("5") :- write("Введите фамилию преподавателя: "),nl,findbytutor(), menu(), !. do_it("6") :- write("Введите группу: "),nl,findbygroup(), menu(), !.
do_it(_).
clauses run():-
console::init(),
load(), menu().
end implement main
goal mainExe::run(main::run).
Для программы взято расписание третьего курса «прикладной математики», а не требуемой кафедры, так как в расписании кафедры МОКС отсутствовали названия предметов, которые ведут преподаватели.
База данных содержится в файле timetable.bda, по адресу “L6\Exe\timetable.bda”. Содержимое файла можно посмотреть с помощью Блокнота.
Для описания базы данных мы используем факты вида lesson(tutor, subject, where, group), где tutor – фамилия преподавателя, subject – название предмета, group – список групп (список – потому что на одной паре может присутствовать несколько групп студентов); where – факт вида where(string Day, integer Para, integer Classroom), где Day – название дня недели, Para – номер пары, Classroom –
номер аудитории.
Пример: lesson("Процеров", "Теория вероятности", where("понедельник", 3, 97), ["ОУЭК", "ММФ"]).
В программе вызываются следующие главные функции:
load() – функция, загружающая данные из файла timetable.bda в программу, с помощью функции consult.
menu() – меню для взаимодействия с программой.
Интерфейс: пользователь может вводить числа, соответствующие одной из задач условия (1-6), или же любой другой символ, чтобы выйти из программы.
Вспомогательные функции:
no_repeat, add – функции, удаляющие из списка строк повторяющиеся строки.
do_it(A) – вспомогательная функция для menu, позволяет выполнить действие под номером А.
writelist(A) – вывод списка А, по элементу в строке.
writelist_line(A) – вывод списка А, в строчку, вставляя символ «+» между элементами.
isMember(A,H) – входит ли элемент А в список Н.
Функции, соответствующие задачам:
1) findtutors() – создаёт список преподавателей, удаляет повторяющиеся фамилии с помощью no_repeat, выводит результат.
2) findsubjects() – аналогично первому заданию, создаёт список предметов на курсе.
3) whoteaches(A) – по введённому предмету находит список преподавателей, которые его ведут; затем по каждому преподавателю находит список дней недели, по которым он ведёт, удаляет повторяющиеся дни недели.
4) whoday(A) – по заданному дню недели находит список преподавателей, которые в этот день ведут, удаляет повторяющиеся фамилии.
5) findbytutor(A) – по фамилии преподавателя находит факты, в которых он ведёт пары, они выводятся соответствующим образом.
6) findbygroup(A) – по названию группы находит факты, в которых эта группа принадлежит соответствующему списку, факты выводятся соответствующим образом.
Вывод
Вданной лабораторной работе были получены необходимые навыки работы
сдинамической базой данных в Visual Prolog 7.3.