単純なクエリでクエリのグループを実行するために、これらのクエリにタグを付けて、forall/2
それらを呼び出すために使用します。
query_all :-
forall(query(Q), (Q ->
format('yes: ~w~n',[Q]) ;
format('no : ~w~n',[Q]))).
のようなものを定義すると、出力query(true).
から確認できます。yes: true
ここでの問題は、query( ... )
が常に存在するとは限らないことです。プロローグがタグ付けされたものを見つけることができない場合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 は再定義できません」と言っています。見逃したものはありますか?