我需要一个谓词,它将产生所有N位数的二进制数。
例如谓词二进制(2,L)
将返回L = [[0, 0], [0, 1], [1, 0], [1, 1]]
。
请不要使用findall ....
答案 0 :(得分:2)
一旦你有一个表示N位的所有数字的列表,生成所有N + 1位的数字只需要将每个N个数[a,b,c,...]
展开成两个N + 1个数字:{{ 1}}和[0,a,b,c,...]
。
<强>更新强>:
[1,a,b,c,...]
答案 1 :(得分: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)