Gistrec icon

ИИ лаб2

Gistrec | PRO | 11/13/18 08:37:29 AM UTC | 0 ⭐ | 7288 👁️ | Never ⏰ | []
Prolog |

4.2 KB

|

None

|

0 👍

/

0 👎

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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