我如何获得最重复的元素? (Prolog - Logic Paradigm)

时间:2017-05-09 17:05:02

标签: prolog

在谓词"示例"中,第一个元素是你的id,其他元素是样本的结果。

sample(1,04,05,30,33,41,52).
sample(2,05,37,39,41,43,49).
sample(3,05,11,29,30,36,47).
sample(4,01,05,06,27,42,59).

我需要获得最重复的样本值...在这种情况下是" 05"我不知道我是怎么做到的。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

如果id是连续的并且从1开始,那么这是解决方案的可能结构:

我首先要更改所代表样本的格式:

:- dynamic([sample/2,sample/7]). 
represent_samples:-
     retract(sample(I,S1,S2,S3,S4,S5,S6)),
     assert(sample(I,[S1,S2,S3,S4,S5,S6])),
     fail.

represent_samples.

第一行:- dynamic([sample/2,sample/7]).将谓词sample/2sample/7声明为动态谓词;这意味着可以从您的知识库中添加和撤消它们的条款。 retract行从知识中撤消sample/7个事实,而以assert开头的下一行添加sample/2表示。行fail确保只要知识库中存在sample/7个事实并且单个represent_samples.事实保证您的谓词represent_samples/0成功,就可以完成此操作。

您可以通过以下查询序列检查此谓词的效果:

  ?- listing([sample/2,sample/7]).
  ?- represent_samples.
  ?- listing([sample/2,sample/7]).

重新表示样本后,可以通过它们(由id引导)。

most_rep(N):-
    most_rep(1,[],N).

most_rep(I,Acc,N):-
    sample(I,L),
    append(L,Acc,NewAcc),
    I1 is I+1,
    most_rep(I1,NewAcc,N).

most_rep(_I,Acc,N):-
    choose_most_freq(Acc,N).

现在我们只需要编写标识列表中最常用元素的谓词choose_most_freq/2

对于此问题,您可以使用prolog: maximally repeated element in a list

上发布的解决方案
choose_most_freq(L, M) :-
    setof(I-E, C^(aggregate(count, member(E, L), C), I is -C), [_-M|_]).