Library lazyPCF.SubjRed.TypeThms



Require Import List.
Require Import syntax.
Require Import environments.
Require Import freevars.
Require Import utils.

Require Import typecheck.

Require Import mapsto.


Goal
(v x : vari) (r s t : ty) (H H1 : ty_env) (e : tm),
v = x
TC H1 e t
HF HM : ty_env,
H1 = HF ++ (v, r) :: HM ++ HTC (HF ++ (v, r) :: HM ++ (x, s) :: H) e t.

   simple induction 2; simpl in |- *; intros.
   apply TC_o.
   apply TC_ttt.
   apply TC_fff.
   apply TC_succ.
   apply H5; assumption.
   apply TC_prd.
   apply H5; assumption.
   apply TC_is_o.
   apply H5; assumption.
   apply TC_var.
   elim H0; apply Mp_eqExt.
   elim H5; assumption.
   apply TC_appl with s0.
   apply H5; assumption.
   apply H7; assumption.
   apply TC_abs.
   change (TC (((v0, s0) :: HF) ++ (v, r) :: HM ++ (x, s) :: H) e0 t0)
    in |- ×.
   apply H5; rewrite H6; simpl in |- *; reflexivity.
   apply TC_cond.
   apply H5; assumption.
   apply H7; assumption.
   apply H9; assumption.
   apply TC_fix.
   change (TC (((v0, t0) :: HF) ++ (v, r) :: HM ++ (x, s) :: H) e0 t0)
    in |- ×.
   apply H5; rewrite H6; simpl in |- *; reflexivity.
   apply TC_clos.
   apply H5; assumption.
   change (TC (((v0, s0) :: HF) ++ (v, r) :: HM ++ (x, s) :: H) e0 t0)
    in |- ×.
   apply H7; rewrite H8; simpl in |- *; reflexivity.
Save TEp_eqExt.


Goal
(v x : vari) (r s t : ty) (H H1 : ty_env) (e : tm),
v = x
TC H1 e t
HF HM : ty_env,
H1 = HF ++ (v, r) :: HM ++ (x, s) :: HTC (HF ++ (v, r) :: HM ++ H) e t.

   simple induction 2; intros.
   apply TC_o.
   apply TC_ttt.
   apply TC_fff.
   apply TC_succ; apply H5; assumption.
   apply TC_prd; apply H5; assumption.
   apply TC_is_o; apply H5; assumption.
   apply TC_var.
   apply Mp_inv_eqExt with x s; assumption || elim H5; assumption.
   apply TC_appl with s0.
   apply H5; assumption.
   apply H7; assumption.
   apply TC_abs.
   change (TC (((v0, s0) :: HF) ++ (v, r) :: HM ++ H) e0 t0) in |- ×.
   apply H5.
   simpl in |- *; elim H6; reflexivity.
   apply TC_cond.
   apply H5; assumption.
   apply H7; assumption.
   apply H9; assumption.
   apply TC_fix.
   change (TC (((v0, t0) :: HF) ++ (v, r) :: HM ++ H) e0 t0) in |- ×.
   apply H5.
   simpl in |- *; elim H6; reflexivity.
   apply TC_clos.
   apply H5; assumption.
   change (TC (((v0, s0) :: HF) ++ (v, r) :: HM ++ H) e0 t0) in |- ×.
   apply H7.
   simpl in |- *; elim H8; reflexivity.
Save TEp_inv_eqExt.



Goal
(H : ty_env) (e : tm) (t : ty) (x : vari) (s : ty),
TC H e t
¬ FV x e
H1 H2 : ty_env, H = H1 ++ H2TC (H1 ++ (x, s) :: H2) e t.

simple induction 1; simpl in |- *; intros.
apply TC_o.
apply TC_ttt.
apply TC_fff.
apply TC_succ.
apply H3; assumption || apply notFV_succ; assumption.
apply TC_prd.
apply H3; assumption || apply notFV_prd; assumption.
apply TC_is_o.
apply H3; assumption || apply notFV_is_o; assumption.
apply TC_var.
simpl in |- *; specialize notFV_var with (1 := H3); intro NQ.
apply Mp_nfvExt.
red in |- *; intro; apply NQ; symmetry in |- *; assumption.
elim H6; assumption.
apply TC_appl with s0.
apply H3; assumption || specialize notFV_appl with (1 := H6);
 simple induction 1; intros; assumption.
