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)