I'm studying programming language semantics and papers like these are quite valuable in understanding type systems of real languages, see also Featherweight Java[0] and Featherweight Go[1]. At first it looks like a lot to take in, but when you start with far simpler type systems like typed arithmetic expressions and simply-typed lambda calculus, you see the same definitions and metatheorems (properties about the type system) appear over and over again (including in this paper). In particular, the pieces you see repeated are:<p>- the terms and types of the language<p>- the values (a subset of terms)<p>- the evaluation relation, telling you how you go from one term to the next<p>- the typing relation, telling you how you build well-typed terms and what their types are<p>- <i>Progress</i> states that if you have a well-typed term, it either is a value <i>or</i> it can take one step of evaluation<p>- <i>Preservation</i> states you that if you have a well-typed term of type T and it takes a step of evaluation, the resulting term still has type T<p>And we have the slogan, safety = progress + preservation.<p>I should also note that past a certain level of complexity of type system, you definitely would want to use a theorem prover such as Coq to formally verify and automate easy cases. The proofs themselves are actually quite boring (which is a good thing!).<p>[0] <a href="https://www.cis.upenn.edu/~bcpierce/papers/fj-toplas.pdf" rel="nofollow">https://www.cis.upenn.edu/~bcpierce/papers/fj-toplas.pdf</a><p>[1] <a href="https://arxiv.org/pdf/2005.11710.pdf" rel="nofollow">https://arxiv.org/pdf/2005.11710.pdf</a>