Binary Prolog中从十六进制到二进制的转换

Binary Prolog中从十六进制到二进制的转换,binary,prolog,hex,converter,Binary,Prolog,Hex,Converter,这是一些将十六进制转换为二进制的程序,我需要得到类似于X=[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,

这是一些将十六进制转换为二进制的程序,我需要得到类似于
X=[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中。

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

?- 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只是说说你的意思。

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