Prolog查找出现次数最多的元素

Prolog查找出现次数最多的元素,prolog,Prolog,我想创建一个谓词,返回最常出现的元素,如果有多个元素在第一个元素中出现的次数相同: occ([a,b,c,a,a,a,b],M). yes M = a occ([a,b,c,a,b],M). yes M = a 请注意,在Prolog中,您通常会创建规则,而不是函数来解决此问题 有很多方法可以实现这一点,我将提供两种方法 递归 一种方法是在列表上递归,保持事件的运行计数,每次调用都记录当前最大值,例如: 例如: ?- occ(X,N,[a,b,c,a,b]). X = a, N = 2. 高

我想创建一个谓词,返回最常出现的元素,如果有多个元素在第一个元素中出现的次数相同:

occ([a,b,c,a,a,a,b],M).
yes M = a
occ([a,b,c,a,b],M).
yes M = a

请注意,在Prolog中,您通常会创建规则,而不是函数来解决此问题

有很多方法可以实现这一点,我将提供两种方法

递归 一种方法是在列表上递归,保持事件的运行计数,每次调用都记录当前最大值,例如:

例如:

?- occ(X,N,[a,b,c,a,b]).
X = a,
N = 2.
高阶聚合运算 另一种方法是使用高阶聚合谓词。可以说,这会导致更多的声明性代码,尽管口味会有所不同。如果您使用的是SWI Prolog,则可以使用。我们可以从一个规则开始计算列表中的出现次数(注意,这里我将从
occ/2
切换到更明确的谓词):

如果您不想或不能使用
aggregate/3
,请查看以下问题的答案

接下来,我们可以使用
aggregate/3
查找
N
的最大数量,再加上一个“见证”(即X的最大值):

(如果您不使用聚合库,我将让您执行此规则的等效实现)

让我们试试看:

?- max_element_count(X,N,[a,b,c,a,a,a,b]).
X = a,
N = 4.
对于平局,它似乎满足在平局断路器的情况下使用第一次出现的标准:

?- max_element_count(X,N,[a,b,c,a,b]).                                                                                                                                                         
X = a,
N = 2.
但事实上这并不能保证——我们只是碰巧在这里选择了
a
,因为它是按字母顺序排列在
b
之前的。让我们试试:

?- max_element_count(X,N,[b,a,c,a,b]).
X = a,
N = 2.
哎呀

这一次,我们将找到列表中出现次数等于最大值的第一个成员:

max_element_count2(X,N,L) :-
    aggregate(max(N1),X1,element_count(X1,N1,L),N),
    member(X,L),
    element_count(X,N,L),
    !.
这假设
member/2
将按顺序与元素统一,这是我在开场白中经常看到的行为,但我不知道这是否是标准规定的

证明:

?- max_element_count2(X,N,[b,a,c,a,b]).
X = b,
N = 2.

请注意,在Prolog中,您通常会创建规则,而不是函数来解决此问题

有很多方法可以实现这一点,我将提供两种方法

递归 一种方法是在列表上递归,保持事件的运行计数,每次调用都记录当前最大值,例如:

例如:

?- occ(X,N,[a,b,c,a,b]).
X = a,
N = 2.
高阶聚合运算 另一种方法是使用高阶聚合谓词。可以说,这会导致更多的声明性代码,尽管口味会有所不同。如果您使用的是SWI Prolog,则可以使用。我们可以从一个规则开始计算列表中的出现次数(注意,这里我将从
occ/2
切换到更明确的谓词):

如果您不想或不能使用
aggregate/3
,请查看以下问题的答案

接下来,我们可以使用
aggregate/3
查找
N
的最大数量,再加上一个“见证”(即X的最大值):

(如果您不使用聚合库,我将让您执行此规则的等效实现)

让我们试试看:

?- max_element_count(X,N,[a,b,c,a,a,a,b]).
X = a,
N = 4.
对于平局,它似乎满足在平局断路器的情况下使用第一次出现的标准:

?- max_element_count(X,N,[a,b,c,a,b]).                                                                                                                                                         
X = a,
N = 2.
但事实上这并不能保证——我们只是碰巧在这里选择了
a
,因为它是按字母顺序排列在
b
之前的。让我们试试:

?- max_element_count(X,N,[b,a,c,a,b]).
X = a,
N = 2.
哎呀

这一次,我们将找到列表中出现次数等于最大值的第一个成员:

max_element_count2(X,N,L) :-
    aggregate(max(N1),X1,element_count(X1,N1,L),N),
    member(X,L),
    element_count(X,N,L),
    !.
这假设
member/2
将按顺序与元素统一,这是我在开场白中经常看到的行为,但我不知道这是否是标准规定的

证明:

?- max_element_count2(X,N,[b,a,c,a,b]).
X = b,
N = 2.

你自己的企图是什么?你自己的企图是什么?