Search code examples
prologclpfd

reversible "binary to number" predicate


What is the best way to convert binary bits (it might be a list of 0/1, for example) into numbers in a reversible way. I've written a native predicate in swi, but is there better solution ? Best regards


Solution

  • Use CLP(FD) constraints, for example:

    :- use_module(library(clpfd)).
    
    binary_number(Bs0, N) :-
            reverse(Bs0, Bs),
            foldl(binary_number_, Bs, 0-0, _-N).
    
    binary_number_(B, I0-N0, I-N) :-
            B in 0..1,
            N #= N0 + B*2^I0,
            I #= I0 + 1.
    

    Example queries:

    ?- binary_number([1,0,1], N).
    N = 5.
    
    ?- binary_number(Bs, 5).
    Bs = [1, 0, 1] .
    
    ?- binary_number(Bs, N).
    Bs = [],
    N = 0 ;
    Bs = [N],
    N in 0..1 ;
    etc.