import Syntax.Simple.Signature as S
import Syntax.BiTyped.Signature as B
module Theory.Completeness {SD : S.SigD} (BD : B.SigD SD) where
open import Prelude
open import Syntax.Simple SD
open import Syntax.Context SD
open B SD
open import Syntax.BiTyped.Functor SD
import Syntax.BiTyped.Pre.Functor SD as P
import Syntax.Typed.Functor SD as T
open import Theory.Erasure
open import Syntax.BiTyped.Term BD
open import Syntax.BiTyped.Pre.Term BD
open import Syntax.Typed.Term (erase BD)
open import Syntax.Typed.Raw (erase BD)
private variable
Ξ : ℕ
Γ : Cxt 0
r : Raw _
d : Mode
A : Ty
mutual
completeness : Pre d r → Γ ⊢ r ⦂ A → Γ ⊢ r [ d ] A
completeness (` j) (var i eq) = var i eq
completeness (A ∋ p) (.A ∋ t) = A ∋ completeness p t
completeness (p ↑) t = completeness p t ↑ refl
completeness (op {rs = i , _} (dep , ps)) (op (σ , σeq , ts)) =
op (dep , σ , σeq , completenessᵃˢ (BD .ar i .args) ps ts)
completenessᵃˢ
: (Ds : ArgsD Ξ) {rs : R.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw (length Γ)} {σ : TSub Ξ 0}
→ P.⟦ Ds ⟧ᵃˢ Raw Pre rs
→ T.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw _⊢_⦂_ σ Γ rs
→ ⟦ Ds ⟧ᵃˢ Raw _⊢_[_]_ σ Γ rs
completenessᵃˢ [] _ _ = tt
completenessᵃˢ ((Δ ⊢[ _ ] _) ∷ Ds) (p , ps) (t , ts) =
completenessᵃ Δ p t , completenessᵃˢ Ds ps ts
completenessᵃ
: (Δ : TExps Ξ) {r : R.⟦ Δ ⟧ᵃ Raw (length Γ)} {σ : TSub Ξ 0}
→ P.⟦ Δ ⟧ᵃ Raw Pre d r
→ T.⟦ Δ ⟧ᵃ Raw (λ Γ' r' → Γ' ⊢ r' ⦂ A) σ Γ r
→ ⟦ Δ ⟧ᵃ Raw (λ Γ' r' → Γ' ⊢ r' [ d ] A) σ Γ r
completenessᵃ [] p t = completeness p t
completenessᵃ (_ ∷ Δ) p t = completenessᵃ Δ p t