我需要一個謂詞,將產生所有的N位數的二進制數字。序言所有的二進制數字
例如謂詞二進制(2,L)
將返回L = [[0, 0], [0, 1], [1, 0], [1, 1]]
。
請不要使用的findall ....
我需要一個謂詞,將產生所有的N位數的二進制數字。序言所有的二進制數字
例如謂詞二進制(2,L)
將返回L = [[0, 0], [0, 1], [1, 0], [1, 1]]
。
請不要使用的findall ....
如果你需要避免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)
一旦你有一個代表所有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)
).
是我的嘗試是不正確的,因爲我不知道如何生產二進制數 – user1118501 2012-01-09 00:11:29
是這個家庭作業? – salva 2012-01-09 08:47:06
是的,這是作業,我需要一個解決方案,以便我可以看到如何解決,以便我爲期末考試做好準備 – user1118501 2012-01-09 11:59:25