import Syntax.Simple.Signature as S
import Syntax.BiTyped.Signature as B
module Theory.Pre.Term {SD : S.SigD} (BD : B.SigD SD) where
open import Prelude
open import Syntax.Simple SD
open B SD
import Syntax.BiTyped.Pre.Functor SD as P
import Syntax.BiTyped.Pre.Generalised.Functor SD as G
open import Theory.Erasure
open import Syntax.Typed.Raw (erase BD)
open import Syntax.BiTyped.Pre.Term BD
open import Syntax.BiTyped.Pre.Generalised.Term BD
private variable
v e : Bool
d : Mode
n Ξ : ℕ
r : Raw n
mutual
toPre : Pre? true e d r → Pre d r
toPre (` i) = ` i
toPre (A ∋ p) = A ∋ toPre p
toPre (p ↑) = toPre p ↑
toPre (op (_ , ps)) = op (toPreᶜ (BD .ar _) ps)
toPreᶜ : (D : OpD) {rs : R.⟦ eraseᶜ D ⟧ᶜ Raw n}
→ G.⟦ D ⟧ᶜ Raw Pre? true d rs
→ P.⟦ D ⟧ᶜ Raw Pre d rs
toPreᶜ (ι _ _ Ds) (vs , a , deq , ps) = deq , toPreᵃˢ Ds vs a ps
toPreᵃˢ : (Ds : ArgsD Ξ) {rs : R.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw n}
→ (vs : Vec Bool (length Ds)) → And (toList vs) true
→ G.⟦ Ds ⟧ᵃˢ Raw Pre? vs rs
→ P.⟦ Ds ⟧ᵃˢ Raw Pre rs
toPreᵃˢ [] _ _ _ = _
toPreᵃˢ ((Δ ⊢[ _ ] _) ∷ Ds) (.true ∷ vs) (tl a) ((_ , p) , ps) =
toPre p , toPreᵃˢ Ds vs a ps
to¬Pre-Syn : Pre? v true Chk r → ¬ Pre Syn r
to¬Pre-Syn (op (_ , _ , _ , d≡Chk , _)) (op (d≡Syn , _)) = Chk≢Syn (trans (sym d≡Chk) d≡Syn)
mutual
to¬Pre-Chk : Pre? false true Syn r → ¬ Pre Chk r
to¬Pre-Chk p (q ↑) = to¬Pre p q
to¬Pre-Chk (op (_ , _ , _ , d≡Syn , _)) (op (d≡Chk , _)) = Chk≢Syn (trans (sym d≡Chk) d≡Syn)
to¬Pre : Pre? false e d r → ¬ Pre d r
to¬Pre (A ∋ p) (.A ∋ q) = to¬Pre p q
to¬Pre (p ↑) q = to¬Pre-Chk p q
to¬Pre (?∋ p) q = to¬Pre-Syn p q
to¬Pre (op (_ , ps)) (op qs) = to¬Preᶜ (BD .ar _) ps qs
to¬Pre (op (_ , _ , _ , d≡Chk , _)) (op (d≡Syn , _) ↑) = Chk≢Syn (trans (sym d≡Chk) d≡Syn)
to¬Preᶜ
: (D : OpD) {rs : R.⟦ eraseᶜ D ⟧ᶜ Raw n}
→ G.⟦ D ⟧ᶜ Raw Pre? false d rs
→ ¬ P.⟦ D ⟧ᶜ Raw Pre d rs
to¬Preᶜ (ι _ _ Ds) (vs , a , _ , ps) (_ , qs) = to¬Preᵃˢ Ds vs a ps qs
to¬Preᵃˢ
: (Ds : ArgsD Ξ) {rs : R.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw n}
→ (vs : Vec Bool (length Ds)) → And (toList vs) false
→ G.⟦ Ds ⟧ᵃˢ Raw Pre? vs rs
→ ¬ P.⟦ Ds ⟧ᵃˢ Raw Pre rs
to¬Preᵃˢ [] [] () _ _
to¬Preᵃˢ (_ ∷ Ds) (._ ∷ vs) hd ((_ , p) , ps) (q , qs) = to¬Pre p q
to¬Preᵃˢ (_ ∷ Ds) (._ ∷ vs) (tl a) ((_ , p) , ps) (q , qs) = to¬Preᵃˢ Ds vs a ps qs