GhostTT.Scoping

Scoping
Stating that all variables are in a given scope, and in a given mode.

From Coq Require Import Utf8 List.
From GhostTT.autosubst Require Import GAST unscoped RAsimpl CCAST_rasimpl GAST_rasimpl.
From GhostTT Require Import BasicAST SubstNotations ContextDecl CastRemoval.

Import ListNotations.

Set Default Goal Selector "!".

Inductive scoping (Γ : scope) : term mode Prop :=

| scope_var :
     x m,
      nth_error Γ x = Some m
      scoping Γ (var x) m

| scpoe_sort :
     m i,
      scoping Γ (Sort m i) mKind

| scope_pi :
     i j mx m A B,
      scoping Γ A mKind
      scoping (mx :: Γ) B mKind
      scoping Γ (Pi i j m mx A B) mKind

| scope_lam :
     mx m A t,
      scoping Γ A mKind
      scoping (mx :: Γ) t m
      scoping Γ (lam mx A t) m

| scope_app :
     mx m t u,
      scoping Γ t m
      scoping Γ u mx
      scoping Γ (app t u) m

| scope_erased :
     A,
      scoping Γ A mKind
      scoping Γ (Erased A) mKind

| scope_hide :
     t,
      scoping Γ t mType
      scoping Γ (hide t) mGhost

| scope_reveal :
     m t P p,
      In m [ mProp ; mGhost ]
      scoping Γ t mGhost
      scoping Γ P mKind
      scoping Γ p m
      scoping Γ (reveal t P p) m

| scope_Reveal :
     t p,
      scoping Γ t mGhost
      scoping Γ p mKind
      scoping Γ (Reveal t p) mKind

| scope_toRev :
     t p u,
      scoping Γ t mType
      scoping Γ p mKind
      scoping Γ u mProp
      scoping Γ (toRev t p u) mProp

| scope_fromRev :
     t p u,
      scoping Γ t mType
      scoping Γ p mKind
      scoping Γ u mProp
      scoping Γ (fromRev t p u) mProp

| scope_gheq :
     A u v,
      scoping Γ A mKind
      scoping Γ u mGhost
      scoping Γ v mGhost
      scoping Γ (gheq A u v) mKind

| scope_ghrefl :
     A u,
      scoping Γ A mKind
      scoping Γ u mGhost
      scoping Γ (ghrefl A u) mProp

| scope_ghcast :
     m A u v e P t,
      m mKind
      scoping Γ A mKind
      scoping Γ u mGhost
      scoping Γ v mGhost
      scoping Γ e mProp
      scoping Γ P mKind
      scoping Γ t m
      scoping Γ (ghcast A u v e P t) m

| scope_bool :
    scoping Γ tbool mKind

| scope_true :
    scoping Γ ttrue mType

| scope_false :
    scoping Γ tfalse mType

| scope_if :
     m b P t f,
      scoping Γ b mType
      scoping Γ P mKind
      scoping Γ t m
      scoping Γ f m
      scoping Γ (tif m b P t f) m

| scope_nat :
    scoping Γ tnat mKind

| scope_zero :
    scoping Γ tzero mType

| scope_succ :
     n,
      scoping Γ n mType
      scoping Γ (tsucc n) mType

| scope_nat_elim :
     m n P z s,
      m mKind
      scoping Γ n mType
      scoping Γ P mKind
      scoping Γ z m
      scoping Γ s m
      scoping Γ (tnat_elim m n P z s) m

| scope_vec :
     A n,
      scoping Γ A mKind
      scoping Γ n mGhost
      scoping Γ (tvec A n) mKind

| scope_vnil :
     A,
      scoping Γ A mKind
      scoping Γ (tvnil A) mType

| scope_vcons :
     a n v,
      scoping Γ a mType
      scoping Γ n mGhost
      scoping Γ v mType
      scoping Γ (tvcons a n v) mType

| scope_vec_elim :
     m A n v P z s,
      m mKind
      scoping Γ A mKind
      scoping Γ n mGhost
      scoping Γ v mType
      scoping Γ P mKind
      scoping Γ z m
      scoping Γ s m
      scoping Γ (tvec_elim m A n v P z s) m

| scope_bot :
    scoping Γ bot mKind

| scope_bot_elim :
     m A p,
      scoping Γ A mKind
      scoping Γ p mProp
      scoping Γ (bot_elim m A p) m
.

Notation cscoping Γ := (scoping (sc Γ)).

Create HintDb gtt_scope discriminated.

Hint Constructors scoping : gtt_scope.

Ltac gscope :=
  unshelve typeclasses eauto with gtt_scope shelvedb ; shelve_unifiable.