List Prolog:返回列表中最频繁元素的函数
我有一个赋值,它需要一个函数,该函数返回(如果存在)一个元素,该元素显示在列表的一半以上,否则它返回否。因此,我创建了一个函数来查找列表的长度,但现在我需要一个方法来 查找最递归的元素以及在列表中找到该元素的次数 有什么想法吗?我对Prolog是新手,我请求是为了我的作业,所以如果有人要帮助我,只要给我一些提示或启发,我不希望任何实际的代码复制粘贴。有一种方法(好的,无限的方法)可以用Prolog内置解决这个问题,例如、、和: 列表=[3,2,6,2,2,1,4,2,2 |……] Uniq=[1,2,3,4,6] 频率=[[2,1],[12,2],[3,3],[3,4],[1,6] SFreqs=[[1,6]、[2,1]、[3,3]、[3,4]、[12,2]] 频率=12 最常见值=2 ListLen=21 根据讲师为解决练习设置的限制,您可能需要自己实现一个或多个内置项 另一种更有效的方法是使用并创建排序列表的运行长度编码,然后再次排序,并选择表示最常见元素的元素。现在,如果不定义辅助递归谓词,我就不知道如何进行游程编码,所以这里是:List Prolog:返回列表中最频繁元素的函数,list,prolog,List,Prolog,我有一个赋值,它需要一个函数,该函数返回(如果存在)一个元素,该元素显示在列表的一半以上,否则它返回否。因此,我创建了一个函数来查找列表的长度,但现在我需要一个方法来 查找最递归的元素以及在列表中找到该元素的次数 有什么想法吗?我对Prolog是新手,我请求是为了我的作业,所以如果有人要帮助我,只要给我一些提示或启发,我不希望任何实际的代码复制粘贴。有一种方法(好的,无限的方法)可以用Prolog内置解决这个问题,例如、、和: 列表=[3,2,6,2,2,1,4,2,2 |……] Uniq=[1
count_repeated([Elem|Xs], Elem, Count, Ys) :-
count_repeated(Xs, Elem, Count1, Ys), Count is Count1+1.
count_repeated([AnotherElem|Ys], Elem, 0, [AnotherElem|Ys]) :-
Elem \= AnotherElem.
count_repeated([], _, 0, []).
rle([X|Xs], [[C,X]|Ys]) :-
count_repeated([X|Xs], X, C, Zs),
rle(Zs, Ys).
rle([], []).
然后,可以使用以下方法获取最常见的元素:
?- List=[3,2,6,2,2,1,4,2,2,2,2,4,1,2,3,2,2,4,2,3,2],
msort(List, SList),
rle(SList, RLE),
sort(RLE, SRLE),
last(SRLE, [Freq, MostCommon]),
length(List, ListLen),
Freq > ListLen/2.
列表=[3,2,6,2,2,1,4,2,2 |……]
SList=[1,1,2,2,2,2,2,2,2 |……]
RLE=[[2,1],[12,2],[3,3],[3,4],[1,6]
SRLE=[[1,6],[2,1],[3,3],[3,4],[12,2],
频率=12
最常见值=2
ListLen=21
有一种方法(好的,无限方法)可以通过prolog内置程序来解决这个问题,例如、、和:
列表=[3,2,6,2,2,1,4,2,2 |……]
Uniq=[1,2,3,4,6]
频率=[[2,1],[12,2],[3,3],[3,4],[1,6]
SFreqs=[[1,6]、[2,1]、[3,3]、[3,4]、[12,2]]
频率=12
最常见值=2
ListLen=21
根据讲师为解决练习设置的限制,您可能需要自己实现一个或多个内置项
另一种更有效的方法是使用并创建排序列表的运行长度编码,然后再次排序,并选择表示最常见元素的元素。现在,如果不定义辅助递归谓词,我就不知道如何进行游程编码,所以这里是:
count_repeated([Elem|Xs], Elem, Count, Ys) :-
count_repeated(Xs, Elem, Count1, Ys), Count is Count1+1.
count_repeated([AnotherElem|Ys], Elem, 0, [AnotherElem|Ys]) :-
Elem \= AnotherElem.
count_repeated([], _, 0, []).
rle([X|Xs], [[C,X]|Ys]) :-
count_repeated([X|Xs], X, C, Zs),
rle(Zs, Ys).
rle([], []).
然后,可以使用以下方法获取最常见的元素:
?- List=[3,2,6,2,2,1,4,2,2,2,2,4,1,2,3,2,2,4,2,3,2],
msort(List, SList),
rle(SList, RLE),
sort(RLE, SRLE),
last(SRLE, [Freq, MostCommon]),
length(List, ListLen),
Freq > ListLen/2.
列表=[3,2,6,2,2,1,4,2,2 |……]
SList=[1,1,2,2,2,2,2,2,2 |……]
RLE=[[2,1],[12,2],[3,3],[3,4],[1,6]
SRLE=[[1,6],[2,1],[3,3],[3,4],[12,2],
频率=12
最常见值=2
ListLen=21
foldl可能是你的朋友:
:- use_module(library(lambda)).
count_repeat(L, R, N) :-
foldl(\X^Y^Z^(select(V-X, Y, Y1)-> V1 is V+1, Z = [V1-X|Y1]; Z = [1-X|Y]), L, [], L1),
sort(L1,L2),
last(L2, N-R).
结果:
?-重复计数([3,2,6,2,4,1,4,2,5,3,2,4,1,2,3,1,2,4,5,3,2],R,N)
R=2
N=7
foldl可能是你的朋友:
:- use_module(library(lambda)).
count_repeat(L, R, N) :-
foldl(\X^Y^Z^(select(V-X, Y, Y1)-> V1 is V+1, Z = [V1-X|Y1]; Z = [1-X|Y]), L, [], L1),
sort(L1,L2),
last(L2, N-R).
结果:
?-重复计数([3,2,6,2,4,1,4,2,5,3,2,4,1,2,3,1,2,4,5,3,2],R,N)
R=2
N=7
library()值得学习
?- L=[1,2,3,3,3,1,2,3],aggregate(max(C,E),aggregate(count,member(E,L),C),R).
L = [1, 2, 3, 3, 3, 1, 2, 3],
R = max(4, 3).
编辑:考虑关于事件wrt列表长度的要求:
?- L=[3,2,6,2,4],length(L,Len),HalfLen is Len/2, aggregate(max(C,E),(aggregate(count,member(E,L),C),C>HalfLen),R).
false.
library()值得学习
?- L=[1,2,3,3,3,1,2,3],aggregate(max(C,E),aggregate(count,member(E,L),C),R).
L = [1, 2, 3, 3, 3, 1, 2, 3],
R = max(4, 3).
编辑:考虑关于事件wrt列表长度的要求:
?- L=[3,2,6,2,4],length(L,Len),HalfLen is Len/2, aggregate(max(C,E),(aggregate(count,member(E,L),C),C>HalfLen),R).
false.
它可能是的副本。如果它需要一个函数,那么你就不走运了。Prolog语言没有函数。你可能想看看哪些有简单的问题和答案,尤其是列表处理问题。这将向您展示如何编写递归处理列表的谓词。我们能不能停止在评论中批评人们说“函数”?是的,指出正确的术语作为答案的一部分是一个好主意,但是对任何人来说,除了抱怨一个单词之外,没有其他东西的尖刻评论是没有用的。@IsabelleNewbie此外,函数是关系的一种特殊情况。它可能是的副本。如果它需要函数,那么你就倒霉了。Prolog语言没有函数。你可能想看看哪些有简单的问题和答案,尤其是列表处理问题。这将向您展示如何编写递归处理列表的谓词。我们能不能停止在评论中批评人们说“函数”?是的,作为一个答案的一部分,指出正确的术语是个好主意,但是对一个词的抱怨只不过是对任何人都没有帮助的一个稀奇古怪的评论。“IsabeleNeWBEE此外,函数是关系的特殊情况。考虑<代码> L= [3,2,6,2,4] < /代码>。@威尼斯>我得到r=n,n=2,问题在哪里?OP想在这样的情况下得到“否”。考虑<代码> L=(3,2,6,2,4] < /代码>。@威尼斯>我得到r=n,n=2,问题在哪里?OP想要在这样的情况下得到“否”。因为你有所有元素的频率,你可以选择最频繁的元素——没有排序,然后总结其余的频率。并比较计数。这甚至可以在一次遍历中完成。:)因为你有所有元素的频率,你可以选择最频繁的元素-无需排序-然后将所有其他元素的频率相加,并比较计数。这甚至可以在一次遍历中完成。:)