28 lines
795 B
Text
28 lines
795 B
Text
private def eqv (p₁ p₂ : α × α) : Prop :=
|
||
(p₁.1 = p₂.1 ∧ p₁.2 = p₂.2) ∨ (p₁.1 = p₂.2 ∧ p₁.2 = p₂.1)
|
||
|
||
infix:50 " ~ " => eqv
|
||
|
||
axiom eqv.refl {α} (p : α × α) : p ~ p
|
||
|
||
axiom eqv.symm {α} : ∀ {p₁ p₂ : α × α}, p₁ ~ p₂ → p₂ ~ p₁
|
||
|
||
axiom eqv.trans {α} : ∀ {p₁ p₂ p₃ : α × α}, p₁ ~ p₂ → p₂ ~ p₃ → p₁ ~ p₃
|
||
|
||
private theorem is_equivalence : Equivalence (@eqv α) :=
|
||
{ refl := eqv.refl, symm := eqv.symm, trans := eqv.trans }
|
||
|
||
instance uprodSetoid (α : Type u) : Setoid (α × α) where
|
||
r := eqv
|
||
iseqv := is_equivalence
|
||
|
||
def UProd (α : Type u) : Type u :=
|
||
Quotient (uprodSetoid α)
|
||
|
||
namespace UProd
|
||
|
||
@[noinline] def myId := @id
|
||
|
||
def mk' {α : Type} : α × α → UProd α :=
|
||
let f := @Quot.mk _ _
|
||
myId f
|