@@ -73,7 +73,7 @@ module Impl {ℓ} {R : Type ℓ} (cring : CRing-on R) where
7373 En : ∀ {n} → Normal n → Vec R n → R
7474
7575 Ep ∅ i = R.0r
76- Ep (p *x+ c) (x ∷ e) = Ep p (x ∷ e) R.* x R.+ En c e
76+ Ep (p *x+ c) v with (x ∷ e) ← vec-view v = Ep p (x ∷v e) R.* x R.+ En c e
7777
7878 En (con x) i = embed-coe x
7979 En (poly x) i = Ep x i
@@ -234,32 +234,34 @@ module Impl {ℓ} {R : Type ℓ} (cring : CRing-on R) where
234234 ⟦ x ⟧ₙ ρ = En (normal x) ρ
235235
236236 0n-hom : ∀ {n} (ρ : Vec R n) → En 0n ρ ≡ R.0r
237- 0n-hom [] = ℤ↪R.pres-0
238- 0n-hom (x ∷ ρ) = refl
237+ 0n-hom v with vec-view v
238+ ... | [] = ℤ↪R.pres-0
239+ ... | (x ∷ ρ) = refl
239240
240241 1n-hom : ∀ {n} (ρ : Vec R n) → En 1n ρ ≡ R.1r
241- 1n-hom [] = ℤ↪R.pres-id
242- 1n-hom (x ∷ ρ) =
242+ 1n-hom v with vec-view v
243+ ... | [] = ℤ↪R.pres-id
244+ ... | (x ∷ ρ) =
243245 (R.0r R.* x) R.+ (En 1n ρ) ≡⟨ R.eliml R.*-zerol ⟩
244246 En 1n ρ ≡⟨ 1n-hom ρ ⟩
245247 R.1r ∎
246248
247249 *x+ₙ-sound
248250 : ∀ {n} (p : Poly (suc n)) (c : Normal n) ρ
249251 → Ep (p *x+ₙ c) ρ ≡ Ep (p *x+ c) ρ
250- *x+ₙ-sound ∅ c (e ∷ ρ) with c ==ₙ 0n
251- ... | just x = sym $
252- Ep (∅ *x+ ⌜ c ⌝) (e ∷ ρ) ≡⟨ ap! x ⟩
253- Ep (∅ *x+ 0n) (e ∷ ρ) ≡⟨⟩
252+ *x+ₙ-sound ∅ c v with vec-view v | c ==ₙ 0n
253+ ... | (e ∷ ρ) | just x = sym $
254+ Ep (∅ *x+ ⌜ c ⌝) (e ∷v ρ) ≡⟨ ap! x ⟩
255+ Ep (∅ *x+ 0n) (e ∷v ρ) ≡⟨⟩
254256 (R.0r R.* e) R.+ En 0n ρ ≡⟨ R.eliml R.*-zerol ⟩
255257 En 0n ρ ≡⟨ 0n-hom ρ ⟩
256258 R.0r ∎
257- ... | nothing = refl
259+ ... | (e ∷ ρ) | nothing = refl
258260 *x+ₙ-sound (p *x+ x) c ρ = refl
259261
260262 ∅*x+ₙ-hom
261263 : ∀ {n} (c : Normal n) x ρ
262- → Ep (∅ *x+ₙ c) (x ∷ ρ) ≡ En c ρ
264+ → Ep (∅ *x+ₙ c) (x ∷v ρ) ≡ En c ρ
263265 ∅*x+ₙ-hom c x ρ with c ==ₙ 0n
264266 ... | just x = sym (ap (λ c → En c ρ) x ∙ 0n-hom ρ)
265267 ... | nothing = R.eliml R.*-zerol
@@ -273,48 +275,48 @@ module Impl {ℓ} {R : Type ℓ} (cring : CRing-on R) where
273275
274276 +ₚ-hom ∅ q ρ = sym R.+-idl
275277 +ₚ-hom (p *x+ x) ∅ ρ = sym R.+-idr
276- +ₚ-hom (p *x+ c) (q *x+ d) (x ∷ ρ) =
277- Ep ((p +ₚ q) *x+ₙ (c +ₙ d)) (x ∷ ρ) ≡⟨ *x+ₙ-sound (p +ₚ q) (c +ₙ d) (x ∷ ρ) ⟩
278- Ep ((p +ₚ q) *x+ (c +ₙ d)) (x ∷ ρ) ≡⟨⟩
279- ⌜ Ep (p +ₚ q) (x ∷ ρ) ⌝ R.* x R.+ En (c +ₙ d) ρ ≡⟨ ap! (+ₚ-hom p q (x ∷ ρ)) ⟩
280- (Ep p (x ∷ ρ) R.+ Ep q (x ∷ ρ)) R.* x R.+ ⌜ En (c +ₙ d) ρ ⌝ ≡⟨ ap! (+ₙ-hom c d ρ) ⟩
281- ⌜ (Ep p (x ∷ ρ) R.+ Ep q (x ∷ ρ)) R.* x ⌝ R.+ (En c ρ R.+ En d ρ) ≡⟨ ap! R.*-distribr ⟩
282- Ep p (x ∷ ρ) R.* x R.+ Ep q (x ∷ ρ) R.* x R.+ (En c ρ R.+ En d ρ) ≡⟨ R.a.pullr (R.pulll R.+-commutes) ⟩
283- Ep p (x ∷ ρ) R.* x R.+ (En c ρ R.+ Ep q (x ∷ ρ) R.* x R.+ En d ρ) ≡⟨ R.a.extendl (R.a.pulll refl) ⟩
284- Ep p (x ∷ ρ) R.* x R.+ En c ρ R.+ (Ep q (x ∷ ρ) R.* x R.+ En d ρ) ∎
278+ +ₚ-hom (p *x+ c) (q *x+ d) v with (x ∷ ρ) ← vec-view v =
279+ Ep ((p +ₚ q) *x+ₙ (c +ₙ d)) (x ∷v ρ) ≡⟨ *x+ₙ-sound (p +ₚ q) (c +ₙ d) (x ∷v ρ) ⟩
280+ Ep ((p +ₚ q) *x+ (c +ₙ d)) (x ∷v ρ) ≡⟨⟩
281+ ⌜ Ep (p +ₚ q) (x ∷v ρ) ⌝ R.* x R.+ En (c +ₙ d) ρ ≡⟨ ap! (+ₚ-hom p q (x ∷v ρ)) ⟩
282+ (Ep p (x ∷v ρ) R.+ Ep q (x ∷v ρ)) R.* x R.+ ⌜ En (c +ₙ d) ρ ⌝ ≡⟨ ap! (+ₙ-hom c d ρ) ⟩
283+ ⌜ (Ep p (x ∷v ρ) R.+ Ep q (x ∷v ρ)) R.* x ⌝ R.+ (En c ρ R.+ En d ρ) ≡⟨ ap! R.*-distribr ⟩
284+ Ep p (x ∷v ρ) R.* x R.+ Ep q (x ∷v ρ) R.* x R.+ (En c ρ R.+ En d ρ) ≡⟨ R.a.pullr (R.pulll R.+-commutes) ⟩
285+ Ep p (x ∷v ρ) R.* x R.+ (En c ρ R.+ Ep q (x ∷v ρ) R.* x R.+ En d ρ) ≡⟨ R.a.extendl (R.a.pulll refl) ⟩
286+ Ep p (x ∷v ρ) R.* x R.+ En c ρ R.+ (Ep q (x ∷v ρ) R.* x R.+ En d ρ) ∎
285287 +ₙ-hom (con x) (con y) ρ = ℤ↪R.pres-+ (lift x) (lift y)
286288 +ₙ-hom (poly p) (poly q) ρ = +ₚ-hom p q ρ
287289
288290 *x+-hom
289291 : ∀ {n} (p q : Poly (suc n)) x ρ
290- → Ep (p *x+ₚ q) (x ∷ ρ)
291- ≡ Ep p (x ∷ ρ) R.* x R.+ Ep q (x ∷ ρ)
292+ → Ep (p *x+ₚ q) (x ∷v ρ)
293+ ≡ Ep p (x ∷v ρ) R.* x R.+ Ep q (x ∷v ρ)
292294 *x+-hom ∅ ∅ x ρ = R.introl R.*-zerol
293295 *x+-hom (p *x+ c) ∅ x ρ = ap₂ R._+_ refl (0n-hom ρ)
294296 *x+-hom p (q *x+ d) x ρ =
295- Ep (p *x+ₚ (q *x+ d)) (x ∷ ρ) ≡⟨⟩
296- Ep ((p +ₚ q) *x+ₙ d) (x ∷ ρ) ≡⟨ *x+ₙ-sound (p +ₚ q) d (x ∷ ρ) ⟩
297- ⌜ Ep (p +ₚ q) (x ∷ ρ) ⌝ R.* x R.+ En d ρ ≡⟨ ap! (+ₚ-hom p q (x ∷ ρ)) ⟩
298- ⌜ (Ep p (x ∷ ρ) R.+ Ep q (x ∷ ρ)) R.* x ⌝ R.+ En d ρ ≡⟨ ap! R.*-distribr ⟩
299- Ep p (x ∷ ρ) R.* x R.+ Ep q (x ∷ ρ) R.* x R.+ En d ρ ≡⟨ R.pullr refl ⟩
300- Ep p (x ∷ ρ) R.* x R.+ (Ep q (x ∷ ρ) R.* x R.+ En d ρ) ∎
297+ Ep (p *x+ₚ (q *x+ d)) (x ∷v ρ) ≡⟨⟩
298+ Ep ((p +ₚ q) *x+ₙ d) (x ∷v ρ) ≡⟨ *x+ₙ-sound (p +ₚ q) d (x ∷v ρ) ⟩
299+ ⌜ Ep (p +ₚ q) (x ∷v ρ) ⌝ R.* x R.+ En d ρ ≡⟨ ap! (+ₚ-hom p q (x ∷v ρ)) ⟩
300+ ⌜ (Ep p (x ∷v ρ) R.+ Ep q (x ∷v ρ)) R.* x ⌝ R.+ En d ρ ≡⟨ ap! R.*-distribr ⟩
301+ Ep p (x ∷v ρ) R.* x R.+ Ep q (x ∷v ρ) R.* x R.+ En d ρ ≡⟨ R.pullr refl ⟩
302+ Ep p (x ∷v ρ) R.* x R.+ (Ep q (x ∷v ρ) R.* x R.+ En d ρ) ∎
301303
302304 *ₙₚ-hom
303305 : ∀ {n} (c : Normal n) (p : Poly (suc n)) x ρ
304- → Ep (c *ₙₚ p) (x ∷ ρ) ≡ En c ρ R.* Ep p (x ∷ ρ)
306+ → Ep (c *ₙₚ p) (x ∷v ρ) ≡ En c ρ R.* Ep p (x ∷v ρ)
305307 *ₚₙ-hom
306308 : ∀ {n} (c : Normal n) (p : Poly (suc n)) x ρ
307- → Ep (p *ₚₙ c) (x ∷ ρ) ≡ Ep p (x ∷ ρ) R.* En c ρ
309+ → Ep (p *ₚₙ c) (x ∷v ρ) ≡ Ep p (x ∷v ρ) R.* En c ρ
308310 *ₙ-hom : ∀ {n} (c d : Normal n) ρ → En (c *ₙ d) ρ ≡ En c ρ R.* En d ρ
309311 *ₚ-hom : ∀ {n} (p q : Poly (suc n)) ρ → Ep (p *ₚ q) ρ ≡ Ep p ρ R.* Ep q ρ
310312
311313 *ₚ-hom ∅ q ρ = sym R.*-zerol
312314 *ₚ-hom (p *x+ c) ∅ ρ = sym R.*-zeror
313- *ₚ-hom (p *x+ c) (q *x+ d) (x ∷ ρ) =
314- *x+ₙ-sound ((p *ₚ q) *x+ₚ ((p *ₚₙ d) +ₚ (c *ₙₚ q))) _ (x ∷ ρ)
315+ *ₚ-hom (p *x+ c) (q *x+ d) v with (x ∷ ρ) ← vec-view v =
316+ *x+ₙ-sound ((p *ₚ q) *x+ₚ ((p *ₚₙ d) +ₚ (c *ₙₚ q))) _ (x ∷v ρ)
315317 ∙ ap₂ R._+_ (ap₂ R._*_ (*x+-hom (p *ₚ q) ((p *ₚₙ d) +ₚ (c *ₙₚ q)) x ρ) refl) refl
316- ∙ ap₂ R._+_ (ap₂ R._*_ (ap₂ R._+_ (ap (R._* x) (*ₚ-hom p q (x ∷ ρ)))
317- (+ₚ-hom (p *ₚₙ d) (c *ₙₚ q) (x ∷ ρ))) refl
318+ ∙ ap₂ R._+_ (ap₂ R._*_ (ap₂ R._+_ (ap (R._* x) (*ₚ-hom p q (x ∷v ρ)))
319+ (+ₚ-hom (p *ₚₙ d) (c *ₙₚ q) (x ∷v ρ))) refl
318320 ∙ ap₂ R._*_ (ap₂ R._+_ refl (ap₂ R._+_ (*ₚₙ-hom d p x ρ) (*ₙₚ-hom c q x ρ)))
319321 refl) refl
320322 ∙ ap₂ R._+_ refl (*ₙ-hom c d ρ) ∙ lemma _ _ _ _ _
@@ -372,26 +374,27 @@ module Impl {ℓ} {R : Type ℓ} (cring : CRing-on R) where
372374 -ₚ-hom : ∀ {n} (p : Poly (suc n)) ρ → Ep (-ₚ p) ρ ≡ R.- Ep p ρ
373375 -ₙ-hom : ∀ {n} (n : Normal n) ρ → En (-ₙ n) ρ ≡ R.- En n ρ
374376
375- -ₚ-hom p (x ∷ ρ) =
376- *ₙₚ-hom (-ₙ 1n) p x ρ
377+ -ₚ-hom p v with (x ∷ ρ) ← vec-view v =
378+ *ₙₚ-hom (-ₙ 1n) p x ρ
377379 ∙ ap₂ R._*_ (-ₙ-hom 1n ρ ∙ ap R.-_ (1n-hom ρ)) refl
378380 ∙ R.*-negatel ∙ ap R.-_ R.*-idl
379381 -ₙ-hom (con x) ρ = ℤ↪R.pres-neg {x = lift x}
380382 -ₙ-hom (poly x) ρ = -ₚ-hom x ρ
381383
382384 sound-coe
383385 : ∀ {n} (c : Int) (ρ : Vec R n) → En (normal-coe c) ρ ≡ embed-coe c
384- sound-coe c [] = refl
385- sound-coe c (x ∷ ρ) = ∅*x+ₙ-hom (normal-coe c) x ρ ∙ sound-coe c ρ
386+ sound-coe c v with vec-view v
387+ ... | [] = refl
388+ ... | (x ∷ ρ) = ∅*x+ₙ-hom (normal-coe c) x ρ ∙ sound-coe c ρ
386389
387390 sound-var : ∀ {n} (j : Fin n) ρ → En (normal-var j) ρ ≡ lookup ρ j
388- sound-var i _ with fin-view i
389- sound-var _ (x ∷ ρ) | zero =
390- Ep (∅ *x+ 1n) (x ∷ ρ) R.* x R.+ En 0n ρ ≡⟨ R.elimr (0n-hom ρ) ⟩
391- ⌜ Ep (∅ *x+ 1n) (x ∷ ρ) ⌝ R.* x ≡⟨ ap! (R.eliml R.*-zerol ∙ 1n-hom ρ) ⟩
392- R.1r R.* x ≡⟨ R.*-idl ⟩
393- x ∎
394- sound-var _ (x ∷ ρ) | suc j = ∅*x+ₙ-hom (normal-var j) x ρ ∙ sound-var j ρ
391+ sound-var i v with vec-view v | fin-view i
392+ ... | (x ∷ ρ) | zero =
393+ Ep (∅ *x+ 1n) (x ∷v ρ) R.* x R.+ En 0n ρ ≡⟨ R.elimr (0n-hom ρ) ⟩
394+ ⌜ Ep (∅ *x+ 1n) (x ∷v ρ) ⌝ R.* x ≡⟨ ap! (R.eliml R.*-zerol ∙ 1n-hom ρ) ⟩
395+ R.1r R.* x ≡⟨ R.*-idl ⟩
396+ x ∎
397+ ... | (x ∷ ρ) | suc j = ∅*x+ₙ-hom (normal-var j) x ρ ∙ sound-var j ρ
395398
396399 sound : ∀ {n} (p : Polynomial n) ρ → En (normal p) ρ ≡ ⟦ p ⟧ ρ
397400 sound (op [+] p q) ρ = +ₙ-hom (normal p) (normal q) ρ ∙ ap₂ R._+_ (sound p ρ) (sound q ρ)
@@ -411,11 +414,11 @@ module Impl {ℓ} {R : Type ℓ} (cring : CRing-on R) where
411414 private
412415 test-distrib : ∀ x y z → x R.* (y R.+ z) ≡ y R.* x R.+ z R.* x
413416 test-distrib x y z =
414- solve (var 0 :* (var 1 :+ var 2 )) ((var 1 :* var 0 ) :+ (var 2 :* var 0 )) (x ∷ y ∷ z ∷ [ ]) refl
417+ solve (var 0 :* (var 1 :+ var 2 )) ((var 1 :* var 0 ) :+ (var 2 :* var 0 )) ([ x , y , z ]) refl
415418
416419 test-identities : ∀ x → x R.+ (R.0r R.* R.1r) ≡ (R.1r R.+ R.0r) R.* x
417420 test-identities x =
418- solve (var 0 :+ (con 0 :* con 1 )) ((con 1 :+ con 0 ) :* var 0 ) (x ∷ []) refl
421+ solve (var 0 :+ (con 0 :* con 1 )) ((con 1 :+ con 0 ) :* var 0 ) [ x ] refl
419422
420423module Explicit {ℓ} (R : CRing ℓ) where
421424 private module I = Impl (R .snd)
0 commit comments