Prolog判断列表是否仅含数字,现有代码返回false原因排查
问题原因
- 类型不匹配:你查询传入的列表元素是带单引号的字符原子(如
'1'),但你定义的digit谓词仅匹配数值类型的数字(如1),二者在Prolog中属于完全不同的术语,匹配直接失败。 - 缺失空列表边界处理:你没有定义空列表对应的
isDigit子句,当列表遍历到末尾为空时没有匹配规则,也会返回false。
修复方案
方案1:匹配字符型数字(适配你给出的查询示例)
直接修改digit谓词的匹配规则,同时补上空列表处理逻辑:
% 空列表判定为真 isDigit([]). % 递归遍历列表,每个元素都匹配digit规则 isDigit([X | Xs]) :- digit(X), isDigit(Xs). % 匹配字符型数字 digit('0'). digit('1'). digit('2'). digit('3'). digit('4'). digit('5'). digit('6'). digit('7'). digit('8'). digit('9').
测试调用?- isDigit(['1', '2', '3']).即可返回true。
方案2:匹配数值型数字
如果你的业务需求是判断数值类型的数字列表,不需要修改digit规则,仅需补全空列表处理,同时查询时去掉元素的单引号即可:
isDigit([]). isDigit([X | Xs]) :- digit(X), isDigit(Xs). digit(0). digit(1). digit(2). digit(3). digit(4). digit(5). digit(6). digit(7). digit(8). digit(9).
测试调用?- isDigit([1, 2, 3]).即可返回true。
内容的提问来源于stack exchange,提问作者Francesco Barbieri
相关产品推荐
相关产品推荐

