从日期创建和打印列表

时间:2014-01-06 16:23:00

标签: list date prolog

这是我到目前为止所做的:

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.

我没有得到的另一件事是为什么日期打印两次。

提前致谢。

2 个答案:

答案 0 :(得分:0)

  1. findall是您想要获取结果列表的内容。

  2. 您会找到针对您找到解决方案的每种不同方式的日期,因此必须有2种不同的方式来确定每个日期。

答案 1 :(得分:0)

  • 您可以根据查询返回日期,而不是打印日期。
  • 当你使用`parse_time`时,第三个参数是结果,那些是你想要比较的颜色
  • 您可以使用`findall / 3`将所有查询结果收集到一个列表中(如@ScottHunter指出)
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'].