【问题标题】:Octal to Binary number conversion in PrologProlog中的八进制到二进制数转换
【发布时间】:2023-03-28 06:59:01
【问题描述】:

这就是我试图将八进制数转换为二进制数的方法。 我想做的是找到给定八进制数除以 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).

【问题讨论】:

  • 离题:N 是八进制,必须使用 8 作为底数,而不是 10
  • 我非常清楚这一点。但是要将八进制转换为二进制,您只需将每个数字转换为 3 位的二进制数。示例八进制数 123 是 001010011。所以要做到这一点,123 mod 10 给出 3。3 的二进制是 011。然后 123/10 是 12。12 mod 10 是 2,2 的二进制是 010。最后 12/10 是 1和 1 mod 10 是 1,它的二进制是 001。很明显,这就是我在这段代码中所做的,你可能错过了理解。
  • 您不一致的表述更加混乱。实际上,正如 Prolog 所理解的那样,您正在处理一个十进制数,就好像它是八进制一样,但是您的输出是一个表示二进制的原子,而不是像使用八进制输入那样使用十进制数来表示二进制。无论如何,我看到的一个问题是您没有 convert_oct/2 的基本案例。至少如果你这样做了,你还没有表现出来。没有基本情况,它必然会失败而没有结果。
  • 我是 prolog 的新手。你能告诉我如何让代码在这种情况下工作吗?只需为 convert_oct 添加一个基本案例就能得到正确的结果?
  • 为什么不添加一个好的基本案例并找出答案? :) 查看您的 convert_oct/2 谓词并弄清楚递归将如何结束。在什么条件下会这样?

标签: binary prolog octal


【解决方案1】:

编码后的数字最好是一个数字列表——而不是一个原子!

使用n_base_digits/3,我们可以编写以下示例查询:

?-use_module(library(clpfd))。 真的。 ?- n_base_digits(27, 2, 二进制)。 二进制 = [1,1,0,1,1]。 ?- n_base_digits(N, 2, [1,1,0,0,1,0,0,1])。 N = 201 ;错误的。 ?- n_base_digits(N, 2, [1,1,0,0,1,0,0,1]), n_base_digits(N,8,八进制)。 N = 201,八进制 = [3,1,1] ;错误的。

【讨论】:

  • 所有这些; false ?
  • 如果我想将八进制数转换为二进制,如何使用此代码?
  • @eagertolearn。像这样:?- n_base_digits(N,8,[3,3]), n_base_digits(N,2,Bin).
  • @false。好点子! OTOH ?- n_base_digits(65535,2,Binary) 确定性成功(感谢zcompare/3 + 索引)。有关于如何确定这两种用途的建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2014-06-10
  • 2017-09-27
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多