我想知道如何在 Prolog 中添加错误检查。例如,我有一个程序可以查找列表的长度:
listlen([],0).
listlen([_|T],N) :-
listlen(T,X),
N is X+1.
当它发生时,我如何打印出像“第一个参数必须是一个列表”这样的错误?
我想知道如何在 Prolog 中添加错误检查。例如,我有一个程序可以查找列表的长度:
listlen([],0).
listlen([_|T],N) :-
listlen(T,X),
N is X+1.
当它发生时,我如何打印出像“第一个参数必须是一个列表”这样的错误?
SWI-Prolog 具有符合 ISO 标准的异常处理,因此您实际上可以抛出标准中定义的错误。
?- throw(error(type_error(list, foo), context(foo/0, 'Must be a list'))).
ERROR: foo/0: Type error: `list' expected, found `foo' (an atom) (Must be a list)
这不仅难以输入/使用:它还依赖于实现。相反,您可以(并且应该)使用library(error),它提供了must_be/2
谓词(遗憾的是,如果您不知道自己在寻找什么,很难在 SWI-Prolog 网站上找到它):
?- must_be(list, [foo]).
true.
?- must_be(list, foo).
ERROR: Type error: `list' expected, found `foo' (an atom)
我假设支持异常处理的其他 Prolog 实现提供了非常相似的功能。