-
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
-- 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 : 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
grind [h x y]
apply Function.rightInverse_invFun (h₁ x)
· have h₁ x : (f x).Injective := by
intro a b
grind [h x (f x a)]
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 : i = j := by grind [hid j]
have {x y} : f x y = g x y := by grind [h x i i y]
grind