Мне нужен предикат, который будет производить все двоичное число из N цифр.пролог всех двоичных чисел
Например предикат двоичное (2, l)
L = [[0, 0], [0, 1], [1, 0], [1, 1]]
вернется.
пожалуйста, не используйте FindAll ....
Мне нужен предикат, который будет производить все двоичное число из 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-номера [a,b,c,...]
на два N + 1-цифры: [0,a,b,c,...]
и [1,a,b,c,...]
.
Update:
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)
).
то, что я пытался не правильно, потому что я не знаю, как производить двоичные числа – user1118501
является это домашнее задание? – salva
Да, это домашнее задание, и мне нужно решение, чтобы я мог видеть, как его можно решить, чтобы я был готов к заключительному экзамену – user1118501