Agdaでかけ算の交換法則
Agdaでかけ算の交換法則を Day2-answer.agda を参考に書きました。というかそのまんま。名前は Programming Language Foundations in Agda に合わせたつもりです。理解のためになるべくていねいに書こうと思ったんですが、 *-suc と *-comm をばらそうとするとエラーになってしまってめんどくさくなってしまいました。 *-suc は先にlemmaが必要なんだろうな。 *-comm は「あっているはずなのに」と思うんですが通らない。基本がわかってないんですよね。 refl はたんに計算するだけで、 rewrite は suc n を n にしたらいいのかと思うんですけど。まあ、いちおう C-c, C-l で通ります。 import Relation.Binary.PropositionalEquality as Eq open Eq using (_≡_; refl; cong; sym) open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; step-≡; _∎) infixl 6 _+_ infixl 7 _*_ data ℕ : Set where zero : ℕ suc : ℕ → ℕ _+_ : ℕ → ℕ → ℕ zero + n = n (suc m) + n = suc (m + n) +-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p) +-assoc zero n p = begin (zero + n) + p ≡⟨⟩ n + p ≡⟨⟩ zero + (n + p) ∎ +-assoc (suc m) n p = begin (suc m + n) + p ≡⟨⟩ suc (m + n) + p ≡⟨⟩ suc ((m + n) + p) ≡⟨ cong suc (+-assoc m n p) ⟩ suc (m + (n + p)) ≡⟨⟩ suc m + (n + p) ∎ +-identityʳ : ∀ (m : ℕ) → m + zero ≡ m +-identity...