Availability:built-in

**functor**(

`?Term, ?Name, ?Arity`)

`Term`is a term with functor

`Name`/

`Arity`. If

`Term`is a variable it is unified with a new term whose arguments are all different variables (such a term is called a skeleton). If

`Term`is atomic,

`Arity`will be unified with the integer 0, and

`Name`will be unified with

`Term`. Raises

`instantiation_error()`

if `Term`is unbound and

`Name`/

`Arity`is insufficiently instantiated.

SWI-Prolog also supports terms with arity 0, as in `a()`

(see
section 5. Such terms
must be processed using
compound_name_arity/3.
The predicate functor/3
and =../2 raise a `domain_error`

when faced with these terms. Without this precaution, the inconsistency
demonstrated below could happen silently.^{102Raising
a domain error was suggested by Jeff Schultz.}

?- functor(a(), N, A). N = a, A = 0. ?- functor(T, a, 0). T = a.