このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642
#  お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 
#  "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を 
#  返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 
#  例 
#  1 
#  11 
#  21 
#  1211 
#  111221 
#  312211 
#  13112221 
#  1113213211 
#  31131211131221 
#  13211311123113112211 
#  11131221133112132113212221 
# 
# 

'"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :-
        length(Ln,10),
        '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,'1').

'"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !.
'"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :-
        writef('%t\n',[_文字列]),
        この操作を(_文字列,_次の文字列),
        '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列).

この操作を(_文字列,_次の文字列) :-
        findall(_個数と連続した記号の結合文字列,(
                    '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数),
                    atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)),
                _個数と連続した記号の結合文字列ならび),
        次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列).

'文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :-
        atom_chars(_文字列,_文字ならび),
        'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数).

'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :-
        append(L1,L2,L3,_文字ならび),
        'L2は_記号が_個数連続している'(L2,_連続した記号,_個数),
        '両隣は_連続した記号と異なる'(_連続した記号,L1,L3).

'両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :-
        \+((last(L1,A0),A0=_連続した記号)),
        \+((nth1(1,L3,A3),A3=_連続した記号)).

次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :-
        atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列).

'L2は_記号が_個数連続している'(L2,_記号,_個数) :-
        L2 = [_記号|R],
        all(R,_記号),
        length([_記号|R],_個数).

all([],_).
all([V|R],V) :-
        all(R,V).

append([],L2,L3,L) :-
        append(L2,L3,L).
append([U|R1],L2,L3,[U|R4]) :-
        append(R1,L2,L3,R4).