If (S,e) : τ, then either e is a value or (S,e) -> (S',e).
Note, this doesn't work right off the bat, because we can't really induct on the thing we want. So we "explode" the lemma based on the one rule for (S,e):&tau:
[Σ]S:Σ [Σ]e:τ
--------------------- t-state
(S,e) : τ
If [Σ]S:Σ and [Σ]e:τ, then either e is a value or (S,e) -> (S',e).
Now we can proceed by induction over the derivation of [Σ]e:τ. we'll do two representative cases of the old proof, it really doesn't change at all.
Case t-lam (e = λx:τ1.e, and τ = τ2)
x:τ1 |- [Σ]e:τ2
----------------------- t-lam
[&Sigma](λx:τ1.e) : τ1 -> τ2
Proof is immediate, λx:τ1.e is a value by rule.
Case t-app (e = e1(e2))
[Σ]e1:τ' -> τ
[Σ]e2:τ'
----------------------- t-app
[&Sigma] e1(e2) : τ
By the induction hypothesis, either e1 steps or is a value
Subcase (S,e1) -> (S',e'1) - we are done, because (S,e1(e2)) -> (S',e'1(e2)) by rule.
Subcase e1 value - by the induction hypothesis, either e2 steps or is a value.
Sub-subcase (S,e2) -> (S',e'2) - we are done, because (S,e1(e2)) -> (S',e1(e'2)) by rule.
Sub-subcase e2 value - by canonical forms
on the facts [Σ]e1:τ' -> τ and
e1 value, we know e1 = λx:τ.e0.
We know (S,(λx:τ.e0)(e2)) -> (S,[e2/x]e0), by rule (because e2 value) so we are done.
If [Σ1]S : Σ2 and l is in the domain of Σ, then l is in the domain of S.
Case (e = l, τ = τ' ref)
Σ(l) = τ'
-------------------------------------- t-loc
[Σ]l : τ' ref
We are done: l value by rule.
Case (e = ref e', τ = τ' ref)
[Σ]e' : τ'
-------------------------------------- t-ref
[Σ]ref e' : τ' ref
By the induction hypothesis, e' steps or is a value
Subcase (S,e') -> (S',e") - we are done, because (S,ref e') -> (S',ref e") by rule.
Subcase e' value - we are done, because we can come with l fresh and then (S, ref e') -> ((S,l=e'), l) by rule.
Note: this doesn't really follow the pattern of previous cases, because we reduced the subterm to a value but didn't rely on canonical forms.
If
If [Σ1] S : Σ2 and Σ' extends Σ1, then Γ |- [Σ'] S : Σ2.
This proof is pretty boring, the interesting cases are the variable rule t-var or t-assume and the location typing case t-loc. Monotonicity is one of these "big lemmas" like inversion or canonical forms, but it only shows up when our state is more interesting than just a single expression e
Case e-appabs (e = λx:τ1.e1)e2, and e' = [e2/x]e1)
e2 value
-------------------------------------- e-appabs
(S, (λx:τ.e1)e2) -> (S, [e2/x]e1)
By assumption, [Σ](λx:τ.e1)e2 : τ.