2012-01-09 4 views
1

Мне нужен предикат, который будет производить все двоичное число из N цифр.пролог всех двоичных чисел

Например предикат двоичное (2, l)

L = [[0, 0], [0, 1], [1, 0], [1, 1]] вернется.

пожалуйста, не используйте FindAll ....

+0

то, что я пытался не правильно, потому что я не знаю, как производить двоичные числа – user1118501

+0

является это домашнее задание? – salva

+0

Да, это домашнее задание, и мне нужно решение, чтобы я мог видеть, как его можно решить, чтобы я был готов к заключительному экзамену – user1118501

ответ

1

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

После того, как у вас есть список, представляющий все номера с 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) 
    ). 
Смежные вопросы