/* easter_demand.pl */ easter_demand_daily(BaseYear, TlStartDate, TlEndDate, Xs, Ys) :- easter_demand_key_points(BaseYear, KeyPoints), % A list of kp(Date,DI,Reason) keypoints. maplist({TlStartDate}/[kp(Date,DI,_Reason), Offset-DI]>>date_interval(Date, TlStartDate, days(Offset)), KeyPoints, OffsetsAndDIs), % Convert keypoints to offsets and demand increments. TlStartOffset = 0, date_interval(TlEndDate, TlStartDate, days(TlEndOffset)), time_series_segments_to_points(TlStartOffset, TlEndOffset, OffsetsAndDIs, Xs, Ys). % Generate a time series from segments to points. easter_demand_key_points(BaseYear, KeyPoints) :- findall(kp(Date,DI,Reason), easter_demand_key_point(BaseYear, Date, DI, Reason), KeyPoints). easter_demand_key_point(BaseYear, Date, DI, Reason) :- easter_demand(DR, DI, Reason), eval_daterel_easter(DR, BaseYear, Date). easter_demand('Easter Sunday'-16, 0, "Just before start of school holidays. Slight increase in travel as families plan extended stays."). easter_demand('Easter Sunday'-14, 5, "Start of school holidays. Slight increase in travel as families plan extended stays."). easter_demand('Easter Sunday'-7, 10, "Increase in travel continues as more families start their holiday travels."). easter_demand('Easter Sunday', 20, "Peak demand on Easter Sunday for both religious and non-religious travellers."). easter_demand('Easter Sunday'+1, 15, "Slight decrease in demand after Easter Sunday as some travellers return home."). easter_demand('Easter Monday', 10, "Last peak in demand due to public holiday before a gradual return to baseline."). easter_demand('Easter Sunday'+7, 2, "Demand starts to normalize as school holidays come to an end and travellers return home."). easter_demand('Easter Sunday'+8, 0, "End of school holidays."). eval_daterel_easter('Easter Sunday', Year, Date) :- easter_sunday(Year, Date). eval_daterel_easter('Easter Monday', Year, Date) :- easter_sunday(Year, EasterSunday), date_add(EasterSunday, days(1), Date). eval_daterel_easter(DR+Offset, Year, Date) :- eval_daterel_easter(DR, Year, BaseDate), date_add(BaseDate, days(Offset), Date). eval_daterel_easter(DR-Offset, Year, Date) :- eval_daterel_easter(DR, Year, BaseDate), date_add(BaseDate, days(-Offset), Date). easter_sunday(2023, date(2023,4,9)). easter_sunday(2024, date(2024,3,31)). easter_sunday(2025, date(2025,4,20)). easter_sunday(2026, date(2026,4,5)).