apply H5; assumption || specialize notFV_appl with (1 := H6);
 simple induction 1; intros; assumption.
apply TC_abs.
specialize (Xmidvar x v); simple induction 1.
intro xv; rewrite xv.
change (TC (nil ++ (v, s0) :: H5 ++ (v, s) :: H6) e0 t0) in |- ×.
apply TEp_eqExt with (nil ++ (v, s0) :: H5 ++ H6).
reflexivity.
simpl in |- *; elim H7; assumption.
reflexivity.
intro nxv.
change (TC (((v, s0) :: H5) ++ (x, s) :: H6) e0 t0) in |- ×.
apply H3.
specialize notFV_abs with (1 := H4).
simple induction 1; intro P.
absurd (x = v); assumption.
assumption.
rewrite H7; simpl in |- *; reflexivity.
apply TC_cond.
apply H3; assumption || red in |- *; intro; apply H8; apply FV_cond1;
 assumption.
apply H5; assumption || red in |- *; intro; apply H8; apply FV_cond2;
 assumption.
apply H7; assumption || red in |- *; intro; apply H8; apply FV_cond3;
 assumption.
apply TC_fix.
specialize (Xmidvar x v); simple induction 1.
intro xv; rewrite xv.
change (TC (nil ++ (v, t0) :: H5 ++ (v, s) :: H6) e0 t0) in |- ×.
apply TEp_eqExt with (nil ++ (v, t0) :: H5 ++ H6).
reflexivity.
simpl in |- *; elim H7; assumption.
reflexivity.
intro nxv.
change (TC (((v, t0) :: H5) ++ (x, s) :: H6) e0 t0) in |- ×.
apply H3.
specialize notFV_fix with (1 := H4).
simple induction 1; intro P.
absurd (x = v); assumption.
assumption.
rewrite H7; simpl in |- *; reflexivity.

apply TC_clos.
apply H3; assumption || red in |- *; intro; apply H6; apply FV_closa;
 assumption.
specialize (Xmidvar x v); simple induction 1.
intro xv; rewrite xv.
change (TC (nil ++ (v, s0) :: H7 ++ (v, s) :: H8) e0 t0) in |- ×.
apply TEp_eqExt with (nil ++ (v, s0) :: H7 ++ H8).
reflexivity.
simpl in |- *; elim H9; assumption.
reflexivity.
intro nxv.
change (TC (((v, s0) :: H7) ++ (x, s) :: H8) e0 t0) in |- ×.
apply H5.
specialize notFV_clos with (1 := H6).
simple induction 1; intro; simple induction 1; intro P.
absurd (x = v); assumption.
assumption.
rewrite H9; simpl in |- *; reflexivity.
Save TEp_nfvExt.


   Goal
