如何检查给定值是否是Prolog中的数字,但不使用number
等内置谓词?
我们说我有一个列表[a, 1, 2, 3]
。我需要一种方法来检查此列表中的每个元素是否都是数字。困扰我的唯一问题是如何自行检查,而不使用number
谓词。
我试图解决这个问题的原因是我已经完成了一项大学任务,并明确表示不会使用任何内置谓词。
答案 0 :(得分:4)
你需要一些内置的谓词来解决这个问题 - 除非你明确地枚举所有数字(这是不切实际的,因为它们中有无数个)。
最直接的将是:
maplist(number, L).
或者,递归地
allnumbers([]).
allnumbers([N|Ns]) :-
number(N),
allnumbers(Ns).
在评论中你说"该值是作为原子给出的#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
您可能希望编写语法而不是catch...
目标。最近有很多这样的定义,你可以看一下this question。
如果整个"值"作为原子给出,您将需要再次atom_chars/2
或者您可能需要一些特定于实现的解决方案,如atom_to_term/3
,然后应用上述解决方案之一。