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

Prolog 序言:两个对象之间的差异关系,prolog,Prolog,我会诚实地说这是家庭作业,但我迫切需要帮助 我是一个新的Prolog,来自C++和JavaScript,不管我怎么努力,我都没有得到。 我应该做的是能够找到两个日期之间的差异(假设非闰年) 基本上,我有一个知识库,包含如下信息: object(A, B). object(A, B). ... 其中A表示月份,B表示月份的总天数。 (例如对象(1,31)。) 我应该用于输入的表达式是: 差异(对象(A,B),对象(A,B),N)。 (N=对象之间的差异) 我尝试了一些不同的方

我会诚实地说这是家庭作业,但我迫切需要帮助

我是一个新的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.
我不明白如何将这两个对象注册为我可以操作的单独对象,从而继续这个问题

谁能给我指一下正确的方向吗

谢谢

作业问题(按要求)。 假设存在days关系,该关系描述了当前的天数 非闰年的每个日历月

days(1,31).
days(2,28).
(等等)

结构dateObject(M,D)描述一个日期。例如,dateObject(6,5)表示6月5日。 写出关系差(From,To,N),其中N是开始之间的天数 日期从和完成日期到。起始日期不包括在计数中。对于 例如:

如果日期中的日期或月份值无效(例如dateobject(4,31)、dateobject(13,1),则
返回的N值应为-1。如果开始日期晚于结束日期,则还应为N返回-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).
?-差异(dateobject(1,28),dateobject(6,1),N),写入(N),nl。
天(1,31)。
天(2,28)。
天(3,31)。
天(4,30)。
天(5,31)。
天(6,30)。
天(7,31)。
天(8,31)。
天(9,30)。
天(10,31)。
天(11,30)。
天(12,31)。
日之间(M,FD,M,TD,N):-!,N是TD-FD。
时间间隔(FM、FD、TM、TD、N):-
天(FM,D),
FM2是FM+1,
两天之间(FM2、FD、TM、TD、N2),
N是D+N2。
差异(dateobject(FM,FD),dateobject(TM,TD),N):-
TM>=FM,
FD>=1,
天数(FM、FDM),
FD==1,
天(TM,TDM),
TD=0,
!.
差异(u,u,-1)。

什么是“对象之间的差异”呢?我不明白你所说的“将两个对象注册为我可以操作的单独对象”是什么意思?@Enigmativity基本上这些对象代表一个月内的几天:天(1,31)。差异(dateobject(4,30),dateobject(5,15),N)。是的,我理解这一点“对象之间的差异"意思是?@Engmativity区别在于两个约会对象之间的天数。我很快会测试它,然后给你回复。不过别说它不好,它比我想出的任何东西都好,你不知道我有多感激你在这里给我的所有帮助。等我回到我的电脑后会测试吗先生,你是个十足的法律人物钕。
?- 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).