2012-01-09 4 views
1

N桁の2進数をすべて生成する述語が必要です。すべての2進数をプロローグ

例えば述語バイナリ(2、L)

L = [[0, 0], [0, 1], [1, 0], [1, 1]]を返します。あなたがfindall/3を避けるために必要がある場合は

のfindAll使用しないでください....

+0

私は二進数 – user1118501

+0

を生成する方法を知らないので、私が試したことは正しくないが、この宿題ですか? – salva

+0

はいそれは宿題であり、私はそれが私が最終試験に備えるために解決できる方法を見ることができるようにソリューションが必要です – user1118501

答えて

1

、あなたは二進数を収集するアグリゲータが必要:あなたはその後、一度に一つのバイナリを生成

binary(N, L) :- 
    collect_binaries(N, [], L). 

そしてそれが集約されたリスト内にすでに存在するのかどうかを確認します

collect_binaries(N, R, L) :- 
    length(B, N), 
    make_binary(B), % make binary of length N 
    \+ memberchk(B, R), 
    !, 
    collect_binaries(N, [B|R], L). 

別のバイナリを生成に失敗した場合

、あなたが行われています。

collect_binaries(_, L, L). 

バイナリを生成するのは簡単です(質問に書いたフォーマットを使用しています:0/1の値のリスト)。あなたは、リスト内のすべての位置を反復処理し、1または0のいずれかを使用します。

make_binary([]). 
make_binary([H|T]) :- 
    member(H, [1,0]), 
    make_binary(T). 

結果:

?- binary(2, L). 
L = [[0, 0], [0, 1], [1, 0], [1, 1]] 
Yes (0.00s cpu) 
2

あなたはNのすべての数字を生成し、Nビットのすべての数字を表すリストを持っていたら、 +1ビットはN番号[a,b,c,...]を2つのN + 1番号:[0,a,b,c,...][1,a,b,c,...]に展開するだけです。

更新

unfold([], []). 
unfold([H|T], [[0|H], [1|H]|L]) :- 
    unfold(T, L). 

bn(N, L) :- 
    ( N = 0 
    -> L = [[]] 
    ; N1 is N - 1, 
     bn(N1, L1), 
     unfold(L1, L) 
    ). 
関連する問題