このディレクトリの索引

http://pc11.2ch.net/test/read.cgi/db/1252492296/631
# MYSQL使ってます。
# id キーワード
# 1 りんご
# 2 みかん
# 3 りんご
# のようにDBに登録されてるキーワードが多い順に例えばヒット件数トップ10のキーワードを
# 抜き出したいのですがどのように書いたらいいでしょうか?
# 件数少ないうちは今までにないキーワードがでたら全検索で数えるって繰り替えそうと思ったんですけど、
# 件数多くなったら効率的に書かないとまずいかなと思いまして。

キーワード数の上位10位までを表示 :-
      findall([M,N],カウンタカウンタ(M,N),L1),
      sort(L1,L2),
      reverse(L2,L3),
      上位10位まで(L3,L),
      キーワード数の上位10位までを表示(L).

キーワード数の上位10位までを表示([]) :- !.
キーワード数の上位10位までを表示([M|R]) :-
      キーワードカウンタ(_キーワード,M),
      キーワード表示(_キーワード),
      fail.
キーワード数の上位10位までを表示(R).

キーワード表示(_キーワード) :-
      キーワード(ID,_キーワード),
      write_formatted('%t,%t\n',[ID,_キーワード]).

上位10位まで([],_,[]) :- !.
上位10位まで(_,Count,[]) :- Count >= 10,!.
上位10位まで([[M,N]|R1],Count1,[M|R2]) :-
      Count2 is Count1 + N,
      上位10位まで(R1,Count2,R2).

キーワードカウンタを準備する :-
      abolish(キーワードカウンタ/2),
      キーワード(Id,_キーワード),
      キーワードカウンタ((+),_キーワード),
      fail.
キーワードカウンタを準備する.

キーワードカウンタ((+),_キーワード) :-
      retract(キーワードカウンタ(_キーワード,_現在のカウント)),
      _加算されたカウント is _現在のカウント + 1,
      カウンタカウンタの更新((-),_現在のカウント)
      カウンタカウンタの更新((+),_加算されたカウント),
      asserta(キーワードカウンタ(_キーワード,_加算されたカウント)),!.
キーワードカウンタ((+),キーワード) :-
      asserta(キーワードカウンタ(_キーワード,1)),
      カウンタカウンタの更新((+),1),!.

カウンタカウンタの更新((+),M) :-
      retract(カウンタカウンタ(M,N)),
      N2 is N + 1,
      asserta(カウンタカウンタ(M,N2)),!.
カウンタカウンタの更新((+),M) :- asserta(カウンタカウンタ(M,1)).
カウンタカウンタの更新((-),M) :-
      retract(カウンタカウンタ(M,N)),
      N1 is N - 1,
      asserta(カウンタカウンタ(M,N1)),!.