这是我到目前为止所做的:
daycompare(D,D1):-
parse_time(D,iso_8601,DateCode) @< parse_time(D1,iso_8601,DateCode1).
listdates(P1,P2,D1) :-
message(P1,P2,D), daycompare(D,D1), print(D) ;
message(P2,P1,D), daycompare(D,D1), print(D).
我试图列出所有日期(D),当(P1)或(P2)互相传递时。到目前为止,我已经使用了谓词daycompare,它将两个日期进行比较并将其添加到我想要调用的第二个日期中。
我遇到的问题是我必须使用;列出已找到的后续日期,但我想把它放在一个列表中,以便我可以自动打印出来 - 我只是不知道如何。
以下是我的数据库示例:
message(steve,jessica,'2012-08-05').
message(steve,jessica,'2012-05-17').
message(jessica,steve,'2013-03-15').
message(jessica,steve,'2013-03-23').
message(jessica,steve,'2013-07-23').
所以,如果我要调用规则,那就是:
listdates(jessica,steve,'2013-08-30').
以下是此查询的输出:
2013-03-15
true ;
2013-03-15
true ;
2013-03-23
true ;
2013-03-23
true ;
2013-07-23
true ;
2013-07-23
true ;
2012-05-17
true ;
2012-05-17
true ;
2012-08-05
true ;
2012-08-05
true ;
false.
我没有得到的另一件事是为什么日期打印两次。
提前致谢。
答案 0 :(得分:0)
findall
是您想要获取结果列表的内容。
您会找到针对您找到解决方案的每种不同方式的日期,因此必须有2种不同的方式来确定每个日期。
答案 1 :(得分:0)
daycompare(D,D1):-
parse_time(D,iso_8601,DateCode),
parse_time(D1,iso_8601,DateCode1),
DateCode < DateCode1.
listdates(P1, P2, D1, D) :-
message(P1, P2, D), daycompare(D, D1) ;
message(P2, P1, D), daycompare(D, D1).
?- listdates(jessica, steve, '2013-08-30', D).
D = '2013-03-15' ;
D = '2013-03-23' ;
D = '2013-07-23' ;
D = '2012-08-05' ;
D = '2012-05-17'.
由于您的日期为YYYY-MM-DD
格式,因此您可以简化并删除daycompare
,因为@<
会按照您的预期比较订单中的原子:
listdates(P1, P2, D1, D) :-
message(P1, P2, D), D @< D1 ;
message(P2, P1, D), D @< D1.
然后使用findall/3
:
?- findall(D, listdates(jessica,steve,'2013-08-30',D), DateList).
DateList = ['2013-03-15', '2013-03-23', '2013-07-23', '2012-08-05', '2012-05-17'].