# Difference between copy_term/2 and functor/3

While working on a directive to allow iterating through succeeding depths of recursion for an arbitrary predicate (even if the predicate does not terminate in normal prolog), it was pointed out that I should use `functor/3` instead of `copy_term/2` to obtain a most generic term.

What is the difference between these two if the argument of the compound terms is not instantiated?

``````34 ?- copy_term(myterm(T),NewTerm1).
NewTerm1 = myterm(_1194).

35 ?- functor(NewTerm2,myterm,1).
NewTerm2 = myterm(_1104).
``````

In my code it turns out the term generated by `functor/3` is more generic, than the one produced by `copy_term/2` as Jan pointed out.

I can’t grasp why the difference, if T is not instantiated.

EDIT: I understand `copy_term/2` shares ground terms and `functor/3` does not (of course), but here we’re dealing with an argument which is not instantiated.

I see. In your code the term that you copy is the most general term, so your copy will be most general too.

Probably using functor/3 is faster though. copy_term/2 has to do a lot of work to figure out variable sharing, subtem sharing, cycles and ground terms. functor/3 simply allocates a term and fills it with variables.

In my original code I was doing something like this:

``````   functor(Head,Pred,Arity),
% ...some code here...
(
% We need to run iterate_depth_/4 only
% one time, on entry. Recursive calls
% need to be done normally (as if they
% were not wrapped)
prolog_current_frame(F),
prolog_frame_attribute(F,parent,P),
But this worked erratically until I changed it to `functor/3` like you suggested.
Thanks for this, I was using `copy_term/2` because I wrongly thought it would be faster.
I’ll keep using `functor/3`.