2014-12-18 2 views
1

Prolog 변수 Var이 Prolog 용어 Term에서 발생하면 성공하는 조건자인 occurs(Var, Term)을 쓰고 그렇지 않으면 실패합니다.Prolog에서 발생 확인

% occurs(Var, Term) 

?- occurs(X, f(X)). 
true. 

?- occurs(X, f(Y)). 
false. 

?- occurs(X, f(a,g(b,h(X,c),d))). 
true. 

나는 그런 일에 대해 생각했다하지만 난 가능하면 다른 해결책을 원한다 :

occurs(X,Y):- contains_term(X,Y). 
+0

실제로'contains_term/2'는 통일을 사용하기 때문에 올바르지 않습니다. 'contains_var/2'를 사용해야합니다. –

+0

* 다른 해결책 * 당신은 문제를 쉽게 만드는 기존의 Prolog 술어'contains_var/2'를 피하기를 원하십니까? * 다른 솔루션 *에 대한 귀하의 요구 사항은 무엇입니까? "길게"하고 싶다면'(= ..)/2'를 사용하여 재귀 규칙을 작성하십시오. – lurker

+0

비슷한 문제에 대한 [이 답변보기] (http://stackoverflow.com/q/27389177/772868) – false

답변

2

명확히 더 좋은 이름은 당신이 원하는 것을 조금

occurs_in(Var, Term) 

많은 방법이 될 것입니다 var_in_vars/2과 동일한 기술을 사용할 수 있습니다.

이것은 모든 ISO 규격 시스템에서 작동합니다. 매우 효율적일 수도 있습니다. 즉, (가장 좋은 경우에) Term의 크기와 독립적입니다.

occurs_in(Var, Term) :- 
    \+ subsumes_term(Var, Term). 

다음은 당신이 어떤 제약이없는만큼 좋다 : 당신이 contains_term/2 —를 사용하여 주장하는 경우

occurs_in(Var, Term) :- 
    \+ unify_with_occurs_check(Var, Term). 

를 (이름 term_subterm/2 훨씬 더 적절할 것) :

occurs_in(Var, Term) :- 
    once((contains_term(Term, Subterm), Var == Subterm)). 

또는 Prolog 미신을 고려하십시오.

occurs_in(Var, Term) :- 
    \+ \+ (contains_term(Term, Subterm), Var == Subterm).