Застрял на простом доказательстве равенства
Я пытаюсь реализовать некоторые матричные операции и доказательства вокруг них в Агде. Код включает в себя что-то около следующих определений:
open import Algebra
open import Data.Nat hiding (_+_ ; _*_)
open import Data.Vec
open import Relation.Binary.PropositionalEquality
module Teste {l l'}(cr : CommutativeSemiring l l') where
open CommutativeSemiring cr hiding (refl)
_×_ : ℕ → ℕ → Set l
n × m = Vec (Vec Carrier m) n
null : {n m : ℕ} → n × m
null = replicate (replicate 0#)
infixl 7 _∔_
_∔_ : {n m : ℕ} → n × m → n × m → n × m
[] ∔ [] = []
(xs ∷ xss) ∔ (ys ∷ yss) = zipWith _+_ xs ys ∷ xss ∔ yss
Я определил тип данных для матриц, используя векторы и определить null
матрица и матрица сложения. Я хочу доказать, что null
это левая единица добавления матрицы:
null-left-id-∔ : ∀ {n m : ℕ} → (xss : n × m) → (null {n} {m}) ∔ xss ≡ xss
Я попытался определить его по индукции по матричным индексам следующим образом:
null-left-id-∔ : ∀ {n m : ℕ} → (xss : n × m) → (null {n} {m}) ∔ xss ≡ xss
null-left-id-∔ {zero} {zero} [] = refl
null-left-id-∔ {zero} {suc m} xss = {!!}
null-left-id-∔ {suc n} {zero} xss = {!!}
null-left-id-∔ {suc n} {suc m} xss = {!!}
но во всех дырах функция null
не расширен поскольку null
определяется с помощью replicate
и он использует рекурсию по натуральным числам, я ожидал, что сопоставление по индексам матрицы приведет к снижению на null
определение.
Просто чтобы упомянуть, я также пытался определить такое доказательство индукцией по матричной структуре (рекурсией по xss
). Опять же, null
определение не раскрывается в дырах.
Я делаю что-то глупое?
РЕДАКТИРОВАТЬ: я использую Agda 2.5.1.1 и стандартную библиотеку версии 0.12.
1 ответ
Я думаю, что вы проверяете отверстия с C-c C-,
а также C-c C-.
которые не выполняют полную нормализацию. Пытаться C-u C-u C-c C-,
а также C-u C-u C-c C-.
вместо.
Индукция на xss
почти работает:
zipWith-+-replicate-0# : ∀ {n} → (xs : Vec Carrier n) → zipWith _+_ (replicate 0#) xs ≡ xs
zipWith-+-replicate-0# [] = refl
zipWith-+-replicate-0# (x ∷ xs) = cong₂ _∷_ {!!} (zipWith-+-replicate-0# xs)
null-left-id-∔ : ∀ {n m} → (xss : n × m) → null ∔ xss ≡ xss
null-left-id-∔ [] = refl
null-left-id-∔ (xs ∷ xss) = cong₂ _∷_ (zipWith-+-replicate-0# xs) (null-left-id-∔ xss)
Но ваше равенство _≈_
- нет _≡_
так что вы не можете доказать 0# + x ≡ x
, Вы должны использовать равенство из Data.Vec.Equality
модуль, но это более многословно:
open Equality
(record { Carrier = Carrier
; _≈_ = _≈_
; isEquivalence = isEquivalence
})
renaming (_≈_ to _≈ᵥ_)
zipWith-+-replicate-0# : ∀ {n} → (xs : Vec Carrier n) → zipWith _+_ (replicate 0#) xs ≈ᵥ xs
zipWith-+-replicate-0# [] = []-cong
zipWith-+-replicate-0# (x ∷ xs) = IsCommutativeMonoid.identityˡ +-isCommutativeMonoid _
∷-cong zipWith-+-replicate-0# xs
private open module Dummy {m} = Equality
(record { Carrier = Vec Carrier m
; _≈_ = λ xs ys -> xs ≈ᵥ ys
; isEquivalence = record
{ refl = refl _
; sym = Equality.sym _
; trans = Equality.trans _
}
})
renaming (_≈_ to _≈ᵥᵥ_)
null-left-id-∔ : ∀ {n m} → (xss : n × m) → null ∔ xss ≈ᵥᵥ xss
null-left-id-∔ [] = Equality.[]-cong
null-left-id-∔ (xs ∷ xss) = zipWith-+-replicate-0# xs Equality.∷-cong null-left-id-∔ xss