2013-01-25 1 views
0

, 나는 이러한 쿼리를 태그하고 전화를 forall/2를 사용했다 : 나는 query(true).처럼 뭔가를 정의하면, 내가 yes: true를 볼 수 있습니다gprolog에서 오류 처리가 발생 했습니까? 간단한 쿼리에서 쿼리 그룹을 실행하기 위해

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

을 너무 출력에서.

여기서 문제는 "(/ 2 FORALL, existence_error (절차, 질의/1)) 오류"query(...) 항상하지 프롤로그 말을 실패합니다 query, forall/2 태그 아무것도 원인 예외를 찾을 수 없을 때, 존재이다

이 예외를 처리하고 싶지만 전체 제어 흐름을 손상시키지는 않습니다.

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

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

하지만 프롤로그는 "네이티브 코드 절차 캐치/3 재정의 할 수 없습니다"라는 :

내가 catch/3 내게 도움이 될 알고 있지만 내가 그것을 사용하는 방법을 모른다, 내 코드입니다. 내가 놓친 것이 있습니까?

당신도 코드이 줄을 추가하는 query/1 동적 선언 할 수 있습니다

답변

3

: 그러나 당신이 그것을 다시 정의하는 대신 그것을 사용하지 않아도,

:-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', [])).