У меня есть предикат, который получает двоичное число в форме атома и возвращает список шестнадцатеричных кодов.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'' * атом *, а не * строка *. В Prolog строка * * (*, например, *, '" 11111111 "') представляет * список * * кодов символов *. – lurker