Lang.vectByIndAppend
import Natural (+, plusZeroId, plusSucId, zeroPlusId, sucPlus, plusAssoc)
import Lang.vectByInd (vect)
vappend : (n : ℕ) {A : 𝕌} (m : ℕ) → vect n A → vect m A → vect (n + m) A
using (Natural.+.unfold, sucPlus.rw, vect.eq, Lang.vectByInd.vect.unfold, zeroPlusId.rw)
vappend = λn A m. ℕ-elim (λv w. w) (k ih. λv w. v .π₁, ih (v .π₂) w) n
vappendZ : (A : 𝕌) (n : ℕ) (v : vect Z A) (w : vect n A) → vappend _ _ v w ≡ w ∈ vect n A
using (hyp.rw,
sucPlus.rw,
vappend.eq,
vect.eq,
Lang.vectByInd.vect.unfold,
zeroPlusId,
zeroPlusId.rw)
vappendZ = λA n v w. ⋆
vappendS : (n : ℕ)
(A : 𝕌)
(m : ℕ)
(v : vect (S n) A)
(w : vect m A)
→ vappend _ _ v w ≡ (v .π₁, vappend _ _ (v .π₂) w)
using (hyp.rw,
Natural.+.unfold,
sucPlus,
sucPlus.rw,
vappend.eq,
vect.eq,
Lang.vectByInd.vect.unfold,
zeroPlusId.rw)
vappendS = λn A m v w. ⋆
vappendAssocS : {A : 𝕌}
{m k p : ℕ}
{v : vect m A}
{w : vect k A}
{q : vect (S p) A}
→ (vappend (p + m) k (vappend _ _ (q .π₂) v) w
≡ vappend _ _ (q .π₂) (vappend _ _ v w)
∈ vect (p + (m + k)) A)
→ vappend (S p + m) k (vappend _ _ q v) w
≡ vappend _ _ q (vappend _ _ v w)
∈ vect (S p + (m + k)) A
using (hyp.rw,
Natural.+.unfold,
plusAssoc.rw,
sucPlus.rw,
vappend.eq,
vect.eq,
Lang.vectByInd.vect.unfold,
zeroPlusId.rw)
vappendAssocS = λA m k p v w q hih. ⋆
vappendAssoc : (n : ℕ)
(A : 𝕌)
(m k : ℕ)
(v : vect m A)
(w : vect k A)
(u : vect n A)
→ vappend _ _ (vappend _ _ u v) w ≡ vappend n (m + k) u (vappend _ _ v w)
using (hyp.rw,
Natural.+.unfold,
plusAssoc,
plusAssoc.rw,
sucPlus,
sucPlus.rw,
vappendS.rw,
vappendZ.rw,
vect.eq,
Lang.vectByInd.vect.unfold,
zeroPlusId,
zeroPlusId.rw)
vappendAssoc =
λn A m k v w u. ℕ-elim
p. (q : vect p A)
→ vappend (p + m) k (vappend _ _ q v) w
≡ vappend _ _ q (vappend _ _ v w)
∈ vect (p + (m + k)) A
λq. ⋆ using (vappend.eq, vect.eq, zeroPlusId.rw, sucPlus.rw, hyp.rw)
p ih. λq. vappendAssocS (ih (q .π₂))
n
u