Zulip Chat Archive
Stream: new members
Topic: proof of neg_neg in Mathematics in Lean
Mike (Aug 26 2020 at 22:25):
Hi,
I'm trying to read through Mathematics in Lean and got stuck trying to prove
theorem neg_neg (a : R) : -(-a) = a :=
Here's what I attempted:
import algebra.ring
import tactic
variables {R : Type*} [ring R]
theorem neg_neg (a : R) : -(-a) = a :=
begin
have h₁ : -a + -(-a) = 0,
{apply sub_self},
have h₂ : a + -a = 0,
{apply sub_self},
rw add_comm at h₁,
rw h₁ at h₂,
apply add_right_cancel,
end
I thought that since h₁ and h₂ are both equations that are equal to zero, that I could (after commuting the addition in h₁ get the equation:
-(-a) + -a = a + -a
and then use add_right_cancel
to get -(-a) = a
.
I'd appreciate it if someone could let me know whether this a valid approach to proving this theorem. If it is, could you help me see what I'm doing wrong.
Thanks!
Mario Carneiro (Aug 26 2020 at 22:35):
Assuming that h2 says -(-a) + -a = a + -a
, to get from that to -(-a) = a
using add_right_cancel
is a forward reasoning step, so you should use have
instead of apply
Mario Carneiro (Aug 26 2020 at 22:36):
If you work backward from the goal using apply add_right_cancel
you will get the goal -(-a) + ?m_1 = a + ?m_1
, which is usable (you can finish with exact h2
) but a little confusing to work with
Mario Carneiro (Aug 26 2020 at 22:37):
because from this line alone it's not clear what you are cancelling (you are basically un-cancelling when you work backwards using this theorem)
Mario Carneiro (Aug 26 2020 at 22:38):
@Bryan Gin-ge Chen @Gabriel Ebner FYI the goal state here prints --a
. Should the pretty printer be taught that this is a bad idea?
Mario Carneiro (Aug 26 2020 at 22:40):
actually correction, the goal view correctly prints - -a
but the widget view prints --a
, so I guess I should ping @Edward Ayers instead
Mario Carneiro (Aug 26 2020 at 22:41):
Here's a corrected version of the proof using apply
:
theorem neg_neg' (a : R) : -(-a) = a :=
begin
have h₁ : -a + - -a = 0,
{apply sub_self},
have h₂ : a + -a = 0,
{apply sub_self},
rw add_comm at h₁,
rw ← h₂ at h₁,
apply add_right_cancel,
exact h₁
end
Mario Carneiro (Aug 26 2020 at 22:41):
note the somewhat weird state before the exact
Mario Carneiro (Aug 26 2020 at 22:42):
and here's a version using a forward reasoning step instead:
theorem neg_neg' (a : R) : -(-a) = a :=
begin
have h₁ : -a + - -a = 0,
{apply sub_self},
have h₂ : a + -a = 0,
{apply sub_self},
rw add_comm at h₁,
rw ← h₂ at h₁,
have h₁ := add_right_cancel h₁,
exact h₁
end
Mike (Aug 27 2020 at 13:38):
Thank you for explaining the difference between apply
using backward reasoning and have
using forward reasoning.
Last updated: Dec 20 2023 at 11:08 UTC