6

我想知道如何在 Prolog 中添加错误检查。例如,我有一个程序可以查找列表的长度:

listlen([],0). 
listlen([_|T],N) :-
   listlen(T,X),
   N is X+1.

当它发生时,我如何打印出像“第一个参数必须是一个列表”这样的错误?

4

1 回答 1

3

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 实现提供了非常相似的功能。

于 2015-11-13T09:04:11.360 回答