Prolog:两个对象之间的差异关系

时间:2017-06-01 02:42:42

标签: prolog

我将诚实,并通过说这是家庭作业来做序,但我迫切需要帮助。

我是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错误值。

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).
相关问题