如何在不使用内置谓词的情况下检查给定值是否是 Prolog 中的数字number
?
假设我有一个列表[a, 1, 2, 3]
。我需要一种方法来检查此列表中的每个元素是否都是数字。困扰我的唯一部分问题是如何在不使用number
谓词的情况下进行检查。
我试图弄清楚这一点的原因是我有一个大学作业,其中明确规定不要使用任何内置谓词。
您需要一些内置谓词来解决这个问题 - 除非您明确枚举所有数字(这是不切实际的,因为它们有无限多)。
最直接的方法是:
maplist(number, L).
或者,递归
allnumbers([]).
allnumbers([N|Ns]) :-
number(N),
allnumbers(Ns).
在评论中,您说“值作为原子给出”。这可能意味着你得到 [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
您可能想编写语法而不是catch...
目标。最近有很多这样的定义,你可以看看这个问题。
如果整个“值”作为原子给出,您将再次需要,atom_chars/2
或者您可能需要一些特定于实现的解决方案,例如atom_to_term/3
然后应用上述解决方案之一。