Numbers 如何手动检查Prolog中的值是否为数字?

Numbers 如何手动检查Prolog中的值是否为数字?,numbers,prolog,Numbers,Prolog,如何在Prolog中检查给定值是否为数字,而不使用内置谓词,如number 假设我有一个列表[a,1,2,3]。我需要一种方法来检查这个列表中的每个元素是否都是一个数字。唯一困扰我的问题是如何在不使用number谓词的情况下进行检查 我之所以想弄明白这一点,是因为我有一个大学作业,其中明确规定不要使用任何内置谓词。你需要一些内置谓词来解决这个问题-除非你明确地列举所有数字(这是不实际的,因为它们有无限多个) 1. 最直截了当的是: maplist(number, L). 或者,递归地 alln

如何在Prolog中检查给定值是否为数字,而不使用内置谓词,如
number

假设我有一个列表
[a,1,2,3]
。我需要一种方法来检查这个列表中的每个元素是否都是一个数字。唯一困扰我的问题是如何在不使用
number
谓词的情况下进行检查


我之所以想弄明白这一点,是因为我有一个大学作业,其中明确规定不要使用任何内置谓词。

你需要一些内置谓词来解决这个问题-除非你明确地列举所有数字(这是不实际的,因为它们有无限多个)

1. 最直截了当的是:

maplist(number, L).
或者,递归地

allnumbers([]).
allnumbers([N|Ns]) :-
   number(N),
   allnumbers(Ns).
2. 在一条评论中,你说“这个值是作为一个原子给出的”。这可能意味着你会得到[a,'1','2']或[a,1,2]`。我想是第一个。这里同样需要一个内置谓词来分析名称。根据ISO Prolog的错误,我们写道:

numberatom(Atom) :-
   atom_chars(Atom, Chs),
    catch(number_chars(_, Chs), error(syntax_error(_),_), false).
使用
numberatom/1
代替
number/1
,因此编写递归规则或使用
maplist/2

3. 您可能希望编写语法而不是
catch…
目标。最近有很多这样的定义,你可以看看

4.
如果整个“值”以原子形式给出,您将再次需要
atom\u chars/2
,或者您可能需要一些特定于实现的解决方案,如
atom\u to\u term/3
,然后应用上述解决方案之一。

完整的故事是什么?为什么不使用内置的?值是以原子还是字符串的形式给出的?对于数字,所有值都是number@LittleBobby Tables:值以原子形式给出。@Luka:你的意思是,列表是
[a,'1','2','3']
?那么“值以原子形式给出”是什么意思?