Every type constructor occurring in any type expression is declared.
Furthermore, the number of arguments to every type constructor has to
match the number of type variables the given on the left-hand side of the
declaration of that type constructor.

Type synonyms do not occur in type expressions of valid declarations.
Every type expression of a valid declaration is closed. A special case are
class methods. Their types have the class variable as the only free type
variable.

Checks a list of declarations against a given list of valid
declarations.
It returns a list of all declarations from the second argument which are
valid. Moreover, the result contains an error message for all those
declarations which are not valid.

The declarations given in the second argument may be based on those of the
first argument. For example, if the first argument contains a valid
declaration of a type "Foo" and if the second argument contains the
following declaration

This subset describes terms in which undefined values may occur
such as introduced by a fixpoint combinator or possibly failing
pattern matches (if not all cases are covered).
This excludes any term based on seq.