我在Prolog,我有一个数字列表,如:
L = [4,8,0]
我想获得通讯员号码480。 但我没有成功。
我尝试将每个数字元素从L转换为其对应的字符代码,使用内置运算符 char_code ,然后使用内置运算符number_codes以获取数字项从char代码列表中。但它不起作用。你能救我吗?
test([],[]).
test([X|Y],[C|K]):-char_code(C,X),
test(Y,K).
try(X):-
test([4,8,0],L),
number_codes(X,L).
ps:你能解释一下为什么组合 char_code - > number_codes 不起作用?
答案 0 :(得分:0)
谓词char_code
是一种定义字符与其ASCII码之间等价关系的关系。例如,char_code(a, 96)
为真,因为96是字符'a'
的十进制ASCII代码。例如,如果您要查询char_code(C, 96)
,那么您将获得C = a
作为解决方案。类似地,char_code('9', 57)
为真,因为57是字符的ASCII代码,表示数字9.注意'9'
这里不是数字9,而是字符{ {1}}。
在您的代码中,您将'9'
谓词应用于原始数字。如果char_code/2
是ASCII值为9的字符代码(在本例中为水平制表符),则char_code(C, 9)
将成功。当您应用此值并尝试对值使用C
时,您不会获得数字,因为您没有提供与数字对应的ASCII码。
如果您要在Prolog提示符下对number_codes/2
谓词进行简单测试,就可以看到这一点:
test/2
您的期望是?- test([4,8,0], L).
L = ['\004\', '\b', '\000\']
。
您需要使用的是L = ['4', '8', '0']
而不是atom_number/2
。然后,当char_code/2
(atom_number(C, 9)
绑定到 atom C = '9'
时)C
成功:
'9'
然后你得到:
numbers_atoms([],[]).
numbers_atoms([X|Y],[C|K]) :-
atom_number(C, X),
numbers_atoms(Y,K).
digits_number(Digits, Number) :-
numbers_atoms(Digits, Atoms),
number_codes(Number, Atoms).
你也可以写:
?- digits_number([4,8,0], Number).
Number = 480.