import Syntax.Simple.Signature as S module Theory.ModeCorrectness.Functor (SD : S.SigD) where open import Prelude open import Syntax.Simple SD open import Syntax.Context SD open import Syntax.BiTyped.Signature SD import Syntax.Typed.Raw.Functor SD as R import Syntax.BiTyped.Functor SD as B open import Theory.Erasure open import Theory.ModeCorrectness.Signature SD private variable Ξ : ℕ ⟦_⟧ᵃ : (Δ : TExps Ξ) ((xs , ρ) : ∃Sub⊆ Ξ) → Cover xs Δ → (X : R.Fam ℓ) → ((Γ : Cxt 0) → X (length Γ) → Set ℓ′) → (Γ : Cxt 0) → R.⟦ Δ ⟧ᵃ X (length Γ) → Set ℓ′ ⟦ [] ⟧ᵃ _ _ X Y Γ t = Y Γ t ⟦ A ∷ Δ ⟧ᵃ (xs , ρ) (A⊆xs ∷ Δ⊆xs) X Y Γ t = ⟦ Δ ⟧ᵃ (xs , ρ) Δ⊆xs X Y (sub⊆ ρ A A⊆xs ∷ Γ) t ⟦_⟧ᵃˢ : (Ds : ArgsD Ξ) ((xs , ρ) : ∃Sub⊆ Ξ) → (ys : Fins# Ξ)→ ys ∪ known Ds #⊆ xs → (MC : ModeCorrectᵃˢ ys Ds) → (X : R.Fam ℓ) (Y : B.Fam ℓ′ X) → (Γ : Cxt 0) → R.⟦ eraseᵃˢ Ds ⟧ᵃˢ X (length Γ) → Set ℓ′ ⟦ [] ⟧ᵃˢ _ _ _ _ _ _ _ _ = ⊤ ⟦ Δ ⊢[ Chk ] A ∷ Ds ⟧ᵃˢ (xs , ρ) ys Ds⊆xs (A⊆Ds ∷ Δ⊆Ds , MC) X Y Γ (t , ts) = ⟦ Δ ⟧ᵃ (_ , ρ) Δ⊆xs X (λ Γ t → Y Γ t Chk (sub⊆ ρ A (Ds⊆xs ∘ A⊆Ds))) Γ t × ⟦ Ds ⟧ᵃˢ (xs , ρ) ys Ds⊆xs MC X Y Γ ts where Δ⊆xs : Cover xs Δ Δ⊆xs = L.A.map (λ {A} A⊆ {x} x∈ → Ds⊆xs (A⊆ x∈)) Δ⊆Ds ⟦ Δ ⊢[ Syn ] A ∷ Ds ⟧ᵃˢ (xs , ρ) ys Ds⊆xs (Δ⊆Ds , MC) X Y Γ (t , ts) = ⟦ Δ ⟧ᵃ (_ , ρ) Δ⊆xs X (λ Γ t → Y Γ t Syn (sub⊆ ρ A (Ds⊆xs ∘ ∪⁺ʳ ys ∘ ∪⁺ˡ))) Γ t × ⟦ Ds ⟧ᵃˢ (xs , ρ) ys (Ds⊆xs ∘ ∪-monotoneʳ ys (∪⁺ʳ (vars A))) MC X Y Γ ts where Δ⊆xs : Cover xs Δ Δ⊆xs = L.A.map (λ {B} B⊆ {x} x∈ → Ds⊆xs (∪-monotoneʳ ys (∪⁺ʳ (vars A)) (B⊆ x∈))) Δ⊆Ds