Prolog获取两个日期之间的天数差异

时间:2016-04-21 22:58:18

标签: prolog swi-prolog

我一直试图比较prolog中的两个日期。

日期格式为日期(YYYY,MM,DD)

ex:(2016,04,21)。

我想比较两个日期,并知道这些日期之间的差异(天数)是否大于15天(2周)。

%dateDifference( number_of_day, date_no1, date_no2 ).
dateDifference( 35, date(2003,8,16), date(2003,9,20) ).

2 个答案:

答案 0 :(得分:2)

根据日历和涵盖的时间段计算两个日期之间的天数差异可能很简单或棘手。假设格里高利历,通常的解决方案是将日期转换为儒略日。正如@mat在其评论中提到的,对于SWI-Prolog,请考虑{{1}};

https://github.com/mndrix/julian

对于可与大多数Prolog系统(包括SWI-Prolog)一起使用的便携式解决方案,Logtalk包含可用于这些计算的第三方ISO 8601库:

http://logtalk.org/library/iso8601_0.html

答案 1 :(得分:0)

首先,你应该记下@Boris的笔记, 第二, 为了简化问题,您的谓词分为三个部分:

第1部分:

  • 知道年份是跳跃还是普遍,
  • 影响每个月的天数,
  • 最后,这部分遵循以下规则;

代码:

calcule_days([Y,M,D],Res):-
    Res is (((Y*1461)/4)+((M*153)/5)+D).

第2部分:

  • 计算两个日期之间的差异
  • formula(part1)应用于date1和date2,
  • 计算两个结果difference_date1_date2
  • 之间的差异
  • 以避免负号添加abs(difference_date1_date2)
  • 获取增值方法round (result_abs_pred)

演示代码:

dateDifference(NumberOfDays,date(YEAR1,MONTH1,DAY1),date(YEAR2,MONTH2,DAY2)):-
           ...

第3部分:

  • 测试结果是否为>= 15,结果必须为True/false

演示代码:

bigger_2weeks(date(YEAR1,MONTH1,DAY1),date(YEAR2,MONTH2,DAY2)):-
...