プロローグが初めてなので、質問は簡単かもしれませんが、答えが見つかりませんでした。誰か助けてください。
ただ欲しい
カウント関数 st
count([c,c,a,a,b,b,d,a,c,b,d,d,a], O).
リストメンバーの出現回数を返します。
O = [[a, 4], [b, 3], [c, 3], [d, 3]]
以下は、「リスト内の重複を削除する(プロローグ)」に対する私の以前の回答と、質問「AUBUCのプロローグユニオン」に対するこの以前の回答に基づいています。
list_item_subtracted_count0_count/5
から導出されlist_item_subtracted/3
ます。
list_counts/2
は から派生しておりlist_setB/2
、どちらもここで定義されています。
list_item_subtracted_count0_count([], _, [], N,N)。 list_item_subtracted_count0_count([A|As], E, Bs1, N0,N) :- if_ (A = E, ( Bs1 = Bs 、N1 は N0+1 )、 ( Bs1 = [A|Bs], N1 = N0 )), list_item_subtracted_count0_count(As, E, Bs, N1,N). list_counts([], [])。 list_counts([X|Xs], [XN|Ys]) :- list_item_subtracted_count0_count(Xs, X, Xs0, 1,N), list_counts(Xs0, Ys)。
OPが提供したクエリは次のとおりです。
?- list_counts([c,c,a,a,b,b,d,a,c,b,d,d,a], Xss).
Xss = [c-3,a-4,b-3,d-3]. % succeeds deterministically
X-N
inのペアの順序は、 in の最初の出現に対応することに注意してCounts
ください。X
Xs
?- list_counts([ a ,b,c,d], Xss). Xss = [ a -1,b-1,c-1,d-1]. ?- list_counts([d,c,b, a ], Xss)。 Xss = [d-1,c-1,b-1, a -1].
最後に、考えられるすべてのリストを考えてみましょうEs
— 長さの昇順で公平に列挙します:
?-長さ(Es、N)、list_counts(Es、Xss)。 N = 0、エス = []、Xss = [] ; N = 1、Es = [A]、Xss = [A-1] ; N = 2、Es = [A、A]、Xss = [A-2] ; N = 2、Es = [A、B]、Xss = [A-1、B-1]、dif(B、A) ; N = 3、Es = [A、A、A]、Xss = [A-3] ; N = 3、Es = [A、A、B]、Xss = [A-2、B-1]、dif(B、A) ; N = 3、Es = [A、B、A]、Xss = [A-2、B-1]、dif(B、A) ; N = 3、Es = [B、A、A]、Xss = [B-1、A-2]、dif(A、B)、dif(A、B) ; N = 3、Es = [A、B、C]、Xss = [A-1、B-1、C-1]、dif(C、A)、dif(C、B)、dif(B、A) ...
co(X,L) :- co(X,[],L).
co([],A,A).
co([X|Xs], A, L) :- p(X-Z,A,R), !, Z1 is Z+1, co(Xs, [X-Z1|R], L).
co([X|Xs], A, L) :- co(Xs, [X-1|A], L).
p(X-Y,[X-Y|R],R):- !.
p(X,[H|Y], [H|Z]) :- p(X,Y,Z).
あまり意味のある名前は意図的に使用していません。それぞれの述語が何をするのかを理解するようにしてください。