GhostTT.CScoping
Scoping for CC
Stating that all variables are in a given cscope, and in a given mode.
From Coq Require Import Utf8 List.
From GhostTT.autosubst Require Import CCAST unscoped.
From GhostTT Require Import BasicAST SubstNotations ContextDecl.
Import ListNotations.
Set Default Goal Selector "!".
Inductive ccscoping (Γ : cscope) : cterm → cmode → Prop :=
| cscope_var :
∀ x m,
nth_error Γ x = Some (Some m) →
ccscoping Γ (cvar x) m
| cscope_sort :
∀ m i,
ccscoping Γ (cSort m i) cType
| cscope_pi :
∀ mx A B,
ccscoping Γ A cType →
ccscoping (Some mx :: Γ) B cType →
ccscoping Γ (cPi mx A B) cType
| cscope_lam :
∀ mx m A t,
ccscoping Γ A cType →
ccscoping (Some mx :: Γ) t m →
ccscoping Γ (clam mx A t) m
| cscope_app :
∀ mx m t u,
ccscoping Γ t m →
ccscoping Γ u mx →
ccscoping Γ (capp t u) m
| cscope_unit :
ccscoping Γ cunit cType
| cscope_tt :
ccscoping Γ ctt cType
| cscope_top :
ccscoping Γ ctop cType
| cscope_star :
ccscoping Γ cstar cProp
| cscope_bot :
ccscoping Γ cbot cType
| cscope_bot_elim :
∀ m A p,
ccscoping Γ A cType →
ccscoping Γ p cProp →
ccscoping Γ (cbot_elim m A p) m
| cscope_ty :
∀ i,
ccscoping Γ (cty i) cType
| cscope_tyval :
∀ mk A a,
ccscoping Γ A cType →
ccscoping Γ a cType →
ccscoping Γ (ctyval mk A a) cType
| cscope_tyerr :
ccscoping Γ ctyerr cType
| cscope_El :
∀ T,
ccscoping Γ T cType →
ccscoping Γ (cEl T) cType
| cscope_Err :
∀ T,
ccscoping Γ T cType →
ccscoping Γ (cErr T) cType
| cscope_squash :
∀ A,
ccscoping Γ A cType →
ccscoping Γ (squash A) cType
| cscope_sq :
∀ t,
ccscoping Γ t cType →
ccscoping Γ (sq t) cProp
| cscope_sq_elim :
∀ e P t,
ccscoping Γ e cProp →
ccscoping Γ P cType →
ccscoping Γ t cProp →
ccscoping Γ (sq_elim e P t) cProp
| cscope_teq :
∀ A u v,
ccscoping Γ A cType →
ccscoping Γ u cType →
ccscoping Γ v cType →
ccscoping Γ (teq A u v) cType
| cscope_trefl :
∀ A u,
ccscoping Γ A cType →
ccscoping Γ u cType →
ccscoping Γ (trefl A u) cType
| cscope_tJ :
∀ e P t m,
ccscoping Γ e cType →
ccscoping Γ P cType →
ccscoping Γ t m →
ccscoping Γ (tJ e P t) m
| cscope_ebool :
ccscoping Γ ebool cType
| cscope_etrue :
ccscoping Γ etrue cType
| cscope_efalse :
ccscoping Γ efalse cType
| cscope_bool_err :
ccscoping Γ bool_err cType
| cscope_eif :
∀ m b P t f e,
ccscoping Γ b cType →
ccscoping Γ P cType →
ccscoping Γ t m →
ccscoping Γ f m →
ccscoping Γ e m →
ccscoping Γ (eif m b P t f e) m
| cscope_pbool :
ccscoping Γ pbool cType
| cscope_ptrue :
ccscoping Γ ptrue cProp
| cscope_pfalse :
ccscoping Γ pfalse cProp
| cscope_pif :
∀ bP P t f,
ccscoping Γ bP cProp →
ccscoping Γ P cType →
ccscoping Γ t cProp →
ccscoping Γ f cProp →
ccscoping Γ (pif bP P t f) cProp
| cscope_enat :
ccscoping Γ enat cType
| cscope_ezero :
ccscoping Γ ezero cType
| cscope_esucc :
∀ n,
ccscoping Γ n cType →
ccscoping Γ (esucc n) cType
| cscope_enat_elim :
∀ n P z s,
ccscoping Γ n cType →
ccscoping Γ P cType →
ccscoping Γ z cType →
ccscoping Γ s cType →
ccscoping Γ (enat_elim n P z s) cType
| cscope_pnat :
ccscoping Γ pnat cType
| cscope_pzero :
ccscoping Γ pzero cProp
| cscope_psucc :
∀ n,
ccscoping Γ n cProp →
ccscoping Γ (psucc n) cProp
| cscope_pnat_elim :
∀ ne nP Pe PP ze zP se sP,
ccscoping Γ ne cType →
ccscoping Γ nP cProp →
ccscoping Γ Pe cType →
ccscoping Γ PP cType →
ccscoping Γ ze cType →
ccscoping Γ zP cProp →
ccscoping Γ se cType →
ccscoping Γ sP cProp →
ccscoping Γ (pnat_elim ne nP Pe PP ze zP se sP) cProp
| cscope_pnat_elimP :
∀ ne nP Pe PP zP sP,
ccscoping Γ ne cType →
ccscoping Γ nP cProp →
ccscoping Γ Pe cType →
ccscoping Γ PP cType →
ccscoping Γ zP cProp →
ccscoping Γ sP cProp →
ccscoping Γ (pnat_elimP ne nP Pe PP zP sP) cProp
| cscope_evec :
∀ A,
ccscoping Γ A cType →
ccscoping Γ (evec A) cType
| cscope_evnil :
∀ A,
ccscoping Γ A cType →
ccscoping Γ (evnil A) cType
| cscope_evcons :
∀ a v,
ccscoping Γ a cType →
ccscoping Γ v cType →
ccscoping Γ (evcons a v) cType
| cscope_evec_elim :
∀ v P z s,
ccscoping Γ v cType →
ccscoping Γ P cType →
ccscoping Γ z cType →
ccscoping Γ s cType →
ccscoping Γ (evec_elim v P z s) cType
| cscope_pvec :
∀ A AP n nP,
ccscoping Γ A cType →
ccscoping Γ AP cType →
ccscoping Γ n cType →
ccscoping Γ nP cProp →
ccscoping Γ (pvec A AP n nP) cType
| cscope_pvnil :
∀ AP,
ccscoping Γ AP cType →
ccscoping Γ (pvnil AP) cProp
| cscope_pvcons :
∀ aP nP vP,
ccscoping Γ aP cProp →
ccscoping Γ nP cProp →
ccscoping Γ vP cProp →
ccscoping Γ (pvcons aP nP vP) cProp
| cscope_pvec_elim :
∀ A AP n nP v vP P PP z zP s sP,
ccscoping Γ A cType →
ccscoping Γ AP cType →
ccscoping Γ n cType →
ccscoping Γ nP cProp →
ccscoping Γ v cType →
ccscoping Γ vP cProp →
ccscoping Γ P cType →
ccscoping Γ PP cType →
ccscoping Γ z cType →
ccscoping Γ zP cProp →
ccscoping Γ s cType →
ccscoping Γ sP cProp →
ccscoping Γ (pvec_elim A AP n nP v vP P PP z zP s sP) cProp
| cscope_pvec_elimG :
∀ A AP n nP v vP P PP z zP s sP,
ccscoping Γ A cType →
ccscoping Γ AP cType →
ccscoping Γ n cType →
ccscoping Γ nP cProp →
ccscoping Γ v cType →
ccscoping Γ vP cProp →
ccscoping Γ P cType →
ccscoping Γ PP cType →
ccscoping Γ z cType →
ccscoping Γ zP cProp →
ccscoping Γ s cType →
ccscoping Γ sP cProp →
ccscoping Γ (pvec_elimG A AP n nP v vP P PP z zP s sP) cProp
| cscope_pvec_elimP :
∀ A AP n nP v vP P PP z s,
ccscoping Γ A cType →
ccscoping Γ AP cType →
ccscoping Γ n cType →
ccscoping Γ nP cProp →
ccscoping Γ v cType →
ccscoping Γ vP cProp →
ccscoping Γ P cType →
ccscoping Γ PP cType →
ccscoping Γ z cProp →
ccscoping Γ s cProp →
ccscoping Γ (pvec_elimP A AP n nP v vP P PP z s) cProp
.
Notation ccxscoping Γ := (ccscoping (csc Γ)).
Create HintDb cc_scope discriminated.
Hint Constructors ccscoping : cc_scope.
Ltac escope :=
unshelve typeclasses eauto with cc_scope shelvedb ; shelve_unifiable.