Я пытаюсь реализовать некоторые матричные операции и доказательства вокруг них в Agda. В коде есть что-то вроде следующих определений:
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.