【问题标题】:Prolog: Simple date range selection ruleProlog:简单的日期范围选择规则
【发布时间】:2013-12-30 21:11:22
【问题描述】:

我有点卡在这个问题上 - 写一条规则,给定两个人 AB 和日期 D 返回 AB 交换消息的所有日期的列表直到日期D

到目前为止我有这个,但我不知道我哪里出错了。

mexchanged(A,B,D) :- message(A,B,D1), D > D1. 

其次,我完全坚持这一点 - 编写一个规则,计算事实数据库中每个人发送的消息数量。

如何编写这些规则?

编辑:对不起,我之前忘了发布这些;这些只是事实中的一小部分。

message(ben, tom, '20-03-2011').
message(kim, james, '17-11-2011').
message(ben, kim, '06-12-2011').
message(harry, jacky, '29-09-2011').
message(barry, chin, '06-01-2011').

【问题讨论】:

  • 您似乎步入正轨,但是G 来自哪里?目前定义了哪些事实?
  • 顺便说一句,G 应该是 D。我现在改了。
  • 你知道findall吗?
  • 请不要在回答后删除问题,因为如果没有问题,此页面将不再对任何人有价值。

标签: prolog


【解决方案1】:

其实你离得并不远,除了我不知道G在这里代表什么:

message(hunter, user3147584, '12-30-2013').
message(hunter, mom,         '12-29-2013').
message(hunter, user3147584, '12-28-2013').

% predicate to test for exchanged messages
mexchanged(A,B,D) :- message(A,B,D1), D @> D1 ; 
                     message(B,A,D1), D @> D1 .

% example
mexchanged(hunter, user3147584, '12-29-2013').
% output = true

【讨论】:

  • 这里的一个问题是日期格式不会按时间顺序与@> 比较,因为它是MM-DD-YYYY 格式。它需要采用YYYY-MM-DD 格式才能正确比较。因此,要么 OP 需要更改日期格式,要么创建一个简单的谓词来比较日期,例如 date-earlier(M1-D1-Y1, M2-D2-Y2) :- Y1-M1-D1 @< Y2-M2-D2.
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多