Term processing

## 4.9 Term processing

Apart from unification/matching, there are a number of generic built-in predicates that work on arbitrary data terms. The `=..` predicate converts structures into lists and vice versa:

>     ?- foo(a, b, c) =.. List.
>     List = [foo, a, b, c]
>     Yes (0.00s cpu)
>     ?- Struct =.. [foo, a, b, c].
>     Struct = foo(a, b, c)
>     Yes (0.00s cpu)

The arg/3 predicate extracts an argument from a structure:

>     ?- arg(2, foo(a, b, c), X).
>     X = b
>     Yes (0.00s cpu)

The functor/3 predicate extracts functor name and arity from a structured term, or, conversely, creates a structured term with a given functor name and arity:

>     ?- functor(foo(a, b, c), N, A).
>     N = foo
>     A = 3
>     Yes (0.00s cpu)
>     ?- functor(F, foo, 3).
>     F = foo(_1696, _1697, _1698)
>     Yes (0.00s cpu)

The term_variables/2 predicate extracts all variables from an arbitrarily complex term:

>     ?- term_variables(foo(X, 3, Y, X), Vars).
>     Vars = [Y, X]

The copy_term/2 predicate creates a copy of a term with fresh variables:

>     ?- copy_term(foo(3, X), Copy).
>     Copy = foo(3, _864)
>     Yes (0.00s cpu)