Study Music. Click to play or pause. After it starts, press the Space Bar to play or pause. If enabled, it will resume across pages.

A Proof Strategy Guide for Logic and Foundations: Starting with Type Theory

Type theory is often introduced as a catalogue of formalisms: simply typed \lambda calculus, dependent types, universes, inductive families. The fastest route to competence is different. Treat type theory as a discipline of proof engineering in which every statement is a judgment, every proof is a derivation tree, and the core lemmas are about how derivations behave under context change and substitution. Once that posture is stable, the sophisticated layers become variations on a small set of moves.

This guide builds that posture. It focuses on the proof habits that reliably work across systems: structural induction on derivations, explicit invariants for contexts, substitution as the central engine, and the progress and preservation template as a stress test for any design.

Value WiFi 7 Router
Tri-Band Gaming Router

TP-Link Tri-Band BE11000 Wi-Fi 7 Gaming Router Archer GE650

TP-Link • Archer GE650 • Gaming Router
TP-Link Tri-Band BE11000 Wi-Fi 7 Gaming Router Archer GE650
A nice middle ground for buyers who want WiFi 7 gaming features without flagship pricing

A gaming-router recommendation that fits comparison posts aimed at buyers who want WiFi 7, multi-gig ports, and dedicated gaming features at a lower price than flagship models.

$299.99
Was $329.99
Save 9%
Price checked: 2026-03-23 18:31. Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply to the purchase of this product.
  • Tri-band BE11000 WiFi 7
  • 320MHz support
  • 2 x 5G plus 3 x 2.5G ports
  • Dedicated gaming tools
  • RGB gaming design
View TP-Link Router on Amazon
Check Amazon for the live price, stock status, and any service or software details tied to the current listing.

Why it stands out

  • More approachable price tier
  • Strong gaming-focused networking pitch
  • Useful comparison option next to premium routers

Things to know

  • Not as extreme as flagship router options
  • Software preferences vary by buyer
See Amazon for current availability
As an Amazon Associate I earn from qualifying purchases.

The basic objects are judgments, not propositions

In many courses, propositions come first and judgments are treated as notation. In type theory, judgments are primary. A judgment is something like:

  • A context is well formed: `Γ ⊢`
  • A type is well formed in a context: `Γ ⊢ A : Type`
  • A term has a type: `Γ ⊢ t : A`
  • Two terms are definitionally equal: `Γ ⊢ t ≡ u : A`

The inference rules of the theory determine which judgments can be derived. Proofs are derivations, and derivations are trees built from rules. That viewpoint prevents a common mistake: arguing semantically when the goal is syntactic, or vice versa. When a claim is about derivations, the right tool is induction on the derivation tree.

A practical habit is to keep a clear boundary between:

  • Derivable judgments, proved by rule applications
  • Meta level statements about derivations, proved by induction and lemmas
  • Semantic statements about models, proved by interpretation

Most of the day to day work in type theory lives in the second bullet.

Contexts are structured data, not sets of assumptions

A context is not merely a collection of assumptions. It is ordered, it carries variable bindings, and the rules constrain which extensions are legal. For the simply typed \lambda calculus, a context looks like `x:A, y:B, z:C`. For dependent types, later bindings may depend on earlier ones.

Because contexts are structured, the meta lemmas are structured too. You rarely prove an isolated theorem about typing without also proving companion facts about weakening, exchange, and substitution.

A compact way to keep the structure visible is to use a context discipline that makes dependencies explicit. For dependent types, one typically writes:

  • `Γ, x:A ⊢` means `Γ ⊢ A : Type` and then `x` may be used later
  • If a later type mentions `x`, that dependency is part of the well formedness proof

The payoff is that substitution becomes predictable rather than mysterious.

The substitution lemma is the central engine

Substitution is the theorem that makes type theory behave like a calculus rather than a collection of ad hoc rules. In its simplest form, it says:

If `Γ, x:A, Δ ⊢ t : B` and `Γ ⊢ s : A`, then `Γ, Δ[s/x] ⊢ t[s/x] : B[s/x]`.

