4

如何在不使用内置谓词的情况下检查给定值是否是 Prolog 中的数字number

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

我试图弄清楚这一点的原因是我有一个大学作业,其中明确规定不要使用任何内置谓词。

4

1 回答 1

5

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

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_chars/2或者您可能需要一些特定于实现的解决方案,例如atom_to_term/3然后应用上述解决方案之一。

于 2012-11-07T10:31:00.717 回答