Не нужно использовать findall/3
!
Мы определяем bins/2
на основе clpfd , foldl/4
, Пролог лямбда , if_/3
и (#<)/3
.
:- 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]]
...