首页 > 解决方案 > 在 Prolog 中从十六进制转换为二进制

问题描述

这是一些将十六进制转换为二进制的程序,我需要得到类似X = [1,1,1,1,0,0,0,0]for的结果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).

我的问题是附加的。

标签: binaryprologhexconverter

解决方案


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

?- 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.

瞧,我们看到了基本情况必须是什么。正确的?

此外,我们实际上也已经看到了递归情况必须是什么。而且你不需要任何明确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只是在说你的意思


推荐阅读