检查任何元素的频率是否超过限制 [英] Check if any element's frequency is above a limit
本文介绍了检查任何元素的频率是否超过限制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想解决一个问题,即我有Prolog元素列表.如果任何元素频率大于N
,则返回false.我的期望如下.
I want to solve a problem that is I have a Prolog list of elements. If the any of the element frequency is greater than N
then false is return. My expectation like below.
?- frequency([1,2,2,2,5],3).
true.
?- frequency([1,2,2,2,2,5],3).
false.
我有一个用于获取特定元素频率的代码.对这个问题有任何想法.
I have a code for get particular element frequency. Any idea for the problem.
count(_, [], 0) :-
!.
count(X, [X|T], N) :-
count(X, T, N2),
N is N2 + 1.
count(X, [Y|T], N) :-
X \= Y,
count(X, T, N).
推荐答案
使用 clpfd !
:- use_module(library(clpfd)).
如果我们以辅助谓词 list_counts/2
为基础,则可以这样定义frequency/2
:
If we build on auxiliary predicate list_counts/2
, we can define frequency/2
like this:
frequency(Es, M) :-
list_counts(Es, Xss),
maplist(arg(2), Xss, Zs),
maplist(#>=(M), Zs).
示例查询:
?- frequency([1,2,2,2,5], 3).
true.
?- frequency([1,2,2,2,2,5], 3).
false.
感谢 clpfd ,我们可以问非常普遍查询—并从逻辑上也得到合理的答案!
Thanks to clpfd we can ask quite general queries—and get logically sound answers, too!
?- frequency([A,B,C], 2).
A=B , dif(B,C)
; A=C , dif(B,C)
; dif(A,C), B=C
; dif(A,B), dif(A,C), dif(B,C).
这篇关于检查任何元素的频率是否超过限制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文