domains
professor = symbol. % Имя профессора
lesson = symbol. % Название предмета
day = symbol. % День недели
time = symbol. % Время
predicates
/**
* Контейнер содержит время, когда профессор занят
* Каждая запись для каждого дня
*/
nondeterm working_time(professor, day, time, time).
/**
* Контейнер содержит имя профессора и предмет, который он ведет
*/
nondeterm professors(professor, lesson).
/**
* Функция нужна для получения имени профессора,
* который может вести предмет {lesson}
* который свободен в {time}
*/
nondeterm whoCanChange(lesson, professor, professor, day, time).
clauses
/**
* @param LessonName - название предмета
* @param Professor - профессор, которого нужно заменить
* @param FreeProfessor - профессор, который может заменить
* @param Time - время, в которое нужно заменить
*/
whoCanChange(LessonName, Professor, FreeProfessor, Day, Time) :-
professors(FreeProfessor, LessonName), % Получаем всех преподавателей, которые могут вести предмет {LessonName}
FreeProfessor <> Professor, % Убираем профессора, которого заменяем
working_time(FreeProfessor, BusyDay, BusyTimeFrom, BusyTimeTo), % Получаем время работы второго профессора
BusyDay = Day, % Получаем время работы второго профессора в нужный день
BusyTimeFrom >= Time. % Время, с которого занят профессор должно начинаться позже нужного времени
whoCanChange(LessonName, Professor, FreeProfessor, Day, Time) :-
professors(FreeProfessor, LessonName), % Получаем всех преподавателей, которые могут вести предмет {LessonName}
FreeProfessor <> Professor, % Убираем профессора, которого заменяем
working_time(FreeProfessor, BusyDay, BusyTimeFrom, BusyTimeTo), % Получаем время работы второго профессора
BusyDay = Day, % Получаем время работы второго профессора в нужный день
BusyTimeTo <= Time. % Время, до которого занят профессор должно кончаться раньше нужного времени
% Предметы, которые ведут профессоры
professors("professor_1", "math").
professors("professor_1", "physics").
professors("professor_2", "math").
professors("professor_2", "chemistry").
professors("professor_3", "chemistry").
professors("professor_3", "physics").
% Занятость профессоров
working_time("professor_1", "monday", "10:00", "14:00").
working_time("professor_1", "tuesday", "10:00", "14:00").
working_time("professor_1", "wednesday", "00:00", "00:00"). % Не занят в среду
working_time("professor_2", "monday", "08:00", "16:00").
working_time("professor_2", "tuesday", "08:00", "12:00").
working_time("professor_2", "wednesday", "00:00", "00:00"). % Не занят в среду
working_time("professor_3", "monday", "08:00", "12:00").
working_time("professor_3", "tuesday", "00:00", "00:00"). % Не занят во вторник
working_time("professor_3", "wednesday", "08:00", "16:00").
goal
% Ответ: П1
% whoCanChange("math", "professor_2", Professor, "monday", "08:00").
% Ответ: П3
whoCanChange("physics", "professor_1", Professor, "tuesday", "12:00").
% Перечисляем всех профессоров, которые свободны во вторник в 15:00
% Т.е. имя профессора не должно быть null (синоним все профессоры, кроме null)
% whoCanChange(_, "null", Professor, "tuesday", "15:00").
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