§ Strong normalization of STLC
- Recall that in the category Hask, objects are types, morphisms are functions/expressions.
- Recall that in the category of contexts, objects are contexts, morphisms are substitutions.
- A local predicate L will relate to an object (type/context) a collection of morphisms (type → expressions of that type, typing context → substitutions of the variables of the typing context where the expressions have the type as per the context).
- Consider STLC with the typing rules:
------
Γ⊢():Unit
Γ ⊢ (f:A→B); Γ ⊢ (x:A)
----------------
Γ⊢ f@x:B
Γ,(a:A) ⊢ (body:B)
----------------
Γ ⊢ (λa.body:A→B)
- Define the logical prediate
Ltype: Type → Set(Expression)
, by induction on the rules:
--------------------------
() ∈ LType(Unit)
f ∈ LType(A→B); x∈LType(A)
--------------------------
f @ x ∈ LType(B)
body ∈ LType(B); (∀ aval∈ Ltype(A), body[a/aval] ∈ Ltype(B))
--------------------------
λa.body ∈ LType(A→B)
- It is clear that
x ∈ LType(T)
implies that x
is strongly normalizing. - When we try to prove that
Γ ⊢ x : T
implies x ∈ LType(T)
, we get stuck on the case of the lambda, because it's impossible to prove that a well typed term (λa.body):A→B
is such that upon substitution, body[a/aval]
will be strongly normalizing.
- So we control the context as well, and create another relatoin
LCtx(Γ)
. For a given context Γ: Var → Type
, we say that a substitution γ: Var → Expr
is in LCtx(Γ)
iff dom(γ) = dom(Γ)
, and that for all x∈ dom(Γ)
, that γ(x) : Γ(x)
and γ(x) ∈ LType(Γ(x))
. Maybe written with a little abuse of notation, this means that if (x:T)∈ Γ
, then γ(x):T
, and γ(x)∈ LType(T)
. That is, γ
is a set of assignments for the typing context Γ
where each assignment is strongly normalizing.