Binary prolog所有二进制数

Binary prolog所有二进制数,binary,prolog,Binary,Prolog,我需要一个谓词,它将生成所有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_binar

我需要一个谓词,它将生成所有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个数字展开成两个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)
   ).

我所尝试的是不正确的,因为我不知道如何产生二进制数是的,这是家庭作业,我需要一个解决方案,这样我就可以看到如何解决它,以便我为期末考试做好准备