/ GENTLE PRIMER
/ Describing Data
Using Terms in Expressions and Patterns
When a Gentle program is executed, the actual values of term types
are always ground terms.
But in the text of a program we also use terms that contain variables as
subterms (i.e. as arguments of a functor).
In the extreme case the whole term may be just one variable name.
A variable serves as a placeholder.
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).