背景:我对Agda有一些基本的了解,而我正试图理解 这里的要点:
https://gist.github.com/copumpkin/5945905
但我在理解所有Pred
内容和使用时遇到了问题
宇宙。
这是Pred的定义:
Pred : ∀ {a} → Set a → (ℓ : Level) → Set (a ⊔ suc ℓ)
Pred A ℓ = A → Set ℓ
-- Unary relations can be seen as sets
为什么我会想要这样的类型,这个评论意味着什么?它的存在 在任何地方使用,所以我无法在不理解的情况下继续前进。
接下来,有拓扑空间的记录定义:
record Space x ℓ : Set (Level.suc x ⊔ Level.suc ℓ) where
这是什么魔法?我有点明白x是我们"积分的水平"
但是什么是ℓ
和结果类型?
答案 0 :(得分:2)
关于二元关系有a related question。
在A
Set
类型Set ℓ
下(或宇宙多态设置中的P
)下是一个命题。因此,某些A -> Set
类型A
的{{1}}是在A
元素上定义的谓词。
考虑例如谓词Positive
,仅对suc n
格式的n
的自然数字保留(我的机器之外的因此是ASCII):
data Positive : Nat -> Set where
positive : forall n -> Positive (suc n)
positive n
是Positive (suc n)
的(或更确切地说)证据。拥有Pred A = A -> Set
后,我们可以将Positive
的类型签名写为
data Positive : Pred Nat where
另一个例子是来自标准库中All
模块的Data.List.All
。它被定义为
data All {a p} {A : Set a}
(P : A → Set p) : List A → Set (p ⊔ a) where
[] : All P []
_∷_ : ∀ {x xs} (px : P x) (pxs : All P xs) → All P (x ∷ xs)
All P
是一个谓词,只要xs
为列表的每个元素保留,就会保留任何列表P
。使用Pred
的Universe多态定义,我们可以将All
的类型签名写为
data All {a p} {A : Set a}
(P : Pred A p) : Pred (List A) (p ⊔ a) where
(并明确All
是谓词变换器)。所以Pred
主要是符号方便。
对于宇宙多态性,旧的Agda wiki中有一些Curry–Howard interpretation。在您的示例中,x
是点的类型(X
)所在的Universe级别。 ℓ
中使用了Pred (Pred X ℓ) ℓ
- 在X
元素上定义的谓词上定义的谓词类型(我无法评论此表达式的拓扑意义)。 Set x
位于Set (suc x)
,而Pred (Pred X ℓ) ℓ
(X -> Set ℓ) -> Set ℓ
位于Set (suc ℓ)
,Space x ℓ
位于Set (suc x ⊔ suc ℓ)
,因此$_
整个/
位于${_%/*}