Binary 正好有n位的所有二进制数

Binary 正好有n位的所有二进制数,binary,prolog,sequence,clpfd,Binary,Prolog,Sequence,Clpfd,我需要一个谓词来生成列表中长度为N的所有二进制数 样本使用: ?- bins(2,L). L = [[0,0], [0,1], [1,0], [1,1]]. % expected result ?- bins(4,Zss). Zss = [[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0], [0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0], [0,0,0,1],[1,0,0,1],[0,1,0,1],

我需要一个谓词来生成列表中长度为
N
的所有二进制数

样本使用:

?- bins(2,L).
L = [[0,0], [0,1], [1,0], [1,1]].    % expected result
?- bins(4,Zss).
Zss = [[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],
       [0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],
       [0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],
       [0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]].

可能有更好的方法,但这里有一个使用findall的解决方案

bins(N,L) :-
    findall(Num,binary_number(N,Num),L).

binary_number(0,[]).
binary_number(N,[D|Ds]) :-
    N > 0,
    member(D,[0,1]),
    N1 is N - 1,
    binary_number(N1,Ds).
或者:

member_(A, B) :- member(B, A).
bins(Size, Result) :-
    findall(L, (length(L, Size), maplist(member_([0, 1]), L)), Result).
可通过使用模块简化:


无需使用
findall/3

我们根据、和定义了
bin/2

以下是最一般的查询:

?- bins(N,Zss).
  N = 0, Zss = [[]]
; N = 1, Zss = [[0],[1]]
; N = 2, Zss = [[0,0],[1,0],[0,1],[1,1]]
; N = 3, Zss = [[0,0,0],[1,0,0],[0,1,0],[1,1,0],[0,0,1],[1,0,1],[0,1,1],[1,1,1]]
...

我需要一个没有findall的解决方案li需要一个没有findall或其他“就绪”谓词的解决方案注意异常:
bins(1+0,L)
失败,而
bins(2+0,L)
成功新版本甚至在确定性基础上也有所改进@错误的和
N=0,Zss=[[]]
作为基本情况,而不是
N=1,Zss=[[0],[1]]
。有点规范,不是吗?。。。你的意思是:嗯-founded@false. 啊。。。是的,没错!它就在我嘴边。
?- bins(4,Zss).
Zss = [[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],
       [0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],
       [0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],
       [0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]].
?- bins(N,Zss).
  N = 0, Zss = [[]]
; N = 1, Zss = [[0],[1]]
; N = 2, Zss = [[0,0],[1,0],[0,1],[1,1]]
; N = 3, Zss = [[0,0,0],[1,0,0],[0,1,0],[1,1,0],[0,0,1],[1,0,1],[0,1,1],[1,1,1]]
...