(H1 H : ty_env) (e : tm) (t : ty) (x : vari) (s : ty),
TC H1 e t
HF : ty_env, H1 = HF ++ (x, s) :: H¬ FV x eTC (HF ++ H) e t.

   simple induction 1; intros.
   apply TC_o.
   apply TC_ttt.
   apply TC_fff.
   apply TC_succ; apply H4; assumption || red in |- *; intro; apply H6;
    apply FV_succ; assumption.
   apply TC_prd; apply H4; assumption || red in |- *; intro; apply H6;
    apply FV_prd; assumption.
   apply TC_is_o; apply H4; assumption || red in |- *; intro; apply H6;
    apply FV_is_o; assumption.
   apply TC_var.
   apply Mp_inv_nfvExt with x s.
   red in |- *; intro; apply H5; apply FV_var; symmetry in |- *; assumption.
   elim H4; assumption.
   apply TC_appl with s0.
   apply H4; assumption || red in |- *; intro; apply H8; apply FV_appl1;
    assumption.
   apply H6; assumption || red in |- *; intro; apply H8; apply FV_appl2;
    assumption.
   apply TC_abs.
   change (TC (((v, s0) :: HF) ++ H) e0 t0) in |- ×.
   specialize (Xmidvar v x); simple induction 1; intros.
   simpl in |- *; change (TC (nil ++ (v, s0) :: HF ++ H) e0 t0) in |- ×.
   apply TEp_inv_eqExt with x s (nil ++ (v, s0) :: HF ++ (x, s) :: H).
   assumption.
   elim H5; assumption.
   reflexivity.
   apply H4.
   simpl in |- *; elim H5; reflexivity.
   red in |- *; intro; apply H6; apply FV_abs; assumption || red in |- *;
    intro; apply H8; symmetry in |- *; assumption.
   apply TC_cond.
   apply H4; assumption || red in |- *; intro; apply H10; apply FV_cond1;
    assumption.
   apply H6; assumption || red in |- *; intro; apply H10; apply FV_cond2;
    assumption.
   apply H8; assumption || red in |- *; intro; apply H10; apply FV_cond3;
    assumption.
   apply TC_fix.
   specialize (Xmidvar v x); simple induction 1; intros.
   change (TC (nil ++ (v, t0) :: HF ++ H) e0 t0) in |- ×.
   apply TEp_inv_eqExt with x s (nil ++ (v, t0) :: HF ++ (x, s) :: H).
   assumption.
   elim H5; assumption.
   reflexivity.
   change (TC (((v, t0) :: HF) ++ H) e0 t0) in |- ×.
   apply H4.
   simpl in |- *; elim H5; reflexivity.
   red in |- *; intro; apply H6; apply FV_fix; assumption || red in |- *;
    intro; apply H8; symmetry in |- *; assumption.
   apply TC_clos.
   apply H4; assumption || red in |- *; intro; apply H8; apply FV_closa;
    assumption.
   specialize (Xmidvar x v); simple induction 1; intros.
   change (TC (nil ++ (v, s0) :: HF ++ H) e0 t0) in |- ×.
   apply TEp_inv_eqExt with x s (nil ++ (v, s0) :: HF ++ (x, s) :: H).
   symmetry in |- *; assumption.
   elim H7; assumption.
   reflexivity.
   change (TC (((v, s0) :: HF) ++ H) e0 t0) in |- ×.
   apply H6.
   simpl in |- *; elim H7; reflexivity.
   red in |- *; intro; apply H8; apply FV_closb; assumption.
Save TEp_inv_nfvExt.


Goal
v x : vari,
v x
(r s t : ty) (e : tm) (H1 HB : ty_env),
TC H1 e r
HF : ty_env,
H1 = HF ++ (x, s) :: (v, t) :: HBTC (HF ++ (v, t) :: (x, s) :: HB) e r.

   simple induction 2; simpl in |- *; intros.
   apply TC_o.
   apply TC_ttt.
   apply TC_fff.
   apply TC_succ; apply (H4 HF); assumption.
   apply TC_prd; apply (H4 HF); assumption.
   apply TC_is_o; apply (H4 HF); assumption.
   apply TC_var; apply Mp_swap.
   red in |- *; intro; apply H; symmetry in |- *; assumption.
   elim H4; assumption.
   apply TC_appl with s0.
   apply (H4 HF); assumption.
   apply H6; assumption.
   apply TC_abs.
   change (TC (((v0, s0) :: HF) ++ (v, t) :: (x, s) :: HB) e0 t0) in |- ×.
   apply (H4 ((v0, s0) :: HF)); simpl in |- ×.
   elim H5; reflexivity.
   apply TC_cond.
   apply (H4 HF); assumption.
   apply (H6 HF); assumption.
   apply (H8 HF); assumption.
   apply TC_fix.
   change (TC (((v0, t0) :: HF) ++ (v, t) :: (x, s) :: HB) e0 t0) in |- ×.
   apply (H4 ((v0, t0) :: HF)); simpl in |- ×.
   elim H5; reflexivity.
   apply TC_clos.
   apply (H4 HF); assumption.
   change (TC (((v0, s0) :: HF) ++ (v, t) :: (x, s) :: HB) e0 t0) in |- ×.
   apply (H6 ((v0, s0) :: HF)); simpl in |- ×.
   elim H7; reflexivity.
Save TEp_swap.