このディレクトリの索引
#  出題場所 :: 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回繰り返し、途中経過を表示する。' :-
'"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'.

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

この操作(Ln,_文字列,Ln,_文字列).
この操作(Ln_1,_文字列_1,Ln,_文字列) :-
連続数連続記号が列んだ行を生成する(Ln_1,_文字列_1,Ln,_文字列).

連続数連続記号が列んだ行を生成する(Ln_1,_文字列_1,Ln,_文字列) :-
連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列_1,_文字構成ならび),
atomic_list_concat(_文字構成ならび,_文字列_2),
この操作([_|Ln_1],_文字列_2,Ln,_文字列).

連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列,_文字構成ならび) :-
findall([_連続数,_連続記号],(
連続記号を切り取る(_文字列,_連続数,_連続記号)),LL),
flatten(LL,_文字構成ならび).

連続記号を切り取る(_文字列,_連続数,_連続記号) :-
'前文字列・後文字列'(_文字列,_前文字列の文字数,_,_前文字列,_後文字列),
前文字列は全部同じ記号で構成され後文字列の先頭記号はこれとは異なる(_前文字列,_後文字列,_同じ記号),
連続記号を切り取る(_後文字列,_前文字列の文字数,_同じ記号,_連続数,_連続記号).

連続記号を切り取る(_後文字列,_連続数,_連続記号,_連続数,_連続記号).
連続記号を切り取る(_後文字列,_,_,_連続数,_連続記号) :-
連続記号を切り取る(_後文字列,_連続数,_連続記号).

'前文字列・後文字列'(_文字列,_前文字列の長さ,_後文字列の長さ,_前文字列,_後文字列) :-
sub_atom(_文字列,0,_前文字列の長さ,_後文字列の長さ,_前文字列),
sub_atom(_文字列,_,_後文字列の長さ,0,_後文字列).

前文字列は全部同じ記号で構成され後文字列の先頭記号はこれとは異なる(_前文字列,_後文字列,_同じ記号) :-
前文字列は全部同じ記号で構成され(_前文字列,_同じ記号),
後文字列の先頭記号はこれとは異なる(_後文字列,_同じ記号).

前文字列は全部同じ記号で構成され(_前文字列,_同じ記号) :-
sub_atom(_前文字列,0,1,_,_同じ記号),
forall(sub_atom(_前文字列,_,1,_,_記号),_記号=_同じ記号).

後文字列の先頭記号はこれとは異なる(_後文字列,_同じ記号) :-
\+(sub_atom(_後文字列,0,1,_,_同じ記号)).