如何理解类别的Setoid定义?

时间:2016-11-06 02:20:29

标签: coq category-theory

我无法理解以下Coq定义的类别(已定义here),其中涉及Setoid。我不明白为什么Setoid是必要的或它在这里的作用。

Class Category O `{!Arrows O} `{∀ x y: O, Equiv (x ⟶ y)}
 `{!CatId O} `{!CatComp O}: Prop :=
  { arrow_equiv :> ∀ x y, Setoid (x ⟶ y)
  ; comp_proper :> ∀ x y z, Proper ((=) ==> (=) ==> (=)) (comp x y z)
  ; comp_assoc :> ArrowsAssociative O
  ; id_l :> ∀ x y, LeftIdentity (comp x y y) cat_id
  ; id_r :> ∀ x y, RightIdentity (comp x x y) cat_id }.
      (* note: no equality on objects. *)

到目前为止我学到的类别的基本概念只需要

  1. 对象之间有箭头
  2. 箭头组成(尊重关联性)和
  3. 身份箭头存在并且表现得很好。
  4. 我知道Setoid是等同的类,但我看不到Setoids的位置。有人可以帮助解释上面的定义并解释与没有Setoids的通常类别定义的区别吗?

1 个答案:

答案 0 :(得分:3)

让我引用J.Gross,A.Chlipala,D.I。的论文中的setoids小节(第2.4节)。斯皮瓦克 - Experience Implementing a Performant Category-Theory Library in Coq(2014):

  

setoid [5]是一种具有等价关系的载体类型; setoids的映射是载体类型之间的函数,并且证明函数尊重其域和codomain的等价关系。许多作者[11,12,15,18]选择使用 seorpid of morphisms ,它允许定义集合(oid)的类别,以及(小)的类别类别,不假设功能扩展性,并允许定义对象是商类型的类别。

上面引用的来源[12]是Math-Classes库。 然而,作者继续提出警告:

  

但是,在任何地方使用setoids都会产生很大的开销,这会导致编译时间变慢。我们谈论的每一种类型都需要有一种关系,并证明这种关系是一种等价关系。我们使用的每个函数都需要提供一个证据,证明它将等效元素发送给等效元素。更糟糕的是,如果我们需要在“具有等价关系的类型”的宇宙上需要等价关系,我们需要在等价类型之间提供一个尊重这些类型的等价关系的传递函数。