Zulip Chat Archive
Stream: Equational
Topic: 854 formalization experiment
Michael Bucko (Nov 24 2024 at 15:22):
I wrote this lemma today - for 854. @Mario Carneiro kindly reviewed the proof (thank you for that!), and says it's correct.
import Mathlib
import Lean
universe u
variable {α : Type u}
variable (op : α → α → α)
def associativity : Prop :=
∀ a b c : α, op a (op b c) = op (op a b) c
def idempotence : Prop :=
∀ a : α, op a a = a
def commutativity : Prop :=
∀ a b : α, op a b = op b a
lemma op_self_left (h_assoc : associativity op) (h_idem : idempotence op) :
∀ a b : α, op a (op a b) = op a b :=
λ a b =>
calc
op a (op a b) = op (op a a) b := by rw [←h_assoc a a b]
_ = op a b := by rw [h_idem a]
lemma op_self_right (h_assoc : associativity op) (h_idem : idempotence op) :
∀ a b : α, op (op a b) b = op a b :=
λ a b =>
calc
op (op a b) b = op a (op b b) := by rw [h_assoc a b b]
_ = op a b := by rw [h_idem b]
lemma op_cancel_right (h_assoc : associativity op) (h_idem : idempotence op) (h_comm : commutativity op) :
∀ x z : α, op z (op x z) = op x z :=
λ x z =>
calc
op z (op x z) = op z (op z x) := by rw [h_comm x z]
_ = op (op z z) x := by rw [h_assoc z z x]
_ = op z x := by rw [h_idem z]
_ = op x z := by rw [h_comm z x]
lemma op_nested_eq (h_assoc : associativity op) (h_idem : idempotence op) (h_comm : commutativity op) :
∀ x y z : α, op (op y z) (op x z) = op (op x y) z :=
λ x y z =>
calc
op (op y z) (op x z) = op y (op z (op x z)) := by rw [h_assoc y z (op x z)]
_ = op y (op x z) := by rw [op_cancel_right op h_assoc h_idem h_comm x z]
_ = op (op y x) z := by rw [h_assoc y x z]
_ = op (op x y) z := by rw [h_comm y x]
lemma simplify_op_expression (h_assoc : associativity op) (h_idem : idempotence op) (h_comm : commutativity op) :
∀ x y z : α, op x (op (op y z) (op x z)) = op (op x y) z :=
λ x y z =>
calc
op x (op (op y z) (op x z)) = op x (op (op x y) z) := by rw [op_nested_eq op h_assoc h_idem h_comm x y z]
_ = op (op x (op x y)) z := by rw [h_assoc x (op x y) z]
_ = op (op x y) z := by rw [op_self_left op h_assoc h_idem x y]
Michael Bucko (Nov 24 2024 at 19:58):
Naming is probably wrong and the simp tag is missing (perhaps more), but the proof works.
import Mathlib
lemma ramanujan_1729_one_mul_one_mul_self
{α : Type u}
(op : α → α → α)
(e x y : α)
(h_id : ∀ a, op e a = a ∧ op a e = a)
(heq : e = y) :
x = op y (op (op y x) y) := by
have h_id_y : ∀ a, op y a = a ∧ op a y = a := by
intro a
rw [← heq]
exact h_id a
have hyx : op y x = x := (h_id_y x).1
have hxy : op x y = x := (h_id_y x).2
have h1 : op (op y x) y = x := by
rw [hyx]
rw [hxy]
have h2 : op y (op (op y x) y) = x := by
rw [h1]
rw [hyx]
exact h2.symm
Last updated: May 02 2025 at 03:31 UTC