>>197 Prolog

'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。連続する文字をカウントする。出力の最後に改行を挿入すること。' :-
    write('In: '),read(_文字列),
    '連続する文字をカウントする'(_文字列,'',_出力文字列),
    writef('Out:\n%t\n',[_出力文字列]).

'連続する文字をカウントする'('','') :- !.
'連続する文字をカウントする'(_文字列,_出力文字列) :-
    文字列の先頭から同一文字を切り取る(_文字列,_連続文字,_連続文字数,_残り文字列),
    '連続する文字をカウントする'(_残り文字列,_残り出力文字列),
    atomic_list_concat([_連続文字,_連続文字数,_残り出力文字列],_出力文字列).

文字列の先頭から同一文字を切り取る(_文字列,_連続文字,_連続文字数,_残り文字列) :-
    sub_atom(_文字列,0,1,_,_連続文字),
    連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,_残り文字列).

連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,_残り文字列) :-
    sub_atom(_文字列,_連続文字数,1,_,_文字),
    \+(_連続文字 = _文字),
    sub_atom(_文字列,_連続文字数,_,0,_残り文字列),!.
連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,'') :-
    atom_length(_文字列,_連続文字数).