Rank-1 (prenex) polymorphism
In a prenex polymorphic system, type variables may not be instantiated with polymorphic types. This is very similar to what is called "ML-style" or "Let-polymorphism" (technically ML's Let-polymorphism has a few other syntactic restrictions). This restriction makes the distinction between polymorphic and non-polymorphic types very important; thus in predicative systems polymorphic types are sometimes referred to as type schemas to distinguish them from ordinary (monomorphic) types, which are sometimes called monotypes. A consequence is that all types can be written in a form that places all quantifiers at the outermost (prenex) position. For example, consider the append function described above, which has type
forall a. [a] × [a] -> [a]
In order to apply this function to a pair of lists, a type must be substituted for the variable a in the type of the function such that the type of the arguments matches up with the resulting function type. In an impredicative system, the type being substituted may be any type whatsoever, including a type that is itself polymorphic; thus append can be applied to pairs of lists with elements of any type—even to lists of polymorphic functions such as append itself. Polymorphism in the language ML is predicative. This is because predicativity, together with other restrictions, makes the type system simple enough that full type inference is always possible.
As a practical example, OCaml (a descendant or dialect of ML) performs type inference and supports impredicative polymorphism, but in some cases when impredicative polymorphism is used, the system's type inference is incomplete unless some explicit type annotations are provided by the programmer.
In a predicative parametric polymorphic system, a type
τcontaining a type variable
αmay not be used in such a way that
αis instantiated to a polymorphic type. Predicative type theories include Martin-Löf Type Theory and NuPRL.
According to the highlighted sentences,
Are Rank-1 (prenex) polymorphism and Predicative polymorphism defined in the same way as "a type variable can't be instantiated to a polymoprhic type"?
In Rank-1 (prenex) polymorphism, how does "a type variable can't be instantiated to a polymoprhic type" imply "all types can be written in a form that places all quantifiers at the outermost (prenex) position"?