2012-02-03 2 views
2

C++ dll에서 SWI Prolog 엔진을 호출 중이며 모든 명시/동적 조건부에 액세스 할 수 있기를 원합니다 (일반적으로 나열되는 것과 유사 함).SWI Prolog에서 동적 조건부 통합하기

GNU Prolog에서 나는 변수로 1/1 술어를 호출 할 것이고 Prolog는 모든 동적 술어 표시기로 그것을 통합 할 것이다. 다음 단계에서는이 술어를 변수로 호출하여 완전한 목록을 얻습니다.

SWI 프롤로그에서 불행히도 그럴 수 없습니다 (오류 : 인수가 충분히 인스턴스화되지 않았습니다). 다른 방법이 있습니까?

get_dynamic_predicates(M, H, B, R) :- 
    current_predicate(_, P), 
    strip_module(P, M, H), 
    predicate_property(P, dynamic), 
    \+ predicate_property(P, built_in), 
    \+ predicate_property(P, imported_from(_)), 
    clause(P, B, R). 

를이 몸 B와 절 참조 R와 모듈 M에 머리 H와 술어의 인스턴스를 바인딩 백 트럭 호출 : 단지 예를 들어, 자신의 롤하지 왜

답변

2

. 검색하려는 모든 것이 동적 술어의 이름이라면, 이것을 호출하여 H 또는 그 펑터에 대한 모든 바인딩 세트를 검색 할 수 있습니다.

원하는대로 (또는 더 나은 방법으로 인수로 전달) 조건 자 속성을 수정하십시오. 위 정의는 모든 사용자 정의 동적 조건자를 검색합니다. 이는 내가 추측하고있는 것입니다.

+0

감사합니다. 내 최신 생각이 같은 것을 사용했다 : myIndicators (이름, 인수에 대응) : - predicate_property (동적 헤드), \ + predicate_property (헤드, BUILT_IN), 펑 (헤드, 이름, 인수에 대응을). – aLu

+0

그건 내가 여기서 제안한 것과 아주 비슷합니다. 유일한 차이점은 다른 모듈에서 선언 된 동적 조건자가 발견되었음을 확인하는 것이 었습니다. 여러 개의 모듈을 사용하고 있지 않다면, 당신이 제안한 것은 괜찮아 보입니다! – sharky

관련 문제