Если вам нужно избежать 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)