从数字列表到prolog中的数字

时间:2018-06-06 15:50:26

标签: prolog

我在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 不起作用?

1 个答案:

答案 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/2atom_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.