我需要一个谓词来生成列表中长度为N
的所有二进制数。
样品使用:
?- bins(2,L).
L = [[0,0], [0,1], [1,0], [1,1]]. % expected result
答案 0 :(得分:3)
无需使用findall/3
!
我们根据clpfd,foldl/4
,Prolog lambdas,if_/3
和(#<)/3
定义bins/2
。
:- use_module(library(lambda)).
:- use_module(library(clpfd)).
bins(N,Zss) :-
if_(N #< 1,
( N #= 0, Zss = [[]] ),
( N #= N0+1,
bins(N0,Xss),
foldl(\Bs^phrase(([[0|Bs]],[[1|Bs]])),Xss,Zss,[]))).
样品使用:
?- 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]]
...
答案 1 :(得分:2)
可能有更好的方法,但这里有一个使用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).
答案 2 :(得分:0)
或者:
member_(A, B) :- member(B, A).
bins(Size, Result) :-
findall(L, (length(L, Size), maplist(member_([0, 1]), L)), Result).
可以使用lambda模块进行简化:
bins(Size, Result) :-
findall(L, (length(L, Size), maplist(\X^member(X, [0, 1]), L)), Result).