Prolog,X早于Y

问题描述

我需要编写一个谓词,如果X早于Y,则谓词为true。MY代码在下面。我还没有发现任何错误。请帮助我。

born(jan,date(20,3,1977)).

born(joris,date(17,1995)).

born(jesus,date(24,12,0)).

born(joop,date(30,4,1989)).

before(date(_,_,Year1),date(_,Year2)) :-
      Year1 < Year2.

before(date(_,Month1,Year ),Month2,Year)) :-
      Month1 < Month2.

before(date(Day1,Month,date(Day2,Year)) :-
      Day1 > Day2.

older(X,Y) :-
      X \= Y,born(X,B1),born(Y,B2),before(B1,B2). 

查询应该给出这个。

?- older(jesus,Y).
jan,joris,joop.

解决方法

X\= Y和/或older/2可能未实例化而将失败时,将发出X中的比较Y。在知道它们已使用适当的值实例化之后,即在为它们每个调用born/2之后,您必须发出该比较:

older(X,Y) :-
      born(X,B1),born(Y,B2),X \= Y,before(B1,B2). 

此外,如评论中所述,before/2的第三子句应为:

before(date(Day1,Month,Year ),date(Day2,Year)) :-
      Day1 < Day2.

样品运行:

?- older(jesus,Y).
Y = jan ;
Y = joris ;
Y = joop ;
false.