gprolog中的错误处理?

时间:2013-01-25 12:52:58

标签: prolog gnu-prolog

为了在简单查询中运行一组查询,我已标记这些查询并使用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将失败并导致异常说“错误(exists_error(过程) ,查询/ 1),forall的/ 2)“

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

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

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

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

但是prolog说“本机代码程序catch / 3不能重新定义”。 有没有我错过的东西?

1 个答案:

答案 0 :(得分: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', [])).