A better name which clarifies a bit what you want would be
occurs_in(Var, Term)
Many approaches can use the same techniques as for var_in_vars/2.
This works in any ISO conforming system. It could be quite efficient, too ; that is, being (in the best case) independent of the size of Term.
occurs_in(Var, Term) :-
\+ subsumes_term(Var, Term).
The next is good as long as you do not have any constraints:
occurs_in(Var, Term) :-
\+ unify_with_occurs_check(Var, Term).
If you insist on using contains_term/2 — (the name term_subterm/2 would be much more appropriate):
occurs_in(Var, Term) :-
once( ( contains_term(Term, Subterm), Var == Subterm ) ).
Or, to take into account Prolog superstitions:
occurs_in(Var, Term) :-
\+ \+ ( contains_term(Term, Subterm), Var == Subterm ).
contains_term/2is not correct because it uses unification. You should usecontains_var/2. - Tudor Berariucontains_var/2that makes the problem easy? What's your requirement for another solution? If you want to do it "the long way" you would write a recursive rule using(=..)/2. - lurker