Weakening


Weakening Lemma


Set Implicit Arguments.

Require Import Definitions.

Weakening states that typing is preserved in extended environments.
G1, G3 |- t: T
ok(G1, G2, G3)
――――――――――――――――――――
G1, G2, G3 |- t: T

and
G1, G3 |- d: D
ok(G1, G2, G3)
――――――――――――――――――――
G1, G2, G3 |- d: D

and
G1, G3 |- ds :: T
ok(G1, G2, G3)
――――――――――――――――――――
G1, G2, G3 |- ds :: T

and
G1, G3 |- T <: U
ok(G1, G2, G3)
――――――――――――――――――――
G1, G2, G3 |- T <: U

The proof is by mutual induction on term typing, definition typing, and subtyping.

Lemma weaken_rules:
  (∀ G t T,
      G ⊢ t : T →
      ∀ G1 G2 G3,
        G = G1 & G3 →
        ok (G1 & G2 & G3) →
        G1 & G2 & G3 ⊢ t : T) ∧
  (∀ x bs G d D,
      x; bs; G ⊢ d : D →
      ∀ G1 G2 G3,
        G = G1 & G3 →
        ok (G1 & G2 & G3) →
        x; bs; G1 & G2 & G3 ⊢ d : D) ∧
  (∀ x bs G ds T,
      x; bs; G ⊢ ds :: T →
      ∀ G1 G2 G3,
        G = G1 & G3 →
        ok (G1 & G2 & G3) →
        x; bs; G1 & G2 & G3 ⊢ ds :: T) ∧
  (∀ G T U,
      G ⊢ T <: U →
      ∀ G1 G2 G3,
        G = G1 & G3 →
        ok (G1 & G2 & G3) →
        G1 & G2 & G3 ⊢ T <: U).
Proof.
  apply rules_mutind; intros; subst;
  eauto 4 using binds_weaken;
  fresh_constructor; auto;
    match goal with
    | [ H: ∀ z, z \notin ?L → ∀ G, _,
        Hok: ok (?G1 & ?G2 & ?G3)
        |- context [?z ~ ?T] ] ⇒
      assert (zL : z \notin L) by auto;
      specialize (H z zL G1 G2 (G3 & z ~ T));
      rewrite? concat_assoc in H;
      apply~ H
    end.
Qed.

Ltac weaken_specialize :=
  intros;
  match goal with
  | [ Hok: ok (?G1 & ?G2) |- _ ] ⇒
    assert (G1 & G2 = G1 & G2 & empty) as EqG by rewrite~ concat_empty_r;
    rewrite EqG; apply~ weaken_rules;
    (rewrite concat_empty_r || rewrite <- EqG); assumption
  end.

Weakening lemma specialized to term typing.
Lemma weaken_ty_trm: ∀ G1 G2 t T,
    G1 ⊢ t : T →
    ok (G1 & G2) →
    G1 & G2 ⊢ t : T.
Proof.
  weaken_specialize.
Qed.

Weakening lemma specialized to subtyping.
Lemma weaken_subtyp: ∀ G1 G2 S U,
  G1 ⊢ S <: U →
  ok (G1 & G2) →
  G1 & G2 ⊢ S <: U.
Proof.
  weaken_specialize.
Qed.

Weakening lemma specialized to definition-typing
Lemma weaken_ty_defs: ∀ G1 G2 z bs ds T,
    z; bs; G1 ⊢ ds :: T →
    ok (G1 & G2) →
    z; bs; G1 & G2 ⊢ ds :: T.
Proof.
  weaken_specialize.
Qed.