在谓词"示例"中,第一个元素是你的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"我不知道我是怎么做到的。我怎么能这样做?
答案 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/2
和sample/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|_]).