问题描述
我需要编写一个谓词,如果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.