【问题标题】:Conver from hex to binary in Prolog在 Prolog 中从十六进制转换为二进制
【发布时间】:2018-11-24 14:36:41
【问题描述】:

这是一些将十六进制转换为二进制的程序,我需要得到类似X = [1,1,1,1,0,0,0,0] 的结果pred([f,0])

所以我需要将所有列表合二为一。谁能告诉我怎么做?

hex(0, [0,0,0,0]).
hex(1, [0,0,0,1]).
hex(2, [0,0,1,0]).
hex(3, [0,0,1,1]).
hex(4, [0,1,0,0]).
hex(5, [0,1,0,1]).
hex(6, [0,1,1,0]).
hex(7, [0,1,1,1]).
hex(8, [1,0,0,0]).
hex(9, [1,0,0,1]).
hex(a, [1,0,1,0]).
hex(b, [1,0,1,1]).
hex(c, [1,1,0,0]).
hex(d, [1,1,0,1]).
hex(e, [1,1,1,0]).
hex(f, [1,1,1,1]).

pred([],X).

pred([H|T],X):-
 hex(H,Y),
 append(X,Y,X),
 write(Y),
 nl,
 pred(T).

我的问题在追加。

【问题讨论】:

  • append(X,Y,X) 说 X 是 X 附加到 Y 的结果。这只有在 Y 为空时才成立。这告诉我你认为你可以在 Prolog 中改变一个变量的值,但你不能,你需要另一个变量。此外,从长远来看,将输出与您的逻辑混合会伤害您。我建议你参考教程!你不能在 Prolog 中使用它。
  • 请参阅How do I append lists in Prolog?,确保您了解append 如何以自上而下的方式处理列表。它也适用于此。不是使用您的“附加”行,而是使用 pred 谓词本身。 pred 也会以自上而下的方式实例化其二进制列表。

标签: binary prolog hex converter


【解决方案1】:

让我们从一些例子开始,假设我们已经有了这个谓词:

?- pred( [f, 0],  X ).
X = [1,1,1,1, 0,0,0,0].        % that's what you said you want, isn't it?

?- pred( [f, 0],  [1,1,1,1, 0,0,0,0] ).
yes.

?- pred( [f | [0]],  [1,1,1,1 | [0,0,0,0]] ).
yes.

?- pred( [f | HEX], [A,B,C,D | BIN] ),  [A,B,C,D] = [1,1,1,1],  pred( HEX, BIN).
yes.

?- pred( [f | HEX], [A,B,C,D | BIN] ),  hex(f, [A,B,C,D]),  pred( HEX, BIN). 
yes.

?- pred( [0 | HEX2], [A2,B2,C2,D2 | BIN2] ),  hex(0, [A2,B2,C2,D2]),  pred( HEX2, BIN2). 
yes.

?- pred( [0 | HEX2], [A2,B2,C2,D2 | BIN2] ),  hex(0, [A2,B2,C2,D2]),  
                                               HEX2 = [], BIN2 = [],  pred( HEX2, BIN2). 
yes.

是吗?正确的? (如果不清楚,请考虑身份[0] = [0 | []])。

这意味着它也必须是这样的

?- HEX2 = [], BIN2 = [],  pred( HEX2, BIN2). 
yes.

?- pred( [], []). 
yes.

瞧,我们看到了基本情况必须是什么。对吧?

此外,我们实际上已经看到了 recursive 的情况。而且你不需要任何明确的append 在那里打电话。这个:

?- pred( [f | HEX], [A,B,C,D | BIN] ),  hex(f, [A,B,C,D]),  pred( HEX, BIN). 
yes.

可以写成

?- pred( [F | HEX], [A,B,C,D | BIN] ),  F = f, hex(F, [A,B,C,D]),  pred( HEX, BIN). 
yes.

但实际上,它很容易推广到

?- pred( [F | HEX], [A,B,C,D | BIN] ),  hex(F, [A,B,C,D]),  pred( HEX, BIN). 
yes.

你有它。

看到了吗? Prolog 很有趣。 Prolog 简单。 Prolog 只是说出你的意思

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2012-06-26
    • 2019-06-10
    • 1970-01-01
    • 2015-09-06
    • 2014-10-30
    相关资源
    最近更新 更多