Library MetaCoq.Erasure.ErasureCorrectness






Module PA := PCUICAst.
Module P := PCUICWcbvEval.



Prelim on arities and proofs

Correctness of erasure


Notation "Σ ;;; Γ |- s ▷ t" := (eval Σ Γ s t) (at level 50, Γ, s, t at next level) : type_scope.
Notation "Σ ⊢ s ▷ t" := (Ee.eval Σ s t) (at level 50, s, t at next level) : type_scope.

Erasure is stable under context conversion

Erasure is stable under substituting universe constraints


Lemma fix_context_subst_instance:
   (mfix : list (BasicAst.def term)) (u : universe_instance),
    map (map_decl (PCUICUnivSubst.subst_instance_constr u))
        (PCUICLiftSubst.fix_context mfix) =
    PCUICLiftSubst.fix_context
      (map
         (map_def (PCUICUnivSubst.subst_instance_constr u)
                  (PCUICUnivSubst.subst_instance_constr u)) mfix).

Lemma erases_subst_instance_constr0
  : env_prop (fun Σ Γ t Twf_ext_wk Σ
                            t' u univs,
                             wf_local (Σ.1, univs) (PCUICUnivSubst.subst_instance_context u Γ)
sub_context_set (monomorphic_udecl Σ.2) (global_ext_context_set (Σ.1, univs))
      consistent_instance_ext (Σ.1,univs) (Σ.2) u
    Σ ;;; Γ |- t t'
    (Σ.1,univs) ;;; (PCUICUnivSubst.subst_instance_context u Γ) |- PCUICUnivSubst.subst_instance_constr u t t').

Lemma erases_subst_instance_constr :
   Σ : global_env_ext, wf_ext_wk Σ
   Γ, wf_local Σ Γ
   t T, Σ ;;; Γ |- t : T
     t' u univs,
  wf_local (Σ.1, univs) (PCUICUnivSubst.subst_instance_context u Γ)
sub_context_set (monomorphic_udecl Σ.2) (global_ext_context_set (Σ.1, univs)) consistent_instance_ext (Σ.1,univs) (Σ.2) u
    Σ ;;; Γ |- t t'
    (Σ.1,univs) ;;; (PCUICUnivSubst.subst_instance_context u Γ) |- PCUICUnivSubst.subst_instance_constr u t t'.

Lemma erases_subst_instance'' Σ φ Γ t T u univs t' :
  wf_ext_wk (Σ, univs)
  (Σ, univs) ;;; Γ |- t : T
  sub_context_set (monomorphic_udecl univs) (global_context_set Σ)
  consistent_instance_ext (Σ, φ) univs u
  (Σ, univs) ;;; Γ |- t t'
  (Σ, φ) ;;; subst_instance_context u Γ
            |- subst_instance_constr u t t'.

Lemma erases_subst_instance_decl Σ Γ t T c decl u t' :
  wf Σ.1
  lookup_env Σ.1 c = Some decl
  (Σ.1, universes_decl_of_decl decl) ;;; Γ |- t : T
  consistent_instance_ext Σ (universes_decl_of_decl decl) u
  (Σ.1, universes_decl_of_decl decl) ;;; Γ |- t t'
   Σ ;;; subst_instance_context u Γ
            |- subst_instance_constr u t t'.

Erasure and applications


Lemma erases_App (Σ : global_env_ext) Γ f L T t :
  Σ ;;; Γ |- tApp f L : T
  erases Σ Γ (tApp f L) t
  (t = tBox × squash (isErasable Σ Γ (tApp f L)))
   f' L', t = EAst.tApp f' L'
             erases Σ Γ f f'
             erases Σ Γ L L'.

Lemma erases_mkApps (Σ : global_env_ext) Γ f f' L L' :
  erases Σ Γ f f'
  Forall2 (erases Σ Γ) L L'
  erases Σ Γ (mkApps f L) (EAst.mkApps f' L').

Lemma erases_mkApps_inv (Σ : global_env_ext) Γ f L T t :
  wf Σ
  Σ ;;; Γ |- mkApps f L : T
  Σ;;; Γ |- mkApps f L t
  ( L1 L2 L2', L = (L1 ++ L2)%list
                squash (isErasable Σ Γ (mkApps f L1))
                erases Σ Γ (mkApps f L1) tBox
                Forall2 (erases Σ Γ) L2 L2'
                t = EAst.mkApps tBox L2'
  )
   f' L', t = EAst.mkApps f' L'
             erases Σ Γ f f'
             Forall2 (erases Σ Γ) L L'.

Global erasure

The correctness proof


Record extraction_pre (Σ : global_env_ext) : Type
  := Build_extraction_pre
  { extr_env_axiom_free' : axiom_free (fst Σ);
    extr_env_wf' : wf_ext Σ }.


Definition EisConstruct_app :=
  fun tmatch (EAstUtils.decompose_app t).1 with
        | E.tConstruct _ _true
        | _false
        end.

Lemma fst_decompose_app_rec t l : fst (EAstUtils.decompose_app_rec t l) = fst (EAstUtils.decompose_app t).

Lemma is_construct_erases Σ Γ t t' :
  Σ;;; Γ |- t t'
  negb (isConstruct_app t) negb (EisConstruct_app t').

Lemma is_FixApp_erases Σ Γ t t' :
  Σ;;; Γ |- t t'
  negb (isFixApp t) negb (Ee.isFixApp t').

Lemma erases_correct Σ t T t' v Σ' :
  extraction_pre Σ
  Σ;;; [] |- t : T
  Σ;;; [] |- t t'
   erases_global Σ Σ'
  Σ;;; [] |- t v
   v', Σ;;; [] |- v v' Σ' t' v'.