Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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").
Advertisement