2010-04-26 5 views
3

이것은 아마도 매우 어리석은 질문 일 것입니다. (나는 단지 몇 시간 전에 Prolog를 배우기 시작했습니다.)하지만 원자와 관련된 모든 절을 찾는 것이 가능합니까?원자와 관련된 모든 절 찾기

cat(tom). 
animal(X) :- cat(X). 

, 톰에 대한 모든 가능한 정보를 얻을 수있는 방법이 (또는 적어도 명시 적으로 기본에 명시되어 모든 사실) : 예를 들어, 다음과 같은 지식 기반을 가정? 나는이 같은 쿼리를 할 수없는 것을 이해 : 나는 그런

같은 쿼리를 쓸 수 있도록

meta(Object, Predicate) :- 
    Goal =.. [Predicate, Object], 
    call(Goal). 

:

?- Pred(tom). 

그래서 내가 올바른 정보를 추론 할 규칙을 쓸 수 있다고 생각
?- meta(tom, Predicate). 

그러나 call에 대한 인수가 충분히 인스턴스화되지 않았기 때문에 이는 작동하지 않습니다. 그래서 기본적으로 제 질문은 가능합니다. 아니면 이런 종류의 정보를 제공하도록 설계되지 않은 Prolog입니까? 그리고 가능하지 않다면, 왜?

답변

1

ISO 조건부 "current_predicate/1"을 사용하여 호출 할 수있는 항목을 찾을 수 있습니다. 다음과 같이

current_predicate
을 사용할 수 있습니다, 일반적으로

 
| ?- info(tom,X). 
X = animal(tom) ? ; 
X = cat(tom) ? ; 
no 
| ?- all_info(tom,X). 
X = [animal(tom),cat(tom)] ? 
yes 

: 다음과 같이

 
cat(tom). 
animal(X) :- cat(X). 

info(Arg,Info) :- current_predicate(PredName/1), 
    Info =.. [PredName,Arg], call(Info). 
all_info(Arg,L) :- findall(I,info(Arg,I),L). 

당신은 (내가 BTW SICStus 프롤로그를 사용하고 있습니다) 프로그램을 사용할 수 있습니다 : 여기 은 샘플 프로그램입니다

 
| ?- current_predicate(X). 
X = info/2 ? ; 
X = animal/1 ? ; 
X = cat/1 ? ; 
X = all_info/2 ? ; 
no 
+0

이것은 매우 흥미 롭습니다! 그러나 KB에서 모든 가능한 조건에 대해 매개 변수를 테스트해야한다는 것이 슬프다. 언어에 기능이 포함되어있는 경우보다 효율적으로이를 수행 할 수있는 방법이 있다고 가정합니다. 내가 제안한 솔루션에 대한 또 다른 문제점은 내 프롤로그 엔진 (SWI-Prolog)이 current_predicate/1의 결과 집합에 모든 미리 정의 된 조건부 (예 : atomic/1, functor/3 등)를 포함한다는 것입니다. 문맥 오류; 내가 그걸 막을 수있는 방법에 대한 충고가 있니? 그럼에도 불구하고 통찰력있는 대답에 대해 감사드립니다. –

+0

이전 글에 관해서, 필자는 앞서 설명한 문제점을 해결하는 데 도움이 될 수있는 predicate_property/2를 발견했습니다. –