diff options
Diffstat (limited to 'Data/Matrix/Core.agda')
| -rw-r--r-- | Data/Matrix/Core.agda | 272 |
1 files changed, 57 insertions, 215 deletions
diff --git a/Data/Matrix/Core.agda b/Data/Matrix/Core.agda index d97cb20..4ef57fb 100644 --- a/Data/Matrix/Core.agda +++ b/Data/Matrix/Core.agda @@ -9,18 +9,18 @@ import Data.Vec.Relation.Binary.Equality.Setoid as PW-≈ import Data.Vec.Relation.Binary.Pointwise.Inductive as PW import Relation.Binary.Reasoning.Setoid as ≈-Reasoning +open import Data.Matrix.Raw as Raw using (_∥_; _≑_; _∷ᵥ_; _∷ₕ_; headₕ; tailₕ; headᵥ; tailᵥ; _ᵀ) open import Data.Matrix.Vec using (transpose) open import Data.Nat using (ℕ; _+_) -open import Data.Vec as Vec using (Vec; map; zipWith; head; tail; replicate) +open import Data.Vec as Vec using (map; zipWith; head; tail; replicate) open import Data.Vec.Properties using (map-cong; map-id) -open import Data.Vector.Core S using (Vector; Vectorₛ; _++_; ⟨⟩; ⟨⟩-!; _≊_) +open import Data.Vector.Core S using (Vector; Vectorₛ; _≊_) -- ; _++_; ⟨⟩; ⟨⟩-!) open import Data.Vector.Vec using (zipWith-map; replicate-++) open import Function using (id) open import Relation.Binary.PropositionalEquality as ≡ using (_≡_; module ≡-Reasoning) open Setoid S open ℕ -open Vec.Vec private variable @@ -31,111 +31,22 @@ private module PW-≊ {n} = PW-≈ (Vectorₛ n) +open Raw.FixedBase Carrier using (Matrix) public + opaque - -- Matrices over a setoid - Matrix : Rel ℕ c - Matrix n m = Vec (Vector n) m + unfolding Raw.PW -- Pointwise equality of matrices _≋_ : Rel (Matrix n m) (c ⊔ ℓ) - _≋_ {n} {m} A B = A PW-≊.≋ B + _≋_ = Raw.PW _≈_ + + infix 4 _≋_ -- Pointwise equivalence is an equivalence relation ≋-isEquiv : IsEquivalence (_≋_ {n} {m}) ≋-isEquiv {n} {m} = PW-≊.≋-isEquivalence m - mapRows : (Vector n → Vector m) → Matrix n p → Matrix m p - mapRows = map - - _∥_ : Matrix A C → Matrix B C → Matrix (A + B) C - _∥_ M N = zipWith _++_ M N - - infixr 7 _∥_ - - _≑_ : Matrix A B → Matrix A C → Matrix A (B + C) - _≑_ M N = M Vec.++ N - - infixr 6 _≑_ - - _∷ᵥ_ : Vector A → Matrix A B → Matrix A (suc B) - _∷ᵥ_ V M = V Vec.∷ M - - infixr 5 _∷ᵥ_ - - opaque - - unfolding Vector - - _∷ₕ_ : Vector B → Matrix A B → Matrix (suc A) B - _∷ₕ_ V M = zipWith _∷_ V M - - infixr 5 _∷ₕ_ - - ∷ₕ-cong : {V V′ : Vector B} {M M′ : Matrix A B} → V ≊ V′ → M ≋ M′ → V ∷ₕ M ≋ V′ ∷ₕ M′ - ∷ₕ-cong PW.[] PW.[] = PW.[] - ∷ₕ-cong (≈x PW.∷ ≊V) (≊M₀ PW.∷ ≋M) = (≈x PW.∷ ≊M₀) PW.∷ (∷ₕ-cong ≊V ≋M) - - headₕ : Matrix (suc A) B → Vector B - headₕ M = map Vec.head M - - tailₕ : Matrix (suc A) B → Matrix A B - tailₕ M = map Vec.tail M - - head-∷-tailₕ : (M : Matrix (suc A) B) → headₕ M ∷ₕ tailₕ M ≡ M - head-∷-tailₕ M = begin - zipWith _∷_ (map Vec.head M) (map Vec.tail M) ≡⟨ zipWith-map head tail _∷_ M ⟩ - map (λ x → head x ∷ tail x) M ≡⟨ map-cong (λ { (_ ∷ _) → ≡.refl }) M ⟩ - map id M ≡⟨ map-id M ⟩ - M ∎ - where - open ≡-Reasoning - - []ᵥ : Matrix 0 B - []ᵥ = replicate _ [] - - []ᵥ-! : (E : Matrix 0 B) → E ≡ []ᵥ - []ᵥ-! [] = ≡.refl - []ᵥ-! ([] ∷ E) = ≡.cong ([] ∷_) ([]ᵥ-! E) - - []ᵥ-≑ : []ᵥ {A} ≑ []ᵥ {B} ≡ []ᵥ - []ᵥ-≑ {A} {B} = replicate-++ A B [] - - []ᵥ-∥ : (M : Matrix A B) → []ᵥ ∥ M ≡ M - []ᵥ-∥ [] = ≡.refl - []ᵥ-∥ (M₀ ∷ M) = ≡.cong (M₀ ∷_) ([]ᵥ-∥ M) - - ∷ₕ-∥ : (V : Vector C) (M : Matrix A C) (N : Matrix B C) → V ∷ₕ (M ∥ N) ≡ (V ∷ₕ M) ∥ N - ∷ₕ-∥ [] [] [] = ≡.refl - ∷ₕ-∥ (x ∷ V) (M₀ ∷ M) (N₀ ∷ N) = ≡.cong ((x ∷ M₀ ++ N₀) ∷_) (∷ₕ-∥ V M N) - - ∷ₕ-≑ : (V : Vector A) (W : Vector B) (M : Matrix C A) (N : Matrix C B) → (V ++ W) ∷ₕ (M ≑ N) ≡ (V ∷ₕ M) ≑ (W ∷ₕ N) - ∷ₕ-≑ [] W [] N = ≡.refl - ∷ₕ-≑ (x ∷ V) W (M₀ ∷ M) N = ≡.cong ((x ∷ M₀) ∷_) (∷ₕ-≑ V W M N) - - headᵥ : Matrix A (suc B) → Vector A - headᵥ (V ∷ _) = V - - tailᵥ : Matrix A (suc B) → Matrix A B - tailᵥ (_ ∷ M) = M - - head-∷-tailᵥ : (M : Matrix A (suc B)) → headᵥ M ∷ᵥ tailᵥ M ≡ M - head-∷-tailᵥ (_ ∷ _) = ≡.refl - - []ₕ : Matrix A 0 - []ₕ = [] - - []ₕ-! : (E : Matrix A 0) → E ≡ []ₕ - []ₕ-! [] = ≡.refl - - []ₕ-≑ : (M : Matrix A B) → []ₕ ≑ M ≡ M - []ₕ-≑ _ = ≡.refl - - ∷ᵥ-≑ : (V : Vector A) (M : Matrix A B) (N : Matrix A C) → V ∷ᵥ (M ≑ N) ≡ (V ∷ᵥ M) ≑ N - ∷ᵥ-≑ V M N = ≡.refl - -infix 4 _≋_ - module ≋ {n} {m} = IsEquivalence (≋-isEquiv {n} {m}) Matrixₛ : ℕ → ℕ → Setoid c (c ⊔ ℓ) @@ -147,120 +58,51 @@ Matrixₛ n m = record opaque - unfolding Vector - - head′ : Vector (suc A) → Carrier - head′ = head - - head-cong : {V V′ : Vector (suc A)} → V ≊ V′ → head′ V ≈ head′ V′ - head-cong (≈x PW.∷ _) = ≈x - - tail′ : Vector (suc A) → Vector A - tail′ = tail - - tail-cong : {V V′ : Vector (suc A)} → V ≊ V′ → tail′ V ≊ tail′ V′ - tail-cong (_ PW.∷ ≊V) = ≊V - -opaque - - unfolding headₕ head′ - - ≋headₕ : {M M′ : Matrix (suc A) B} → M ≋ M′ → headₕ M ≊ headₕ M′ - ≋headₕ M≋M′ = PW.map⁺ head-cong M≋M′ - - ≋tailₕ : {M M′ : Matrix (suc A) B} → M ≋ M′ → tailₕ M ≋ tailₕ M′ - ≋tailₕ M≋M′ = PW.map⁺ tail-cong M≋M′ - -opaque - unfolding _≋_ _∥_ []ᵥ _∷ₕ_ - ∥-cong : {M M′ : Matrix A C} {N N′ : Matrix B C} → M ≋ M′ → N ≋ N′ → M ∥ N ≋ M′ ∥ N′ - ∥-cong {zero} {C} {B} {M} {M′} {N} {N′} ≋M ≋N - rewrite []ᵥ-! M - rewrite []ᵥ-! M′ = begin - ([]ᵥ ∥ N) ≡⟨ []ᵥ-∥ N ⟩ - N ≈⟨ ≋N ⟩ - N′ ≡⟨ []ᵥ-∥ N′ ⟨ - ([]ᵥ ∥ N′) ∎ - where - open ≈-Reasoning (Matrixₛ _ _) - ∥-cong {suc A} {C} {B} {M} {M′} {N} {N′} ≋M ≋N - rewrite ≡.sym (head-∷-tailₕ M) - using M₀ ← headₕ M - using M- ← tailₕ M - rewrite ≡.sym (head-∷-tailₕ M′) - using M₀′ ← headₕ M′ - using M-′ ← tailₕ M′ = begin - (M₀ ∷ₕ M-) ∥ N ≡⟨ ∷ₕ-∥ M₀ M- N ⟨ - M₀ ∷ₕ M- ∥ N ≈⟨ ∷ₕ-cong ≊M₀ (∥-cong ≋M- ≋N) ⟩ - M₀′ ∷ₕ M-′ ∥ N′ ≡⟨ ∷ₕ-∥ M₀′ M-′ N′ ⟩ - (M₀′ ∷ₕ M-′) ∥ N′ ∎ - where - ≊M₀ : M₀ ≊ M₀′ - ≊M₀ = begin - headₕ M ≡⟨ ≡.cong headₕ (head-∷-tailₕ M) ⟨ - headₕ (M₀ ∷ₕ M-) ≈⟨ ≋headₕ ≋M ⟩ - headₕ (M₀′ ∷ₕ M-′) ≡⟨ ≡.cong headₕ (head-∷-tailₕ M′) ⟩ - headₕ M′ ∎ - where - open ≈-Reasoning (Vectorₛ _) - ≋M- : M- ≋ M-′ - ≋M- = begin - tailₕ M ≡⟨ ≡.cong tailₕ (head-∷-tailₕ M) ⟨ - tailₕ (M₀ ∷ₕ M-) ≈⟨ ≋tailₕ ≋M ⟩ - tailₕ (M₀′ ∷ₕ M-′) ≡⟨ ≡.cong tailₕ (head-∷-tailₕ M′) ⟩ - tailₕ M′ ∎ - where - open ≈-Reasoning (Matrixₛ _ _) - open ≈-Reasoning (Matrixₛ _ _) - -opaque - unfolding _≑_ - ≑-cong : {M M′ : Matrix A B} {N N′ : Matrix A C} → M ≋ M′ → N ≋ N′ → M ≑ N ≋ M′ ≑ N′ - ≑-cong PW.[] ≋N = ≋N - ≑-cong (M₀≊M₀′ PW.∷ ≋M) ≋N = M₀≊M₀′ PW.∷ ≑-cong ≋M ≋N - -opaque - - unfolding Matrix - - _ᵀ : Matrix n m → Matrix m n - _ᵀ [] = []ᵥ - _ᵀ (M₀ ∷ M) = M₀ ∷ₕ M ᵀ - - infix 10 _ᵀ - - -ᵀ-cong : {M₁ M₂ : Matrix n m} → M₁ ≋ M₂ → M₁ ᵀ ≋ M₂ ᵀ - -ᵀ-cong PW.[] = ≋.refl - -ᵀ-cong (≊M₀ PW.∷ ≋M) = ∷ₕ-cong ≊M₀ (-ᵀ-cong ≋M) - - opaque - - unfolding []ᵥ []ₕ - - []ᵥ-ᵀ : []ᵥ ᵀ ≡ []ₕ {A} - []ᵥ-ᵀ {zero} = ≡.refl - []ᵥ-ᵀ {suc A} = ≡.cong (zipWith _∷_ []) ([]ᵥ-ᵀ) - - opaque - - unfolding _∷ₕ_ Vector - - ∷ₕ-ᵀ : (V : Vector A) (M : Matrix B A) → (V ∷ₕ M) ᵀ ≡ V ∷ᵥ M ᵀ - ∷ₕ-ᵀ [] [] = ≡.refl - ∷ₕ-ᵀ (x ∷ V) (M₀ ∷ M) = ≡.cong ((x ∷ M₀) ∷ₕ_) (∷ₕ-ᵀ V M) - - ∷ᵥ-ᵀ : (V : Vector B) (M : Matrix B A) → (V ∷ᵥ M) ᵀ ≡ V ∷ₕ M ᵀ - ∷ᵥ-ᵀ V M = ≡.refl - - opaque - - _ᵀᵀ : (M : Matrix n m) → M ᵀ ᵀ ≡ M - _ᵀᵀ [] = []ᵥ-ᵀ - _ᵀᵀ (M₀ ∷ M) = begin - (M₀ ∷ₕ M ᵀ) ᵀ ≡⟨ ∷ₕ-ᵀ M₀ (M ᵀ) ⟩ - M₀ ∷ᵥ M ᵀ ᵀ ≡⟨ ≡.cong (M₀ ∷ᵥ_) (M ᵀᵀ) ⟩ - M₀ ∷ᵥ M ∎ - where - open ≡-Reasoning - - infix 10 _ᵀᵀ + unfolding _≋_ + + ∥-cong + : {M₁ M₂ : Matrix A C} + {N₁ N₂ : Matrix B C} + → M₁ ≋ M₂ + → N₁ ≋ N₂ + → M₁ ∥ N₁ ≋ M₂ ∥ N₂ + ∥-cong = Raw.Relation.R-∥ + + ≑-cong + : {M₁ M₂ : Matrix A B} + {N₁ N₂ : Matrix A C} + → M₁ ≋ M₂ + → N₁ ≋ N₂ + → M₁ ≑ N₁ ≋ M₂ ≑ N₂ + ≑-cong = Raw.Relation.R-≑ + + ∷ᵥ-cong + : {V₁ V₂ : Vector n} + {M₁ M₂ : Matrix n m} + → V₁ ≊ V₂ + → M₁ ≋ M₂ + → V₁ ∷ᵥ M₁ ≋ V₂ ∷ᵥ M₂ + ∷ᵥ-cong = Raw.Relation.R-∷ᵥ + + ∷ₕ-cong + : {V₁ V₂ : Vector n} + {M₁ M₂ : Matrix m n} + → V₁ ≊ V₂ + → M₁ ≋ M₂ + → V₁ ∷ₕ M₁ ≋ V₂ ∷ₕ M₂ + ∷ₕ-cong = Raw.Relation.R-∷ₕ + + headₕ-cong : {M₁ M₂ : Matrix (suc n) m} → M₁ ≋ M₂ → headₕ M₁ ≊ headₕ M₂ + headₕ-cong = Raw.Relation.R-headₕ + + tailₕ-cong : {M₁ M₂ : Matrix (suc n) m} → M₁ ≋ M₂ → tailₕ M₁ ≋ tailₕ M₂ + tailₕ-cong = Raw.Relation.R-tailₕ + + headᵥ-cong : {M₁ M₂ : Matrix n (suc m)} → M₁ ≋ M₂ → headᵥ M₁ ≊ headᵥ M₂ + headᵥ-cong = Raw.Relation.R-headᵥ + + tailᵥ-cong : {M₁ M₂ : Matrix n (suc m)} → M₁ ≋ M₂ → tailᵥ M₁ ≋ tailᵥ M₂ + tailᵥ-cong = Raw.Relation.R-tailᵥ + + ᵀ-cong : {M₁ M₂ : Matrix n m} → M₁ ≋ M₂ → M₁ ᵀ ≋ M₂ ᵀ + ᵀ-cong = Raw.Relation.R-ᵀ |
