通过在查询中写入发件人的名称来获取成本的降序

时间:2016-07-01 23:12:33

标签: prolog

我需要通过制作Prolog规则来显示发件人列表,以显示他们是否按发送邮件的网络费用的降序排列。如果是,则返回true,否则返回false。

所以,我创建了下面的规则,它按降序显示数字,但我们假设数字是消息的成本,但我不知道如何根据成本的降序列出发送者列表。

让我们假设8,4,3,2是费用,如果我写这样的查询:-?message([8,4,3,2]),它会通过以下规则向我显示正确的降序。

message(8).
message(4).
message(3).
message(2).

我为此数据创建的规则是

message([_]):-!.
message([_]):-!.
message([A,B|T]) :-A >= B,!,message([B|T]).

我的原始数据库看起来像这样。现在,我的查询将类似于:-?message([sonny,robert,fred,nayna]).

这应该返回true,因为它们的成本是降序。

%message(Sender, Receiver, Date, Cost_of_sending_a_message) 
message(sonny,robert,'2012-05-12',8).
message(robert,sarah,'2012-05-12',5).
message(julie,mary,'2012-05-12',6).
message(fred,nayna,'2012-05-13',6).
message(fred,daniel,'2012-05-14',6).
message(nayna,lucia,'2012-05-15',3).

你能告诉我我做错了什么,因为我想通过在查询中写下发件人的名字来降低成本的降序吗?

1 个答案:

答案 0 :(得分:2)

来自SWI-Prolog库(solution_sequences)的

order_by / 2可以帮助您:

示例用法:

?- order_by([desc(C)], message(F,S,D,C)).
C = 8,
F = sonny,
S = robert,
D = '2012-05-12' ;
C = 6,
F = julie,
S = mary,
D = '2012-05-12'
...

修改

?- findall(C, (order_by([desc(C)], message(F,S,D,C))), L).

库(聚合)或经典的setof / 3提供了可能的解决方案,但手工编写将是学习Prolog的更好方法。这取决于你之后的......