如何 return Prolog 中的年份差异?

How to return difference in years in Prolog?

假设我有一个包含事件的数据库:

events('Second war',1400,date(1984,1,1)).
events('First war',3000,date(1944,9,1)).

并且想做一个谓词来计算特定年份和事件之间的年份时间差,即 returns true 如果例如我们输入:

timelapse('First war', 2000, 56 ).

因为相差56年,而如果输入

timelapse('First war', 2000, X ).

它returns X=56.

目前我有这个功能,但是它给出了警告并且没有正确执行:

timelapse(E, D, DF) :- events(E,date(X,_,_),_), DY is X,
                DY > D -> DF = "invalid"; DF is D-DY.

如何写这个谓词?

这个呢?

timelapse(E, D, "invalid") :- 
    events(E,_,date(DY,_,_)), 
    DY > D,
    !.

timelapse(E, D, DF) :- 
    events(E,_,date(DY,_,_)), 
    DF is D-DY.

请注意,您代码中的 events(E,date(X,_,_),_) 无法与 events('First war',3000,date(1944,9,1)) 统一 - 顺序错误。