Setoid

Setoid は、与えられた型の上の同値関係を表します。具体的には、α : Type に対してインスタンス sa : Setoid α は、α 上の二項関係 r : α → α → Propr が同値関係であることの証明の組です。主として Quotient の引数として使用されます。

Setoid は、次のように定義されています。

/--
Setoidは、特定の同値関係(`≈`で表される)を持つ。
これは主に`Quotient`型への入力として使用される。
-/
class Setoid.{u} (α : Sort u) where
  /-- `α` 上の二項関係 -/
  r : α → α → Prop
  /-- `r` は同値関係 -/
  iseqv : Equivalence r

使用例

たとえば、ある型 α 上の関数 f : α → β が与えられていて β 上に同値関係 (· ≈ ·) が定義されているとします。このとき α 上の二項関係 rr a b := f a ≈ f b と定義すると、r は同値関係になります。

証明してみましょう。

section
  variable {α : Type} {β : Type}

  /-- `β` 上の二項関係から誘導される `α` 上の二項関係 -/
  def Rel.contra_map (f : α → β) (r : β → β → Prop) : α → α → Prop :=
    fun a₁ a₂ => r (f a₁) (f a₂)

  /-- `β` 上の同値関係から誘導される `α` 上の同値関係 -/
  def Setoid.contra_map (f : α → β) (sb : Setoid β) : Setoid α where
    r := Rel.contra_map f (· ≈ ·)
    iseqv := by
      constructor <;> dsimp [Rel.contra_map]

      -- 反射律
      case refl =>
        intro x
        apply Setoid.iseqv.refl

      -- 対称律
      case symm =>
        intro x y
        apply Setoid.iseqv.symm

      -- 推移律
      case trans =>
        intro x y z
        apply Setoid.iseqv.trans
end