0

为了在一个简单的查询中运行一组查询,我标记了这些查询并使用forall/2它们来调用它们:

query_all :-
    forall(query(Q), (Q ->
        format('yes: ~w~n',[Q]) ;
        format('no : ~w~n',[Q]))).

所以如果我定义类似的东西query(true).,我就可以yes: true从输出中看到。

这里的问题是query( ... )并不总是存在,当 prolog 找不到任何标记的内容query时,forall/2将失败并导致异常说“error(existence_error(procedure,query/1),forall/2)”

我想处理这个异常,但不想破坏整个控制流。

我知道catch/3会帮助我,但我不知道如何使用它,我的代码是:

catch(query_all, error(existence_error(procedure,_),_), recovery).

recovery :-
    format('error occurred.~n',[]).

但序言说“不能重新定义本机代码过程 catch/3”。有什么我错过的吗?

4

1 回答 1

3

您可以query/1在代码中添加以下行声明为动态:

:-dynamic(query/1).

catch/3按照您的建议使用,但是您不必重新定义它,而是使用它,例如:

query_all :-
  catch(
    forall(query(Q), (Q ->
        format('yes: ~w~n',[Q]) ;
        format('no : ~w~n',[Q]))),
        error(existence_error(procedure, _), _), format('error occurred.~n', [])).
于 2013-01-25T13:48:53.320 回答