我将诚实,并通过说这是家庭作业来做序,但我迫切需要帮助。
我是Prolog的新手,来自C ++和Javascript,无论我怎么努力,我都没有得到它。
我应该做的是能够找到两个日期之间的差异(假设非闰年)。
基本上我有一个知识库,其信息如下:
object(A, B).
object(A, B).
...
其中A代表月份,B代表月份的总天数。 (例如,对象(1,31)。)
我应该用于输入的表达式是这样的: 差异(对象(A,B),对象(A,B),N)。 (N =对象之间的差异)。
我尝试了一些不同的东西(我知道这不是正确的轨道)并且还没有能够进一步发展:
difference(object(A,B), object(A,B),N):-
days(M,D), days(M,D),
Y = 365-D,
N is Y.
我不明白如何将这两个对象注册为我可以操作的个别事物,从而继续解决问题。
请有人请,请指出正确的方向吗?
由于
家庭作业问题(AS REQUESTED)。 假设存在描述天数的天数关系 非闰年的每个日历月。
days(1,31).
days(2,28).
(依此类推)。
结构dateObject(M,D)描述日期。例如,dateObject(6,5)将表示6月5日。 写出关系差异(From,To,N),其中N是起始之间的天数 日期从结束日期到结束日期。起始日期不包括在计数中。对于 例如:
?- difference(dateobject(2,1),dateobject(2,2),N).
N = 1.
如果日期中的日期或月份值无效(例如dateobject(4,31),dateobject(13,1)则 返回的N值应为-1。如果From日期晚于To,则还应为N返回-1错误值。
答案 0 :(得分:1)
这是一个非常糟糕的解决方案 - 我相信比我聪明的人会想出更好的东西。
?- difference(dateobject(1,28),dateobject(6,1),N),write(N),nl.
days(1,31).
days(2,28).
days(3,31).
days(4,30).
days(5,31).
days(6,30).
days(7,31).
days(8,31).
days(9,30).
days(10,31).
days(11,30).
days(12,31).
daysbetween(M,FD,M,TD,N) :- !, N is TD - FD.
daysbetween(FM,FD,TM,TD,N) :-
days(FM,D),
FM2 is FM + 1,
daysbetween(FM2,FD,TM,TD,N2),
N is D + N2.
difference(dateobject(FM,FD),dateobject(TM,TD),N) :-
TM >= FM,
FD >= 1,
days(FM,FDM),
FD =< FDM,
TD >= 1,
days(TM,TDM),
TD =< TDM,
daysbetween(FM,FD,TM,TD,N),
N > 0,
!.
difference(_,_,-1).