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.