prolog所有二进制数

时间:2012-01-09 00:02:47

标签: binary prolog

我需要一个谓词,它将产生所有N位数的二进制数。

例如谓词二进制(2,L)

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

请不要使用findall ....

2 个答案:

答案 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)