0

単純なクエリでクエリのグループを実行するために、これらのクエリにタグを付けて、forall/2それらを呼び出すために使用します。

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

のようなものを定義すると、出力query(true).から確認できます。yes: true

ここでの問題は、query( ... )が常に存在するとは限らないことです。プロローグがタグ付けされたものを見つけることができない場合queryforall/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 に答える