我需要通过制作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).
你能告诉我我做错了什么,因为我想通过在查询中写下发件人的名字来降低成本的降序吗?
答案 0 :(得分:2)
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的更好方法。这取决于你之后的......