Qcert.NNRC.Typing.TcNNRCShadow


Section TcNNRCShadow.




  Context {m:basic_model}.

  Lemma nnrc_type_remove_duplicate_env l v x l' x' l'' e τ:
    nnrc_type (l ++ (v,x)::l' ++ (v,x')::l'') e τ
    nnrc_type (l ++ (v,x)::l' ++ l'') e τ.

 Lemma nnrc_type_remove_free_env l v x l' e τ :
          ¬ In v (nnrc_free_vars e)
          (nnrc_type (l ++ (v,x)::l') e τ nnrc_type (l ++ l') e τ).

  Lemma nnrc_type_swap_neq l1 v1 x1 v2 x2 l2 e τ :
    v1 v2
    (nnrc_type (l1++(v1,x1)::(v2,x2)::l2) e τ
     nnrc_type (l1++(v2,x2)::(v1,x1)::l2) e τ).

  Lemma nnrc_type_cons_subst e Γ v τ v' τ :
    ¬ (In v' (nnrc_free_vars e))
    ¬ (In v' (nnrc_bound_vars e))
    (nnrc_type ((v',τ)::Γ) (nnrc_subst e v (NNRCVar v')) τ
     nnrc_type ((v,τ)::Γ) e τ).

  Lemma nnrc_type_cons_subst_disjoint e e' Γ v τ τ :
    disjoint (nnrc_bound_vars e) (nnrc_free_vars e')
         nnrc_type Γ e' τ
         nnrc_type ((v,τ)::Γ) e τ
         nnrc_type Γ (nnrc_subst e v e') τ.

  Lemma nnrc_type_rename_pick_subst sep renamer avoid e Γ v τ τ :
         (nnrc_type ((nnrc_pick_name sep renamer avoid v e,τ)::Γ) (nnrc_rename_lazy e v (nnrc_pick_name sep renamer avoid v e)) τ
         nnrc_type ((v,τ)::Γ) e τ).

  Theorem unshadow_type sep renamer avoid Γ n τ :
    nnrc_type Γ n τ nnrc_type Γ (unshadow sep renamer avoid n) τ.

End TcNNRCShadow.