2012-01-09 31 views
1

我需要一個謂詞,將產生所有的N位數的二進制數字。序言所有的二進制數字

例如謂詞二進制(2,L)

將返回L = [[0, 0], [0, 1], [1, 0], [1, 1]]

請不要使用的findall ....

+0

是我的嘗試是不正確的,因爲我不知道如何生產二進制數 – user1118501 2012-01-09 00:11:29

+0

是這個家庭作業? – salva 2012-01-09 08:47:06

+0

是的,這是作業,我需要一個解決方案,以便我可以看到如何解決,以便我爲期末考試做好準備 – user1118501 2012-01-09 11:59:25

回答

1

如果你需要避免findall/3,那麼你就需要一個聚合收集二進制數:

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,...]展開爲兩個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) 
    ). 
相關問題