Учитывая определение натуральных чисел по Пеано:
data ℕ : Set where
zero : ℕ
suc : ℕ → ℕ
_+_ : ℕ → ℕ → ℕ
zero + n = n
(suc m) + n = suc (m + n)
Мы можем различными способами доказать свойство ∀ (m : ℕ) → zero + m ≡ m + zero
.
Например:
comm-+₀ : ∀ (m : ℕ) → zero + m ≡ m + zero
comm-+₀ zero = refl
comm-+₀ (suc n) =
begin
zero + suc n
≡⟨⟩
zero + suc (zero + n)
≡⟨⟩
suc (zero + n)
≡⟨ cong suc (comm-+₀ n) ⟩
suc (n + zero)
≡⟨⟩
suc n + zero
∎
И более компактно:
comm-+₀ : ∀ (m : ℕ) → zero + m ≡ m + zero
comm-+₀ zero = refl
comm-+₀ (suc n) = cong suc (comm-+₀ n)
Если мы хотим, мы можем даже использовать rewrite
и для go cong
:
comm-+₀ : ∀ (m : ℕ) → zero + m ≡ m + zero
comm-+₀ zero = refl
comm-+₀ (suc n) rewrite comm-+₀ n = refl
Но подождите! Это не работает Agda скажет нам, что выражение неверно, потому что не может доказать следующее:
suc (n + 0) ≡ suc (n + 0 + 0)
Если мы представим Agda симметричное переписывание свойства, sym (comm-+₀ n)
, оно выполнит проверку без ошибок.
Итак, мой вопрос: зачем нам sym
в этом случае? Доказательство прекрасно работало без других стратегий. Работает ли перезапись одновременно на обеих сторонах, а не только на левой?