このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1276873238/745
#  問題 
#  1が連続しない2進数を1から小さい順に1000個求めよ。 
#  例 
#  10 => OK 
#  110 => NG 
#  10101 =>OK 
#  11011 =>NG 
# 
# 

'1が連続しない2進数を1から小さい順に1000個求めよ。'(_1000個の数ならび) :-
        findall(_10進数,(
                    '1が連続しない2進数を1から小さい順に'([1],1,_度数,_ビットならび),
                    (   _度数 > 1000,!,fail;
                        'ビットならびを10進数に変換'(_ビットならび,_10進数))),
                _1000個の数ならび).

'1が連続しない2進数を1から小さい順に'([1|L],_度数,_度数,[1|L]).
'1が連続しない2進数を1から小さい順に'([1|L],_度数_1,_度数,_ビットならび) :-
        _度数_2 is _度数_1 + 1,
        '1が連続しない2進数を1から小さい順に'([0,1|L],_度数_2,_度数,_ビットならび).
'1が連続しない2進数を1から小さい順に'([0|L],_度数_1,_度数,_ビットならび) :-
        member(N,[1,0]),
        '1が連続しない2進数を1から小さい順に'([N,0|L],_度数_1,_度数,_ビットならび).

'ビットならびを10進数に変換'(L,_10進数) :-
        atomic_list_concat([0,b|L],_二進数表示),
        atom_to_term(_二進数表示,_10進数,_).