Prolog 将数字添加到列表中并查找最大的数字

Prolog 将数字添加到列表中并查找最大的数字,prolog,Prolog,这个问题是基于我先前的一个问题。 正如你所看到的,我现在可以得到我在问题中输入的每个关键点的分数,但现在我需要找到最大的分数,并将其与所有其他文档分数相加。例如,如果我进行查询,我希望将分数添加到列表中。例如 它可能看起来像是得分[1,2,3,2,1]然后我想从这个列表中提取最大值,即3,并将其添加到列表的总和,即1+2+3+2+1=9 我做不到。据我所知,Append仅适用于列表。我可以从添加Acc吗 score([Tag|Tags], Acc, Count, document(Title,_

这个问题是基于我先前的一个问题。 正如你所看到的,我现在可以得到我在问题中输入的每个关键点的分数,但现在我需要找到最大的分数,并将其与所有其他文档分数相加。例如,如果我进行查询,我希望将分数添加到列表中。例如 它可能看起来像是得分[1,2,3,2,1]然后我想从这个列表中提取最大值,即3,并将其添加到列表的总和,即1+2+3+2+1=9

我做不到。据我所知,Append仅适用于列表。我可以从添加
Acc

score([Tag|Tags], Acc, Count, document(Title,_)) :-
    (   sub_string(case_insensitive, Tag, Title)  % Check for Tag in Title
    ->  Acc1 is Acc + 1                           % Increment acc if found
    ;   Acc1 = Acc                                % Otherwise, no increment
    ),
    score(Tags, Acc1, Count, document(Title,_)).  % Score remaining tags
要使用成员列表吗?我试过了,但没能成功

以下是一个例子: 这是我的问题

?- document(T,_),score([rule],Acc,document(T,_)).
因此,我会

T = 'Rules; Semantic Technology; and Cross-Industry Standards',Acc = 1;
T = 'Rule Transformation and Extraction',Acc = 1;
T = 'Rules and Uncertainty',Acc = 1;
T = 'Rules and Rules',Acc = 2;

等等。。。我希望将这些
Acc
添加到列表中,然后提取此列表的
max Acc

如果您有以下查询:

document(T,_),score([rule],Acc,document(T,_))
如果要收集多个此类查询的结果,并对其进行排序(并假设元素唯一),可以使用
setof

setof(doc(Acc, T), ((document(T, _), score([rule], Acc, document(T, _)), Accs)
列表
Accs
将是成对的集合
doc(Acc,T)
Acc
的升序排序。[N.B.,方便的是,
setof
在排序列表时很聪明,即使元素是复合术语。因此,诸如
doc(X,Y)
之类的术语将首先使用
@
比较器按照
X
的顺序排序。],您将获得最大的
Acc
,以及相应的
T

reverse(Accs, [doc(MaxAcc, MaxT)|_])
您可以将其组合成谓词:

max_doc_acc(Tags, MaxAcc, Doc) :-
    setof(doc(Acc, T), ((document(T,_), score(Tags, Acc, document(T,_)), Accs),
    reverse(Accs, [doc(MaxAcc, Doc)|_]).
然后查询如下内容:

max_doc_acc([rule], MaxAcc, Doc).
库(聚合)可能是一个很好的起点,但为了更好地使用它,我认为您需要解耦任务,并使用sub_atom/5,它实际上可以“搜索”多个事件:

tags_count(Tags, Title, Count) :-
    downcase_atom(Title, Downcase),
    aggregate_all(count, (member(T,Tags), sub_atom(Downcase, _,_,_, T)), Count).

counters(Tags, L) :-
    findall(C, (document(T,_), tags_count(Tags,T,C)), L).
测试:

编辑真的,所有工作都在“内部”聚合中完成\u all/3

tags_tot_max_title(Tags, Tot, Max, Title) :-
    aggregate_all(info(sum(C), max(C, T)), (
        document(T, _), tags_count(Tags, T, C)
    ), info(Sum, max(Max, Title))),
    Tot is Sum + Max.
屈服

?- tags_tot_max_title([rule], Tot, Max, Title).
Tot = 7,
Max = 2,
Title = 'Rules and Rules'.

参见/2我已经看到了,但我无法首先将Acc添加到列表中听起来您好像在试图收集从许多
分数
查询中获得的
Acc
s?关于这一点,你的问题一点也不清楚。您如何确定这些查询是什么样的?一些具体的例子会很有帮助(您已经两次提到“示例”,但它们并不具体)。我建议使用
findall
来收集所有
Acc
结果,但我无法从你的问题中分辨出该查询到底是什么样子的。@潜伏者在我的问题中添加了一个exmaple,这有效吗?我做不到。我认为支架的定位方式有问题。还有,查询是什么样子的?我还修复了括号,我可以毫无问题地编译它,但我不知道如何进行查询。Doc到底是什么?@captain
Doc
只是我为此发明的一个函子。这是一种将两个数据项分组而不使用列表的好方法。我没有机会用mydelf测试这段代码,但如果我正确理解了您的代码发布,这应该是大致正确的。你说你修好了括号,我不知道你是什么意思。我复制粘贴了你的代码,我发现了一些错误,一些括号不见了。我加上了它们,效果很好。@captain,太酷了。当我第一次发布答案时,我确实有一个拼写错误,在我第一次发布的几分钟内就纠正了。也许是你在我修好它之前抓到的。有没有办法让它显示得分最高的文档的标题?最后一件事。信息到底是什么?它在做什么?@captain:info/2它只是一对“聚合函数”结果的任意名称。我选择这个名字是为了尽量不让人混淆。。。您可以看到,使用相同的名称作为聚合_all/3的第一个(输入模式)和最后一个(输出模式)调用,这在内部执行了一些非常复杂的操作。
?- tags_tot_max_title([rule], Tot, Max, Title).
Tot = 7,
Max = 2,
Title = 'Rules and Rules'.