Обработка времени в Prolog

  • В этой теме 0 ответов, 1 участник, последнее обновление 2 недели, 4 дня назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #7011
      @admin
      StudLance.ru

      Время будем описывать с помощью структуры time(hh, mm), для этого в Visual Prolog ее сначала надо объявить:

      DOMAINS
        time_d = time(integer, integer)

      Предикат проверки, что момент времени находится в заданном диапазоне:

      in_period(time(FromHH, FromMM), time(ToHH, ToMM), time(HH, MM)):-
      	From = FromHH * 60 + FromMM,
      	To = ToHH * 60 + ToMM,
      	Time = HH * 60 + MM,
      	Time >= From, Time <= To.

      В ряде случаев очень полезным может оказаться предикат сравнения двух времен:

      less(time(A_HH, A_MM), time(B_HH, B_MM)):-
          A_HH < B_HH, !;
          A_HH = B_HH, A_MM < B_MM.

      А также следующие предикаты:

      predicates
        duration(time_d, time_d, integer)
        
        time_to_minutes(time_d, integer)
        minutes_to_time(integer, time_d)
        print_time(time_d)

      Предикат duration вычисляет разницу между двумя моментами времени в минутах. Он будет использоваться для вычисления общего времени в пути. Этот предикат должен учитывать возможный переход через 00:00, то есть между моментами времени 23.55 и 00:05 всего 10 минут, зато между 00:00 и 23:55 целых 23 часа и 50 минут. Для реализации такого поведения, текущее время будет переводиться в минуты — это наиболее простой способ решения (подобный подход применяется в стандартной библиотеке языка Си, но там тип time_t хранит число секунд с некоторого момента в прошлом):

        duration(A, B, Diff):-
          time_to_minutes(A, AMin), time_to_minutes(B, BMin),
          AMin >= BMin, !, Diff = AMin - BMin.
        duration(A, B, Diff):-
          time_to_minutes(A, AMin), time_to_minutes(B, BMin),
          Diff = AMin - BMin + 24*60.

      Для перевода момента времени в минуты и обратно написаны вспомогательные предикат time_to_minutes и minutes_to_time:

       time_to_minutes(time(HH, MM), Minutes):-
          Minutes = HH*60+MM.
        
        minutes_to_time(Minutes, time(HH, MM)):-
          HH = Minutes div 60,
          MM = Minutes mod 60.

      Для вывода времени в формате hh:mm написан предикат print_time:

        print_time(time(HH, MM)):-
          write(HH), write(":"), write(MM).

      Выше была описана структура времени, но иногда нужно работать с диапазоном диапазоне времени — например «занятие началось в time(15, 55), то оно не кончилось тут же, а длится полтора часа».

      Чтобы получить значение времени через полтора часа мы просто прибавим 90 минут, однако не всегда при этом получится корректное значение времени. Для корректировки используем такой предикат:

      correct_time(time(HH, MM), time(HH, MM)):-
      	HH < 24, MM < 60, !.
      correct_time(time(HH, MM), time(CorrectHH, CorrectMM)):-
      	MM >= 60, !, 
      	CorrectMM = MM mod 60, HHwithCarry = HH + (MM div 60),
      	correct_time(time(HHwithCarry, CorrectMM), time(CorrectHH, CorrectMM)).
      correct_time(time(HH, MM), time(CorrectHH, MM)):-
      	HH >= 24, CorrectHH = HH mod 24.

      StudLance.ru

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×