このディレクトリの索引
#  出典 :: プログラミングのお題スレ3 #623
#  お題:1のビットが3個ある二進表記文字列が与えられたとき、次に大きい 
#  1のビットが3個ある二進表記文字列を求める。 
#  例 
#  111 -> 1011 
#  1110 -> 10011 
#  101100 -> 110001 

'1のビットが3個ある二進表記文字列が与えられたとき、次に大きい1のビットが3個ある二進表記文字列を求める。'(_1のビットが3個ある二進表記文字列,_次に大きい1のビットが3個ある二進表記文字列) :-
        先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_探索した数字ならび),
        '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(_探索した数字ならび,_次に大きい1のビットが3個ある二進表記文字列),!.

先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_生成された数字ならび) :-
        atom_concat('0',_1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字列),
        atom_chars(_先頭に0を付加した1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字ならび),
        順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび),
        _生成された数字ならび @> _先頭に0を付加した1のビットが3個ある二進表記文字ならび.

順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび) :-
        length(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_要素数),
        '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび),
        順列(_最後の3要素だけ数字1それより前は数字0のならび,_要素数,_生成された数字ならび).

'最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび) :-
        length(_最後の3要素だけ数字1それより前は数字0のならび,_要素数),
        append(_全ての要素が数字0のならび,['1','1','1'],_最後の3要素だけ数字1それより前は数字0のならび),
        全ての要素が数字0のならび(_全ての要素が数字0のならび).

'先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['0'|L],_次に大きい1のビットが3個ある二進表記文字列) :-
        atomic_list_concat(L,_次に大きい1のビットが3個ある二進表記文字列).
'先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['1'|L],_次に大きい1のビットが3個ある二進表記文字列) :-
        atomic_list_concat(['1'|L],_次に大きい1のビットが3個ある二進表記文字列).

全ての要素が数字0のならび([]).
全ての要素が数字0のならび(['0'|_全ての要素が数字0のならび]) :-
        全ての要素が数字0のならび(_全ての要素が数字0のならび).

順列(Y,0,[]).
順列(Y,N,[A|X]) :-
        select(A,Y,Z),
        M is N - 1,
        順列(Z,M,X).