Gistrec

ИИ лаб2

Nov 13th, 2018
825
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 4.20 KB | None | 0 0
  1. domains
  2.     professor = symbol.    % Имя профессора
  3.     lesson = symbol.    % Название предмета
  4.     day = symbol.     % День недели
  5.     time = symbol.   % Время
  6.  
  7. predicates
  8.     /**
  9.      * Контейнер содержит время, когда профессор занят
  10.      * Каждая запись для каждого дня
  11.      */
  12.     nondeterm working_time(professor, day, time, time).
  13.    
  14.     /**
  15.      * Контейнер содержит имя профессора и предмет, который он ведет
  16.      */
  17.     nondeterm professors(professor, lesson).
  18.    
  19.     /**
  20.      * Функция нужна для получения имени профессора,
  21.      * который может вести предмет {lesson}
  22.      * который свободен в {time}
  23.      */
  24.     nondeterm whoCanChange(lesson, professor, professor, day, time).
  25.  
  26. clauses
  27.     /**
  28.      * @param LessonName - название предмета
  29.      * @param Professor - профессор, которого нужно заменить
  30.      * @param FreeProfessor - профессор, который может заменить
  31.      * @param Time - время, в которое нужно заменить
  32.      */
  33.     whoCanChange(LessonName, Professor, FreeProfessor, Day, Time) :-
  34.         professors(FreeProfessor, LessonName), % Получаем всех преподавателей, которые могут вести предмет {LessonName}
  35.         FreeProfessor <> Professor, % Убираем профессора, которого заменяем
  36.         working_time(FreeProfessor, BusyDay, BusyTimeFrom, BusyTimeTo), % Получаем время работы второго профессора
  37.         BusyDay = Day, % Получаем время работы второго профессора в нужный день
  38.         BusyTimeFrom >= Time. % Время, с которого занят профессор должно начинаться позже нужного времени
  39.        
  40.     whoCanChange(LessonName, Professor, FreeProfessor, Day, Time) :-
  41.         professors(FreeProfessor, LessonName), % Получаем всех преподавателей, которые могут вести предмет {LessonName}
  42.         FreeProfessor <> Professor, % Убираем профессора, которого заменяем
  43.         working_time(FreeProfessor, BusyDay, BusyTimeFrom, BusyTimeTo), % Получаем время работы второго профессора
  44.         BusyDay = Day, % Получаем время работы второго профессора в нужный день
  45.         BusyTimeTo <= Time. % Время, до которого занят профессор должно кончаться раньше нужного времени
  46.  
  47.     % Предметы, которые ведут профессоры
  48.     professors("professor_1", "math").
  49.     professors("professor_1", "physics").
  50.    
  51.     professors("professor_2", "math").
  52.     professors("professor_2", "chemistry").
  53.    
  54.     professors("professor_3", "chemistry").
  55.     professors("professor_3", "physics").
  56.    
  57.     % Занятость профессоров
  58.     working_time("professor_1", "monday", "10:00", "14:00").
  59.     working_time("professor_1", "tuesday", "10:00", "14:00").
  60.     working_time("professor_1", "wednesday", "00:00", "00:00"). % Не занят в среду
  61.    
  62.     working_time("professor_2", "monday", "08:00", "16:00").
  63.     working_time("professor_2", "tuesday", "08:00", "12:00").
  64.     working_time("professor_2", "wednesday", "00:00", "00:00"). % Не занят в среду
  65.    
  66.     working_time("professor_3", "monday", "08:00", "12:00").
  67.     working_time("professor_3", "tuesday", "00:00", "00:00"). % Не занят во вторник
  68.     working_time("professor_3", "wednesday", "08:00", "16:00").
  69.  
  70. goal
  71.     % Ответ: П1
  72.     % whoCanChange("math", "professor_2", Professor, "monday", "08:00").
  73.    
  74.     % Ответ: П3
  75.     whoCanChange("physics", "professor_1", Professor, "tuesday", "12:00").
  76.    
  77.     % Перечисляем всех профессоров, которые свободны во вторник в 15:00
  78.     % Т.е. имя профессора не должно быть null (синоним все профессоры, кроме null)
  79.     % whoCanChange(_, "null", Professor, "tuesday", "15:00").
Advertisement