检查任何元素的频率是否超过限制 [英] Check if any element's frequency is above a limit

查看:63
本文介绍了检查任何元素的频率是否超过限制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想解决一个问题,即我有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).

推荐答案

使用


:- 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.

感谢,我们可以问非常普遍查询—并从逻辑上也得到合理的答案!

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