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

Prolog 通过在查询中写入发件人的名称来获取成本的降序,prolog,Prolog,我需要通过Prolog规则给出一个发送者列表,以显示他们发送消息的网络费用是否按降序排列。如果是,则返回true,否则返回false 因此,我创建了下面的规则,它以降序显示数字,但假设数字是邮件的成本,但我不知道如何根据发件人的成本降序排列发件人列表 假设8,4,3,2是成本,根据下面的规则,如果我这样写查询,它将显示正确的降序顺序:-?消息([8,4,3,2]) 我为此数据创建的规则是 message([_]):-!. message([_]):-!. message([A,B|T]) :-A

我需要通过Prolog规则给出一个发送者列表,以显示他们发送消息的网络费用是否按降序排列。如果是,则返回true,否则返回false

因此,我创建了下面的规则,它以降序显示数字,但假设数字是邮件的成本,但我不知道如何根据发件人的成本降序排列发件人列表

假设
8,4,3,2
是成本,根据下面的规则,如果我这样写查询,它将显示正确的降序顺序
:-?消息([8,4,3,2])

我为此数据创建的规则是

message([_]):-!.
message([_]):-!.
message([A,B|T]) :-A >= B,!,message([B|T]).
我的原始数据库是这样的。现在我的查询将类似于
:-?消息([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).

您能告诉我哪里做错了,因为我想通过在查询中写入发件人的名称来获得成本的降序吗?

SWI Prolog library()中的order\u 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'
...
编辑:


此外,library(aggregate)或经典的setof/3提供了可能的解决方案,但手工编写是学习Prolog的更好方法。这取决于你想要什么…

@CommuSoft你能给我一些提示吗?我看到你回答了那么多关于序言的问题。这需要“;”要输入以获取每个值。我们如何一次获得所有值?我们能把它和“findall”结合起来吗?它只产生L=[8,6,6,5,3]。。所有的记录(F,S,D,C)怎么能按C的顺序排列?拜托,看起来很简单。。。试试你自己。你知道,实验很有趣……谢谢你没有回答!我试着解决了这个问题。顺便说一句,在你的代码中有一个额外的“(”在order_by之前):findall(C,(order_by([desc(C)],message(F,S,D,C)),L)。很好(很抱歉,我没有测试它)!如果你觉得我的答案有用,我希望看到它被标记为接受。无论如何,谢谢你
?- 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).