The statement is a mouthful because it is accurate. It tracks both term substitution in terms and type substitution in types, and it tracks how substitution transforms the trailing context `Δ`.

The proof is also the template for many other proofs: induction on the derivation of `Γ, x:A, Δ ⊢ t : B`. Each rule case shows how to push substitution through that rule.

A reliable workflow is:

  • Write the lemma with all dependencies visible, including how contexts are transformed
  • Prove auxiliary lemmas you will need inside the induction, especially about well formedness
  • In each rule case, decide whether substitution acts on the rule premises, the conclusion, or both
  • Use the induction hypothesis to rewrite the premises after substitution
  • Rebuild the derivation with the same rule

For many systems, substitution is the only proof that takes time. Once it is done, a large fraction of later theorems become corollaries.

Weakening is the second pillar

Weakening says that adding unused assumptions does not break derivability. In a simple statement:

If `Γ ⊢ t : A` and `Γ ⊆ Γ'` by well formed extension, then `Γ' ⊢ t : A`.

There are different formulations depending on how you represent contexts. The proof is usually induction on the typing derivation, with careful attention to the variable rule.

Weakening and substitution form a pair:

  • Weakening lets you move to larger contexts
  • Substitution lets you eliminate variables by replacing them with terms

Together they let you refactor derivations without changing the underlying term.

A worked example: typing and preservation in the simply typed \lambda calculus

To make these proof moves concrete, consider the simply typed \lambda calculus with:

  • Types: `A, B ::= ι | A → B` where `ι` is a base type
  • Terms: `t, u ::= x | λx:A. t | t u`
  • Values: `v ::= λx:A. t`

Typing rules include:

  • Variable: if `x:A ∈ Γ` then `Γ ⊢ x : A`
  • Abstraction: if `Γ, x:A ⊢ t : B` then `Γ ⊢ λx:A. t : A → B`
  • Application: if `Γ ⊢ t : A → B` and `Γ ⊢ u : A` then `Γ ⊢ t u : B`

Operational semantics includes \beta reduction:

  • `(λx:A. t) v → t[v/x]` when `v` is a value

Preservation, the fact that reduction respects types, is:

If `Γ ⊢ t : A` and `t → t'`, then `Γ ⊢ t' : A`.

A clean preservation proof follows a stable shape:

  • Induct on the derivation of `Γ ⊢ t : A`
  • Analyze the reduction step `t → t'` by cases
  • In the application case, the only interesting subcase is \beta reduction
  • Beta reduction forces you to use substitution

In the \beta case, typing has the form:

  • `Γ ⊢ (λx:A0. t0) v : B0`
  • So `Γ ⊢ λx:A0. t0 : A0 → B0` and `Γ ⊢ v : A0`
  • From typing of abstraction, `Γ, x:A0 ⊢ t0 : B0`
  • Apply substitution to obtain `Γ ⊢ t0[v/x] : B0`
  • This is the required type for the reduced term

The only nontrivial lemma used is substitution. Everything else is bookkeeping.

A similar pattern appears in far more expressive systems, where reduction may include unfolding definitions, evaluating eliminators, or computing on inductive data. Preservation remains a repeated test of whether substitution and definitional equality are correctly designed.

How to choose the right induction parameter

Many beginners attempt induction on term structure and get stuck. Induction on terms is sometimes appropriate, but typing derivations contain information that term structure alone does not capture. For example, a term `x` can have many different types in different contexts, and the typing derivation records the relevant type.

A practical rule is:

  • If the claim is about typing, induct on the typing derivation
  • If the claim is about reduction, induct on the reduction derivation
  • If the claim is about normal forms or canonical forms, use induction on types, sometimes nested with induction on derivations

When multiple derivations are involved, pick the one with the most informative rule cases, and then use the other as a parameter within each case.

Canonical forms and progress

Progress says that a closed well typed term is either a value or can take a reduction step. In the simply typed \lambda calculus, it is:

If `∅ ⊢ t : A` then either `t` is a value or there exists `t'` with `t → t'`.

