  Gradually typed languages are designed to support both dynamically typed and
statically typed programming styles while preserving the benefits of each.
While existing gradual type soundness theorems for these languages aim to show
that type-based reasoning is preserved when moving from the fully static
setting to a gradual one, these theorems do not imply that correctness of
type-based refactorings and optimizations is preserved. Establishing
correctness of program transformations is technically difficult, and is often
neglected in the metatheory of gradual languages.
  In this paper, we propose an axiomatic account of program equivalence in a
gradual cast calculus, which we formalize in a logic we call gradual type
theory (GTT). Based on Levy's call-by-push-value, GTT gives an axiomatic
account of both call-by-value and call-by-name gradual languages. We then prove
theorems that justify optimizations and refactorings in gradually typed
languages. For example, uniqueness principles for gradual type connectives show
that if the $\beta\eta$ laws hold for a connective, then casts between that
connective must be equivalent to the lazy cast semantics. Contrapositively,
this shows that eager cast semantics violates the extensionality of function
types. As another example, we show that gradual upcasts are pure and dually,
gradual downcasts are strict. We show the consistency and applicability of our
theory by proving that an implementation using the lazy cast semantics gives a
logical relations model of our type theory, where equivalence in GTT implies
contextual equivalence of the programs. Since GTT also axiomatizes the dynamic
gradual guarantee, our model also establishes this central theorem of gradual
typing. The model is parametrized by the implementation of the dynamic types,
and so gives a family of implementations that validate type-based optimization
and the gradual guarantee.
