/
HomEq.lean
133 lines (108 loc) · 2.61 KB
/
HomEq.lean
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import Cat.Fam.Comp
/-! # Equivalence for category arrows in terms of the corresponding setoid -/
namespace Cat
/-- A proof that `f` is equivalent to `g` (`≋`, `\~~~`). -/
inductive Fam.Cat.Hom.Equiv
{ℂ : Cat}
{α β : ℂ.Obj}
(f : α ↠ β)
: {γ δ : ℂ.Obj}
→ (γ ↠ δ)
→ Prop
where
| proof :
(g : α ↠ β)
→ f ≈ g
→ @Equiv ℂ α β f α β g
/-- Predicate for *"`f` and `g` are equivalent"* (`≋`, `\~~~`). -/
abbrev Fam.Cat.Hom.Equiv.equiv
{ℂ : Cat}
{α β γ δ : ℂ.Obj}
(f : α ↠ β)
(g : γ ↠ δ)
: Prop :=
@Equiv ℂ α β f γ δ g
infix:30 " ≋ " =>
Fam.Cat.Hom.Equiv.equiv
def Fam.Cat.Hom.Equiv.domEq
{ℂ : Cat}
{α β γ δ : ℂ.Obj}
{f : α ↠ β}
{g : γ ↠ δ}
(h : f ≋ g)
: γ = α :=
by
cases h with
| proof _ _ =>
rfl
def Fam.Cat.Hom.Equiv.codEq
{ℂ : Cat}
{α β γ δ : ℂ.Obj}
{f : α ↠ β}
{g : γ ↠ δ}
(h : f ≋ g)
: δ = β :=
by
cases h with
| proof _ _ =>
rfl
def Fam.Cat.Hom.Equiv.toEq
{ℂ : Cat}
{α β : ℂ.Obj}
{f : α ↠ β}
{g : α ↠ β}
(h : f ≋ g)
: (f ≈ g) :=
match h with
| proof _ eq =>
eq
/-! ## `Fam.Cat.Hom.Equiv` is an equivalence relation
We cannot build an `Equivalence` though, as it takes a `r : α → α → Prop`. `Equiv`'s arguments do
not have the same type in general `:/`.
We can still prove that `Equiv` is reflexive, symmetric and transitive so let's just do that.
-/
namespace Fam.Cat.Hom.Equiv
theorem refl
{ℂ : Cat}
{α β : ℂ.Obj}
(f : α ↠ β)
: f ≋ f :=
let eq_f :=
ℂ.Hom α β |>.refl f
proof f eq_f
theorem symm
{ℂ : Cat}
{α₁ β₁ α₂ β₂ : ℂ.Obj}
(f₁ : α₁ ↠ β₁)
(f₂ : α₂ ↠ β₂)
: f₁ ≋ f₂ → f₂ ≋ f₁ :=
by
intro h
cases h
apply proof
apply ℂ.Hom α₁ β₁ |>.symm
assumption
theorem trans
{ℂ : Cat}
{α₁ β₁ α₂ β₂ α₃ β₃ : ℂ.Obj}
{f₁ : α₁ ↠ β₁}
{f₂ : α₂ ↠ β₂}
{f₃ : α₃ ↠ β₃}
: f₁ ≋ f₂ → f₂ ≋ f₃ → f₁ ≋ f₃ :=
by
intro h₁₂ h₂₃
cases h₁₂ ; cases h₂₃
apply proof
apply ℂ.Hom α₁ β₁ |>.trans
<;> assumption
end Fam.Cat.Hom.Equiv
instance instTransHomEq
{ℂ : Fam.Cat}
{α₁ β₁ α₂ β₂ α₃ β₃ : ℂ.Obj}
: Trans
(@Fam.Cat.Hom.Equiv.equiv ℂ α₁ β₁ α₂ β₂)
(@Fam.Cat.Hom.Equiv.equiv ℂ α₂ β₂ α₃ β₃)
(@Fam.Cat.Hom.Equiv.equiv ℂ α₁ β₁ α₃ β₃)
where
trans :=
Fam.Cat.Hom.Equiv.trans