To avoid confusion, variables start with an upper-case letter, and functors start with a lower case letter.
Variables need not be declared. Nevertheless, they are strongly typed. The type is derived by the Gentle compiler, and the use of the variables is checked for consistency.
Depending on the context in which they are used, terms appear in two roles: as expressions and as patterns.
An expression is used to construct a term from given components.
If the variable Hd is of type Color and holds the value red, and if the variable Tl is of type ColorList and holds the value nil, the expression list(Hd, Tl) yields the value list(red, nil).
A value may be decomposed into constituents by matching the value against a pattern.
If the value list(red, nil) is matched against the pattern list(Hd, Tl) the variable Hd is defined as red, and the variable Tl as nil. The matching succeeds.
If the value nil is matched against the pattern list(Hd, Tl), the matching is said to fail.
Matching a pattern against a term means trying to find values for the variables inside the pattern: replacing the variables by these values makes the pattern equal to the term. For example, replacing Hd by red and Tl by nil turns the pattern list(Hd, Tl) into the term list(red, nil).