-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-- https://cjquines.com/files/binaryoperations.pdf
import Mathlib
example {α} (f : α → α → α) l r (hl : ∀ x, f l x = x) (hr : ∀ x, f x r = x) : l = r := by
have h₁ : f l r = l := by
grind
grind
example {α} [Nonempty α] (f : α → α → α) (h : ∀ x y, ∃ z, f x z = y ∧ ∀ z', f x z = f x z' → z = z') : ∃ g : α → α → α, ∀ x y, f x (g x y) = y ∧ g x (f x y) = y := by
let g x y := (f x).invFun y
use g
intro x y
constructor
have h₁ x : (f x).Surjective := by
intro y
specialize h x y
grind
apply Function.rightInverse_invFun (h₁ x)
have h₁ x : (f x).Injective := by
intro a b
specialize h x (f x a)
obtain ⟨a', ⟨h₂, h₃⟩⟩ := h
rw [← h₃ a h₂]
exact h₃ b
apply Function.leftInverse_invFun (h₁ x)
example {α} (f g : α → α → α) i j (hid : ∀ x, f i x = x ∧ f x i = x ∧ g j x = x ∧ g x j = x) (h : ∀ x y z w, f (g x y) (g z w) = g (f x z) (f y w)) : f = g := by
have h₁ x : f x j = x := by
specialize h x j j i
grind
have h₂ : i = j := by
specialize hid j
grind
have h₃ x y : f x y = g x y := by
specialize h x i i y
grind
grind