import Syntax.Simple.Signature as S import Syntax.BiTyped.Signature as B' module Theory.Pre.Annotatability {SD : S.SigD} (BD : B'.SigD SD) where open import Prelude open import Syntax.Simple SD open import Syntax.Context SD open import Theory.Erasure open import Syntax.Typed.Raw (erase BD) open import Syntax.Typed.Raw.Ordering.Term (erase BD) import Syntax.Typed.Raw.Ordering.Functor SD as O open import Syntax.BiTyped.Pre.Generalised.Term BD import Syntax.BiTyped.Pre.Generalised.Functor SD as G open import Syntax.Typed.Term (erase BD) import Syntax.Typed.Functor SD as T open import Syntax.BiTyped.Term BD import Syntax.BiTyped.Functor SD as B open B' SD private variable Ξ : ℕ v e : Bool d : Mode r : Raw _ Γ : Cxt 0 A : Ty mutual annotatability : Pre? v e d r → Γ ⊢ r ⦂ A → ∃[ r' ] r ≤ᴬ r' × Γ ⊢ r' [ d ] A annotatability (` j) (var i eq) = _ , ` j , var i eq annotatability (A ∋ p) (.A ∋ t) with annotatability p t ... | _ , r≤r' , t' = _ , A ∋ r≤r' , A ∋ t' annotatability (p ↑) t with annotatability p t ... | _ , r≤r' , t' = _ , r≤r' , t' ↑ refl annotatability (?∋ p) t with annotatability p t ... | _ , r≤r' , t' = _ , _ ∋⁺ r≤r' , _ ∋ t' annotatability (op (_ , ps)) (op ts) with annotatabilityᶜ (BD .ar _) ps ts ... | _ , rs≤rs' , ts' = _ , op (refl , rs≤rs') , op ts' annotatabilityᶜ : (D : OpD) {rs : R.⟦ eraseᶜ D ⟧ᶜ Raw _} → G.⟦ D ⟧ᶜ Raw Pre? v d rs → T.⟦ eraseᶜ D ⟧ᶜ Raw _⊢_⦂_ Γ rs A → ∃[ rs' ] O.⟦ eraseᶜ D , eraseᶜ D ⟧ᶜ Raw _≤ᴬ_ refl rs rs' × B.⟦ D ⟧ᶜ Raw _⊢_[_]_ Γ rs' d A annotatabilityᶜ (ι _ _ Ds) (vs , a , deq , ps) (σ , σeq , ts) with annotatabilityᵃˢ Ds vs ps ts ... | _ , rs≤rs' , ts' = _ , rs≤rs' , (deq , σ , σeq , ts') annotatabilityᵃˢ : (Ds : ArgsD Ξ) {rs : R.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw _} {σ : TSub Ξ 0} → (vs : Vec Bool (length Ds)) → G.⟦ Ds ⟧ᵃˢ Raw Pre? vs rs → T.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw _⊢_⦂_ σ Γ rs → ∃[ rs' ] O.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw _≤ᴬ_ rs rs' × B.⟦ Ds ⟧ᵃˢ Raw _⊢_[_]_ σ Γ rs' annotatabilityᵃˢ [] _ _ _ = _ , _ , _ annotatabilityᵃˢ ((Δ ⊢[ _ ] _) ∷ Ds) (_ ∷ vs) ((_ , p) , ps) (t , ts) with annotatabilityᵃ Δ p t | annotatabilityᵃˢ Ds vs ps ts ... | _ , r≤r' , t' | _ , rs≤rs' , ts' = _ , (r≤r' , rs≤rs') , (t' , ts') annotatabilityᵃ : (Δ : TExps Ξ) {r : Raw _} {σ : TSub Ξ 0} → Pre? v e d r → T.⟦ Δ ⟧ᵃ Raw (_⊢_⦂ A) σ Γ r → ∃[ r' ] r ≤ᴬ r' × B.⟦ Δ ⟧ᵃ Raw (_⊢_[ d ] A) σ Γ r' annotatabilityᵃ [] p t = annotatability p t annotatabilityᵃ (_ ∷ Δ) p t = annotatabilityᵃ Δ p t