手动检查Prolog中的值是否为数字

时间:2012-11-07 00:52:39

标签: numbers prolog

如何检查给定值是否是Prolog中的数字,但不使用number等内置谓词?

我们说我有一个列表[a, 1, 2, 3]。我需要一种方法来检查此列表中的每个元素是否都是数字。困扰我的唯一问题是如何自行检查,而不使用number谓词。

我试图解决这个问题的原因是我已经完成了一项大学任务,并明确表示不会使用任何内置谓词。

1 个答案:

答案 0 :(得分:4)

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

1

最直接的将是:

maplist(number, L).

或者,递归地

allnumbers([]).
allnumbers([N|Ns]) :-
   number(N),
   allnumbers(Ns).

2

在评论中你说"该值是作为原子给出的#34;。这可能意味着你得到[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...目标。最近有很多这样的定义,你可以看一下this question

4

如果整个"值"作为原子给出,您将需要再次atom_chars/2或者您可能需要一些特定于实现的解决方案,如atom_to_term/3,然后应用上述解决方案之一。