Progress requires a lemma about canonical forms:

  • If `∅ ⊢ v : A → B` and `v` is a value, then `v` is an abstraction `λx:A. t`

The proof uses the fact that the only value form is abstraction. In richer systems, canonical forms become structural lemmas that say what values of a given type must look like. The proof strategy is typically induction on the typing derivation of the value, or on the type, depending on the system.

The progress and preservation pair is more than a safety theorem. It is a debugging tool. When designing a type system, if progress fails, you learn that your typing permits stuck terms. If preservation fails, you learn that your operational rules compute in a way not aligned with typing. The pair quickly exposes mismatches between syntax, computation, and typing.

Definitional equality is where many systems become subtle

In dependent type theory, definitional equality is part of typing. A term may type check because two types are definitionally equal after computation. This changes how proofs are structured:

  • Many lemmas must be stated up to definitional equality
  • Substitution must respect definitional equality
  • Normalization or canonicity results become important for metatheory

A useful practice is to separate:

  • Definitional equality, a built in judgment used by the type checker
  • Propositional equality, a type whose inhabitants are explicit proofs

Once separated, you can reason about which equalities are computational and which are proof relevant.

When a proof unexpectedly grows, it often means you are using definitional equality where propositional equality would be more stable, or the other way around. The remedy is rarely to add more cleverness. It is usually to adjust which equalities are implicit and which are explicit.

A table of core lemmas and what they buy

| Lemma | Informal meaning | Typical proof method | What it enables |

|—|—|—|—|

| Weakening | you may extend a context | induction on derivation | reuse derivations under extra assumptions |

| Substitution | you may replace a variable by a term | induction on derivation | preservation, \beta soundness, dependent instantiation |

| Exchange | you may permute independent bindings | derivation transform | reordering contexts, structural rules |

| Strengthening | unused bindings can be removed | admissibility argument | minimal contexts, proof compression |

| Canonical forms | values of a type have a specific shape | derivation analysis | progress, canonicity |

| Subject reduction | types are preserved by computation | induction on typing | safety, definitional equality sanity |

In most systems, everything else is decoration on these ideas.

Proof ergonomics: make invariants visible early

Proof failures in type theory are usually failures of hidden invariants. The antidote is to state the invariant as part of the theorem statement.

Examples of invariants that should be explicit:

  • The context is well formed and each type in it is well formed in the preceding context
  • The term is well scoped with respect to the context
  • Definitional equality respects substitution and weakening

When these are explicit, induction hypotheses become usable instead of fragile.

A practical style is to use short well formedness side conditions in the main lemmas and to keep separate lemmas that establish well formedness of derived types. This prevents proofs from bloating with repeated checks.

Extending the method: dependent types and inductive definitions

The same proof patterns scale. For dependent types, substitution becomes more involved because types depend on terms. For inductive definitions, one adds computation rules for eliminators and proves that the computation rules preserve typing.

A good litmus test is to attempt a progress and preservation argument for a small fragment of your theory. For example:

  • A dependent function type with application
  • A dependent pair type with projections
  • A natural number type with primitive recursion

Each fragment forces you to prove exactly the lemmas you will need for the whole system, and it reveals whether definitional equality is aligned with computation.

If the fragment proof is smooth, the full metatheory will be manageable. If the fragment proof is painful, the system design likely needs adjustment.

Closing perspective

Type theory becomes far less intimidating when you see that most proofs are about moving derivations through structural transformations. The high level concepts matter, but the daily work is craft. Learn the craft first.

The most transferable habit is this: when you read a new type theory, hunt for its substitution lemma, its weakening lemma, and its definitional equality rules. Those three pieces determine the shape of everything that follows. Once you can prove them or at least understand their proof skeleton, you can handle the rest of the system with confidence.

Books by Drew Higgins

Explore this field
Logic and Foundations
Library Logic and Foundations
Mathematics
Algebra
Analysis and Partial Differential Equations
Category Theory
Combinatorics
Dynamical Systems
Geometry
Mathematical Physics
Number Theory
Numerical Analysis

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *