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").