私は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
の定義は穴で拡張されていません。
私は何か愚かなことをしていますか?
EDIT:私はAgda 2.5.1.1と標準ライブラリバージョン0.12を使用しています。
あなたの答えをありがとう!私はいつもAgdaのレコード/モジュールシステムに困惑しています。 –