我有一個謂詞,它接收原子形式的二進制數,並返回一個十六進制代碼列表。Prolog如何獲取無意義的變量以產生輸出
?- binaryHex('11111111',X).
X = [f, f].
當我嘗試從十六進制到二進制去,我得到這個錯誤:
?- binaryHex(X,[f,f]).
ERROR: atom_codes/2: Arguments are not sufficiently instantiated
我想這兩個變量產生正確的輸出。這是代碼。
hex('0000',0). hex('0001',1). hex('0010',2). hex('0011',3).
hex('0100',4). hex('0101',5). hex('0110',6). hex('0111',7).
hex('1000',8). hex('1001',9). hex('1010',a). hex('1011',b).
hex('1100',c). hex('1101',d). hex('1110',e). hex('1111',f).
binaryHex(X,Y) :-
atom_codes(X,A),
binaryList(A,B),
binaryHex_(B,Y).
binaryList([],[]).
binaryList([A,B,C,D|Ds],[Y|Ys]) :-
atom_codes(Y,[A,B,C,D]),
binaryList(Ds,Ys).
binaryHex_([],[]).
binaryHex_([B|Bs],[H|Hs]) :-
hex(B,H),
binaryHex_(Bs,Hs).
在謂詞binaryHex_/2
和binaryList/2
工作兩者兼得的變量。由於原始binaryHex/2
:binaryList/2
中的實例化順序必須在binaryHex_/2
之前,程序發生故障才能使二進制的原始任務以十六進制工作。
我想如果我將十六進制列表轉換爲原子,這個問題會複雜化。什麼是應對這種情況的一些策略,以便在繼續編程時我不會遇到實例化錯誤?對於何時無法實現的任何評論/回答也會受到鼓勵。
''11111111''是* atom *,而不是*字符串*。在Prolog中,*字符*(*例如*,「」11111111「')代表*字符代碼*的*列表*。 – lurker