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