Я пытаюсь доказать, что сложение является коммутативным в Агде, и я не могу заставить его работать. Вот соответствующий код с двумя неприятными целями внизу:
cong : ∀{A B : Set} (f : A → B) {x y : A} (eq : x ≡ y) → f x ≡ f y
cong f refl = refl
plus-assoc : ∀ x {y z} → (x + y) + z ≡ x + (y + z)
plus-assoc zero = refl
plus-assoc (suc x) = cong suc (plus-assoc x)
plus-zero : ∀ x → x + zero ≡ x
plus-zero zero = refl
plus-zero (suc x) rewrite plus-zero x = refl
plus-suc : ∀ x {y} → x + suc y ≡ suc (x + y)
plus-suc zero = refl
plus-suc (suc x) = cong suc (plus-suc x)
plus-comm : ∀ x {y} → x + y ≡ y + x
plus-comm zero = { }0
plus-comm (suc x) = { }1
Цель, которую находит Агда,
Goal: .y ≡ .y + zero
Это, очевидно, очень похоже на плюс-ноль, но если я не знаю, как переписать с .y.
Вторая цель
Goal: suc (x + .y) ≡ .y + suc x
——————————————————————————————————————————
.y : Nat
x : Nat
Если я попробую переписать с plus-suc, то вот так:
plus-comm (suc x) rewrite plus-suc x = { }1
Я получаю эту ошибку:
Cannot rewrite by equation of type {y : Nat} →
x + suc y ≡ suc (x + y)
when checking that the clause
plus-comm (suc x) rewrite plus-suc x = ? has type
(x : Nat) {y : Nat} → x + y ≡ y + x
Я не могу понять эту ошибку. Есть какие-нибудь подсказки? Я мог бы переписать все это без неявных переменных, поскольку это, кажется, усложняет ситуацию, но мне дали код как есть, и поэтому я хотел бы сохранить его, как есть, если это возможно.
Спасибо!