我正在尝试理解Agda标准库的某些部分,我似乎无法弄清楚REL
的定义。
FWIW这里是REL
:
-- Binary relations
-- Heterogeneous binary relations
REL : ∀ {a b} → Set a → Set b → (ℓ : Level) → Set (a ⊔ b ⊔ suc ℓ)
REL A B ℓ = A → B → Set ℓ
我找不到任何在线解释这个的文档,这就是我在这里问的原因。这如何定义二元关系?
答案 0 :(得分:6)
@ RodrigoRibeiro的答案解释了Level
位,但是一旦你摆脱了宇宙级别,Set → Set → Set
类型与二元关系有什么关系?
假设您有二元关系R ⊆ A × B
。对其进行建模的命题方法是创建一些索引类型R : A → B → Set
,以便对于任何a : A, b : B
,R a b
都有居民iff (a, b) ∈ R
。因此,如果您想谈谈A
和B
上的所有关系,您必须讨论所有A
- 和B
- 索引类型,即您必须谈论RelationOverAandB = A → B → Set
。
如果您希望抽象出关系的左手和右手基础类型,则意味着A
和B
的选择不再是固定的。所以你必须谈论REL
,REL A B = A → B → Set
。
那么REL
的类型是什么?正如我们从REL A B
示例中看到的那样,它选择A
和B
作为两个参数;其结果是类型 A → B → Set
。
总结一下:给出
A : Set
B : Set
我们有
REL A B = A → B → Set
它本身的类型为Set
(请记住,我们在这里忽略了Universe级别)。
因此,
REL : Set → Set → Set ∎
答案 1 :(得分:5)
我想看一个例子比较容易:
import Level
open import Relation.Binary
open import Data.Nat.Base hiding (_≤_)
data _≤_ : REL ℕ ℕ Level.zero where
z≤n : ∀ {n} -> 0 ≤ n
s≤s : ∀ {n m} -> n ≤ m -> suc n ≤ suc m
类型签名相当于
data _≤_ : ℕ -> ℕ -> Set where
所以_≤_
是两个自然数之间的关系。它包含所有数字对,使得第一个数字小于或等于第二个数字。以同样的方式我们可以写
open import Data.List.Base
data _∈_ {α} {A : Set α} : REL A (List A) Level.zero where
here : ∀ {x xs} -> x ∈ x ∷ xs
there : ∀ {x y xs} -> x ∈ xs -> x ∈ y ∷ xs
类型签名相当于
data _∈_ {α} {A : Set α} : A -> List A -> Set where
_∈_
是A
类型元素与A
类型元素列表之间的关系。
REL
的宇宙单态变体本身就是一个二元关系:
MonoREL : REL Set Set (Level.suc Level.zero)
MonoREL A B = A → B → Set
答案 2 :(得分:4)
要定义二元关系,我们需要两个集合,因此REL
至少需要两种类型。 REL : ∀ {a b} → Set a → Set b → (ℓ : Level) → Set (a ⊔ b ⊔ suc ℓ)
的类型:
REL
由于宇宙级别的东西,这种类型有点污染。如果您允许自己一些非正式性,可以禁用Universe级别(有关此here的更多信息)并将REL : Set -> Set -> Set
写为:
REL
这是一种期望两种类型作为参数的类型。
在类型理论中使用宇宙是为了避免像集合论Russell's Paradox这样的悖论。
我不是类型理论专家,但Set a
类型的解释可以概括为:
Set b
和a
分别是Universe级别b
和⊔
的参数类型。awk
返回最多两个参数级别。希望这可以帮助你。