このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1247438792/659
# [1] C言語 
# [2] 入力された英字文字列(a~z,A-Z)に、どの文字がいくつ入っているかを
# 調べるプログラムcount_char.cを作成せよ。 
# 
# 実行例 
# String: cbbbAcAccZ 
# A: ** 
# Z: * 
# b: *** 
# c: **** 
# %  

'入力された英字文字列(a~z,A-Z)に、どの文字がいくつ入っているかを
調べるプログラムcount_char.cを作成せよ。 

実行例 
String: cbbbAcAccZ 
A: ** 
Z: * 
b: *** 
c: ****' :-
        '入力された英字文字列(a~z,A-Z)に'(_文字列),
        count_char(_文字列).

'入力された英字文字列(a~z,A-Z)に'(_文字列) :-
        get_line(_文字列),
        '診断::入力された英字文字列(a~z,A-Z)'(_文字列),!.
'入力された英字文字列(a~z,A-Z)に'(_文字列) :-
        '入力された英字文字列(a~z,A-Z)に'(_文字列).

'診断::入力された英字文字列(a~z,A-Z)'(_文字列) :-
        forall(sub_atom(文字列,_,1,_,_文字),英字文字(_文字)).

英字文字(_文字) :-
        英小文字(_文字).
英字文字(_文字) :-
        英大文字(_文字).

英小文字(_文字) :-
        _文字 @>= 'a',
        _文字 @=< 'z'.

英大文字(_文字) :-
        _文字 @>= 'A',
        _文字 @=< 'Z'.

count_char(_文字列) :-
        atom_chars(_文字列,Chars),
        count_char_1(Chars,[],QL),
        キューを表示する(QL).

count_char_1([],X,X).
count_char_1([A|R],QL,X) :-
        count_char_2(A,QL,QL2),
        count_char_1(R,QL2,X).

count_char_2(A,[],[[A,QA]]) :-
        新しいキューを作る(Q),
        キューに要素を追加する('*',Q,QA),!.
count_char_2(A,[[A,QA]|R],[[A,QB],R]) :-
        キューに要素を追加する('*',QA,QB),!.
count_char_2(A,[U|R1],[U|R2]) :-
        count_char_2(A,R1,R2).

新しいキューを作る(X-X).
キューは空である(X-Y) :-
        X == Y.
キューに要素を追加する(_要素,X-[_要素|Y],X-Y).

キューを表示する(QL) :-
        forall((    member([U,Q-[]],QL),
                    atomic_list_concat(Q,S)),
                writef('%t: %t\n',[U,S]).