To exploit the expressivity of being able to refer to the type of types, such
as for large elimination, dependent type systems will either employ a universe
hierarchy or else contend with an inconsistent type-in-type rule. However,
these are not be the only possible options. Taking inspiration from Stratified
System F, we introduce Stratified Type Theory (StraTT), where rather than
stratifying universes by levels, we stratify typing judgements and restrict the
domain of dependent function types to some fixed level strictly lower than that
of the overall type. Even in the presence of type-in-type, this restriction
suffices to enforce consistency of the system.
We explore the expressivity of several extensions atop this design. First,
the subsystem subStraTT employs McBride's crude-but-effective stratification
(also known as displacement) as a simple form of level polymorphism where
top-level definitions can be displaced uniformly to any higher level as needed,
which is valid due to level cumulativity and plays well with stratified
judgements. Second, to recover some expressivity lost due to the restriction on
dependent function domains, the full StraTT system includes a separate
nondependent function type with floating domains, whose level instead matches
that of the overall type. Finally, we have implemented a prototype type checker
for StraTT extended with datatypes along with a small type checked core
library.
While it's possible to show that the subsystem is consistent, showing
consistency for the full system with floating nondependent functions remains
open. Nevertheless, we believe that the full system is also consistent and have
mechanized a syntactic proof of subject reduction. Furthermore, we use our
implementation to investigate various well-known type-theoretic type-in-type
paradoxes. These examples all fail to type check in expected ways as evidence
towards consistency.Comment: 14 pages, 3 figures, submitted to CPP 202