Zulip Chat Archive

Stream: new members

Topic: Notation version theorem only compiled with extra theorems


Shanghe Chen (Mar 09 2024 at 08:14):

Hi when reading MIL§6 (continue Failed to write a*b on Group₁ but new topic for clearner context) I setup the class Group₂ as the tutorial

namespace Ex3
class Group₂ (α : Type u) where
  mul : α  α  α
  one : α
  inv : α  α
  mul_assoc :  x y z : α, mul (mul x y) z = mul x (mul y z)
  mul_left_one :  x : α, mul one x = x
  mul_left_inv :  x : α, mul (inv x) x = one

instance hasMulGroup₂ {α : Type u} [Group₂ α] : Mul α := Group₂.mul
instance hasOneGroup₂ {α : Type u} [Group₂ α] : One α := Group₂.one
instance hasInvGroup₂ {α : Type u} [Group₂ α] : Inv α := Group₂.inv
namespace Group₂

theorem self_mul_self_eq_self_imply_one [Group₂ α]:  x : α,  mul x x = x  x = one := by
    intro x h
    have h₁: mul (inv x) (mul x x) = one := by
      simp only [h, mul_left_inv]
    have h₂: mul (inv x) (mul x x) = x := by
      simp only [mul_assoc, mul_left_inv, mul_left_one]
    rw [h₂] at h₁
    exact h₁

theorem mul_left_inv' [Group₂ α]:  x : α, x⁻¹ * x = 1 := mul_left_inv
theorem mul_left_one' [Group₂ α]:  x : α, 1 * x = x := mul_left_one
theorem mul_assoc' [Group₂ α]:  x y z : α, (x * y) * z = x * (y * z) := mul_assoc

-- It succeeds only with the three theorems aobve rather than the three axioms in `Group₂`
theorem self_mul_self_eq_self_imply_one' [Group₂ α]:  x : α, x * x = x  x = 1 := by
    intro x h
    have h₁: x⁻¹ * (x * x) = 1 := by
      simp only [h, mul_left_inv']
    have h₂: x⁻¹ * (x * x) = x := by
      simp only [mul_assoc', mul_left_inv', mul_left_one']
    rw [h₂] at h₁
    exact h₁

end Group₂
end Ex3

Shanghe Chen (Mar 09 2024 at 08:17):

I found that I must supply extra theorems stated with notations like mul_left_inv' to prove theorem that uses these notations. Is this by design that when we introduce notations, we must duplicate the original theorems/axioms with a notatoned version? Or is it any option to control this behavior? I found that self_mul_self_eq_self_imply_one' failed if I use mul_left_inv rather than mul_left_inv' in the proof.

Kevin Buzzard (Mar 09 2024 at 08:54):

Unfortunately what you're seeing above is a common idiom in mathlib. One way around it in this case (which is also the way it's done in mathlib) is to make Group2 extend Mul, One etc, then you can use the notation in the axioms and don't have to do this

Kevin Buzzard (Mar 09 2024 at 08:59):

This is teaching you the difference between definitonal and syntactic equality. In practice mathlib has a chosen syntactic preference for saying any basic mathematical idea (so for example in group theory it's a * b rather than mul a b) and all the lemmas are written using this so-called normal form (other than the simp lemmas of the from non_normal form = normal form)

Shanghe Chen (Mar 09 2024 at 09:26):

Yeah I am getting some information about equality from xena too:smiling_face:


Last updated: May 02 2025 at 03:31 UTC