Binary Prolog中的八进制到二进制数转换

Binary Prolog中的八进制到二进制数转换,binary,prolog,octal,clpfd,Binary,Prolog,Octal,Clpfd,这就是我试图将八进制数转换成二进制数的原因。 我想做的是找到给定八进制数的余数除以10得到每个数字,并将该数字转换为3位二进制。但是这段代码没有产生任何输出。请帮忙。 提前谢谢 convert_bin(0, '0'). convert_bin(1, '1'). convert_bin(N, B) :- N > 1, X is N mod 2, Y is N // 2, convert_bin(Y, B1), atom_concat(B1, X, B)

这就是我试图将八进制数转换成二进制数的原因。 我想做的是找到给定八进制数的余数除以10得到每个数字,并将该数字转换为3位二进制。但是这段代码没有产生任何输出。请帮忙。 提前谢谢

convert_bin(0, '0').
convert_bin(1, '1').
convert_bin(N, B) :-
    N > 1,
    X is N mod 2,
    Y is N // 2,
    convert_bin(Y, B1),
    atom_concat(B1, X, B).

convert_oct(N, O) :-
    X is N mod 10,
    convert_bin(X, B),
    Y is N // 10,
    convert_oct(Y, O1),
    atom_concat(O1, B, O).

编码的数字最好是数字列表,而不是原子

使用和,我们可以编写以下示例查询:

?- use_module(library(clpfd)). true. ?- n_base_digits(27, 2, Binary). Binary = [1,1,0,1,1]. ?- n_base_digits(N, 2, [1,1,0,0,1,0,0,1]). N = 201 ; false. ?- n_base_digits(N, 2, [1,1,0,0,1,0,0,1]), n_base_digits(N, 8, Octal). N = 201, Octal = [3,1,1] ; false. ?- (). 对。 ?-n_基_位(27,2,二进制)。 二进制=[1,1,0,1,1]。 ?-n_基_位(n,2,[1,1,0,0,1,0,0,1])。 N=201 ; 错。 ?-n_基_位(n,2,[1,1,0,0,1,0,0,1]), n_基_位(n,8,八进制)。 N=201,八进制=[3,1,1] ; 错。
题外话:N是八进制,必须用8作为基数,而不是10。我很清楚这一点。但要将八进制转换为二进制,只需将每个数字转换为3位的二进制数。示例八进制数123是001010011。所以做这个123模10得到3。3的二进制数是011。然后123/10是12。12模10为2,2的二进制为010。最后12/10是1,1模10是1,它的二进制是001。很明显,这就是我在这段代码中所做的,你可能没有理解。你不一致的表述增加了混乱。实际上,正如Prolog所理解的那样,您将十进制数视为八进制数,但是您的输出是一个表示二进制的原子,而不是像八进制输入那样使用十进制数来表示二进制。不管怎样,我看到的一个问题是,您没有
convert\u oct/2
的基本案例。至少如果你这样做了,你还没有表现出来。如果没有一个基本情况,它注定会失败而没有结果。。你能告诉我如何在这种情况下使代码工作吗?只需为convert_oct添加一个基本案例,就能得到正确的结果?为什么不添加一个好的基本案例并找出答案呢?:)查看您的
convert\u oct/2
谓词,找出递归将如何结束。在什么情况下会这样?所有这些
;false
?如果我想将八进制数转换为二进制数,如何使用此代码?@eakertolearn。像这样:
?-n\u base\u数字(n,8,[3,3]),n\u base\u数字(n,2,Bin)。
@false。说得好!OTOH
?-n_base_位(65535,2,二进制)
确定成功(thx到
zcompare/3
+索引)。有关于如何确定两种用途的建议吗?