这是关于Agda和类别理论的非常基本的问题。我想编码一个类别,其中对象是有限集,而箭头是它们之间的函数。我正在使用Category
定义的agda/agda-categories回购。我在级别上遇到了麻烦。这是当前的WIP代码:
-- | Category Theory by Steve Awodey
--
-- Page 6. Book mentions injective functions, but just to clarify we
-- will confirm that non-injective functions work just as well.
--
open import Algebra
open import Function using (_∘_)
open import Algebra.Structures
open import Categories.Category
open import Level
open import Relation.Binary.Core
open import Agda.Builtin.Equality
data FiniteSet (o : Level) : Set o where
MkFiniteSet1 : FiniteSet o
MkFiniteSet2 : FiniteSet o
record AnyFiniteSetFunc (ℓ : Level) : Set ℓ where
constructor MkAnyFiniteSetFunc
field
func : (FiniteSet ℓ → FiniteSet ℓ)
noninjCat : {o ℓ e : Level} → Category o ℓ e
noninjCat {o} {ℓ} {e} =
record
{ Obj = FiniteSet o
; _⇒_ = λ _ _ → AnyFiniteSetFunc ℓ
; _≈_ = λ x₂ x₁ → {!(_≡_) x₁ x₂!}
; id = MkAnyFiniteSetFunc (\(el : FiniteSet ℓ) → el)
; _∘_ = λ f1 f2 →
MkAnyFiniteSetFunc
( AnyFiniteSetFunc.func f1
∘ AnyFiniteSetFunc.func f2
)
; assoc = λ {A} {B} {C} {D} {f} {g} {h} → {!!}
; identityˡ = {!!}
; identityʳ = {!!}
; equiv = {!!}
; ∘-resp-≈ = {!!}
}
我在孔0
中的进球/失配是这个:
Goal: Set e
Have: Set ℓ
————————————————————————————————————————————————————————————
x₁ : AnyFiniteSetFunc ℓ
x₂ : AnyFiniteSetFunc ℓ
B : FiniteSet o (not in scope)
A : FiniteSet o (not in scope)
e : Level
ℓ : Level
o : Level
肯定有一些我在此处的级别不正确的事情,或者可能是完全误解了应该如何编码等式。
带有我的WIP代码的回购在这里:https://github.com/k-bx/category-theory-exercises/blob/master/agda/ex02_noninjective_functions.agda
答案 0 :(得分:1)
好吧,我刚刚意识到答案可能是我们想要声明ℓ
和e
的级别与此类别相同,因此可以起作用:
noninjCat : {o ℓ : Level} → Category o ℓ ℓ
noninjCat {o} {ℓ} =
record
{ Obj = FiniteSet o
; _⇒_ = λ _ _ → AnyFiniteSetFunc ℓ
; _≈_ = λ {A} {B} x₂ x₁ → x₁ ≡ x₂
; id = MkAnyFiniteSetFunc (\(el : FiniteSet ℓ) → el)
; _∘_ = λ f1 f2 →
MkAnyFiniteSetFunc
( AnyFiniteSetFunc.func f1
∘ AnyFiniteSetFunc.func f2
)
; assoc = λ {A} {B} {C} {D} {f} {g} {h} → {!!}
; identityˡ = {!!}
; identityʳ = {!!}
; equiv = {!!}
; ∘-resp-≈ = {!!}
}