open import Level using (Level; levelOfType) open import Function open import Data.Nat as ℕ using (ℕ) import Data.Nat.Properties as ℕ open import Data.Sum open import Data.Fin open import Data.Vec.Functional open import Data.Vec.Functional.Properties hiding (++-cong) open import Data.Vec.Functional.Relation.Binary.Pointwise open import Relation.Binary.PropositionalEquality as ≡ hiding (refl) open import Relation.Binary open import Relation.Nullary open import Vector.Base using (swapV; _[_]≔_) module Vector.Setoid.Properties {a ℓ} (S : Setoid a ℓ) where open Setoid S renaming (Carrier to A) open import Data.Vec.Functional.Relation.Binary.Equality.Setoid S open import Relation.Binary.Reasoning.Setoid S private variable m n : ℕ module _ {m} {ys ys‵ : Vector A m} where ++-cong : ∀ {n} (xs xs‵ : Vector A n) → xs ≋ xs‵ → ys ≋ ys‵ → (xs ++ ys) ≋ (xs‵ ++ ys‵) ++-cong {n} xs xs‵ eq₁ eq₂ i with toℕ i ℕ.<? n ... | yes i<n = begin (xs ++ ys) i ≡⟨ lookup-++-< xs ys i i<n ⟩ xs (fromℕ< i<n) ≈⟨ eq₁ (fromℕ< i<n) ⟩ xs‵ (fromℕ< i<n) ≡˘⟨ lookup-++-< xs‵ ys‵ i i<n ⟩ (xs‵ ++ ys‵) i ∎ ... | no i≮n = begin (xs ++ ys) i ≡⟨ lookup-++-≥ xs ys i (ℕ.≮⇒≥ i≮n) ⟩ ys (reduce≥ i (ℕ.≮⇒≥ i≮n)) ≈⟨ eq₂ (reduce≥ i (ℕ.≮⇒≥ i≮n)) ⟩ ys‵ (reduce≥ i (ℕ.≮⇒≥ i≮n)) ≡˘⟨ lookup-++-≥ xs‵ ys‵ i (ℕ.≮⇒≥ i≮n) ⟩ (xs‵ ++ ys‵) i ∎ module _ {m} {ys : Vector A m} where ++-congʳ : ∀ {n} (xs xs‵ : Vector A n) → xs ≋ xs‵ → (xs ++ ys) ≋ (xs‵ ++ ys) ++-congʳ {n} xs xs‵ eq = ++-cong xs xs‵ eq ≋-refl []≔-cong : ∀ {x y} (x≈y : x ≈ y) {xs ys : Vector A n} (xs≋ys : xs ≋ ys) i → (xs [ i ]≔ x) ≋ (ys [ i ]≔ y) []≔-cong {x = x} {y} x≈y {xs} {ys} xs≋ys i j with j ≟ i ... | yes ≡.refl = begin (xs [ i ]≔ x) i ≡⟨ updateAt-updates i xs ⟩ x ≈⟨ x≈y ⟩ y ≡˘⟨ updateAt-updates i ys ⟩ (ys [ i ]≔ y) i ∎ ... | no j≢i = begin (xs [ i ]≔ x) j ≡⟨ updateAt-minimal j i xs j≢i ⟩ xs j ≈⟨ xs≋ys _ ⟩ ys j ≡˘⟨ updateAt-minimal j i ys j≢i ⟩ (ys [ i ]≔ y) j ∎