あなたは実際にはかなり近いですcount_elt/3
が、もっと非決定論が必要です。count_elt/3
要するに、より少ないカットで表現する方法を見つける必要があります。
?- count_elt([a,b,a,a,c,b,d,e,a,f], Y, X).
Y = a,
X = 4.
そして、あなたが取得したいのはこれです:
?- count_elt([a,b,a,a,c,b,d,e,a,f], Y, X).
Y = a,
X = 4 ;
Y = b,
X = 2 ;
Y = c,
X = 1 ;
...
Y = f,
X = 1 ;
false.
そこからsetof/3
、論理式またはaggregate
ライブラリを使用して実行できる最大値を持つソリューションを見つけようとしています。count_elt/3
最初に修正して、そこから進みます。
編集:いくつかの一般的な発言:
- のように書くことができます
[H1|[H2|T]]
が[H1,H2|T]
、これはもう少し明確です。
listMode/2
おそらく、カウントではなく2番目の位置にアイテムを返す必要があります。listMode/3
この手順を実行するにはカウントが必要なので、再帰中に状態を管理するためにorlistMode/5
ヘルパーを作成する必要があるでしょう。
編集:ソリューション
@MaDu_LK が解決策を示すことにしたので、これはおそらく宿題ですが、@false の具体化された等式述語を使用して、私のものを共有したいと思いました。
count_of([], _, 0).
count_of([H|Rest], E, N1) :-
equality_reified(H, E, Bool),
count_of(Rest, E, N0),
(Bool == true -> N1 is N0 + 1 ; N1 = N0).
frequency(L, I, N) :-
sort(L, LSorted),
member(I, LSorted),
count_of(L, I, N).
mode(L, X) :-
frequency(L, X, NMax),
\+ (frequency(L, _, NBigger),
NMax < NBigger).
これには、いくらか快適なパフォーマンス プロパティがあります。
% MaDu_LK
?- time(get_mode([a,b,c,a,b,c,a,a,b,c,a,d,b], X)).
% 2,811 inferences, 0.000 CPU in 0.000 seconds (100% CPU, 7117429 Lips)
X = a.
% mine
?- time(mode([a,b,c,a,b,c,a,a,b,c,a,d,b], X)).
% 217 inferences, 0.000 CPU in 0.000 seconds (98% CPU, 3144928 Lips)
X = a ;
% 195 inferences, 0.000 CPU in 0.000 seconds (97% CPU, 3305085 Lips)
false.
もう 1 つのソリューションも、リストがマルチモーダルであっても、1 つのモードのみを生成します。
% MaDu_LK
?- get_mode([a,a,b,b,c], X).
X = a.
% mine
?- mode([a,a,b,b,c], X).
X = a ;
X = b ;
false.
思考の糧。