将二进制谓词转换为十进制谓词

0 prolog swi-prolog prolog-lists

convertBinToDec(B,D):- atom_number(S,B),
                       atom_length(S,L),
                       sub_atom(S, 0, 1, After,S1),
                       atom_number(S1,N),
                       L1 is L-1,
                       sub_atom(S, 1,L1, After ,S2),
                       atom_number(S2,B2),
                       convertBinToDec(B2,D1),
                       D is D1+((2*N)**L1).
convertBinToDec(0,0).
convertBinToDec(1,1).
Run Code Online (Sandbox Code Playgroud)

谓词采用 B 是整数形式的二进制数,应该返回 D 其相应的十进制形式,对不起,我对声明式编程语言还是个新手,但我不知道为什么我上面的代码总是错误,我觉得有什么问题使用基本情况 也不允许使用 prolog 库

Pau*_*ura 5

鉴于 Prolog 支持使用0b前缀表示二进制数,例如0b10011101,您可以使用标准number_codes/2谓词来执行转换:

convert_binary_to_decimal(Binary, Decimal) :-
    number_codes(Binary, Codes),
    number_codes(Decimal, [0'0, 0'b| Codes]).
Run Code Online (Sandbox Code Playgroud)

示例调用:

| ?- convert_binary_to_decimal(10011101, Decimal).

Decimal = 157

yes
Run Code Online (Sandbox Code Playgroud)

验证结果:

| ?- Decimal is 0b10011101.

Decimal = 157

yes
Run Code Online (Sandbox Code Playgroud)