Terms can be constructed using functions from the PL_put_*() 
and
PL_cons_*() families. This approach builds the term‘inside-out’, 
starting at the leaves and subsequently creating compound terms. 
Alternatively, terms may be created‘top-down’, first 
creating a compound holding only variables and subsequently unifying the 
arguments. This section discusses functions for the first approach. This 
approach is generally used for creating arguments for PL_call() 
and
PL_open_query().
true or false in the term 
reference See also PL_put_atom(), PL_unify_bool() 
and PL_get_bool().char* with 
various encodings. The flags argument is a bitwise or 
specifying the Prolog target type and the encoding of chars. 
A Prolog type is one of PL_ATOM, PL_STRING,
PL_CODE_LIST or PL_CHAR_LIST. A representation 
is one of
REP_ISO_LATIN_1, REP_UTF8 or REP_MB. 
See
PL_get_chars() 
for a definition of the representation types. If
len is -1 chars must be 
zero-terminated and the length is computed from chars using strlen().Put a string, represented by a length/start pointer pair in the term reference. The data will be copied. This interface can deal with 0-bytes in the string. See also section 12.4.24.
uint64_t values with the highest 
bit set to 1. Without unbounded integer support, too large values raise 
a
representation_error exception.PL_unify_*() functions or use PL_cons_functor()../2[|]/2TRUE. Note that in classical Prolog systems or in 
SWI-Prolog using the option --traditional, this is the 
same as
PL_put_atom_chars("[]"). 
See section 5.1.term_t objects as the arity of 
the functor. To create the term animal(gnu, 50), use:
{ term_t a1 = PL_new_term_ref();
  term_t a2 = PL_new_term_ref();
  term_t t  = PL_new_term_ref();
  functor_t animal2;
  /* animal2 is a constant that may be bound to a global
     variable and re-used
  */
  animal2 = PL_new_functor(PL_new_atom("animal"), 2);
  PL_put_atom_chars(a1, "gnu");
  PL_put_integer(a2, 50);
  PL_cons_functor(t, animal2, a1, a2);
}
After this sequence, the term references a1 and a2 may be used for other purposes.
char **. The 
list is built tail-to-head. The PL_unify_*() functions can 
be used instead to build a list head-to-tail.
void
put_list(term_t l, int n, char **words)
{ term_t a = PL_new_term_ref();
  PL_put_nil(l);
  while( --n >= 0 )
  { PL_put_atom_chars(a, words[n]);
    PL_cons_list(l, a, l);
  }
}
0 to leave the tag unbound. The keys 
vector is a vector of atoms of at least len long. The values 
is a term vector allocated using PL_new_term_refs() 
of at least len long. This function returns TRUE 
on success, FALSE on a resource error (leaving a resource 
error exception in the environment),
-1 if some key or the tag is invalid and -2 
if there are duplicate keys.