如何解释agda中的REL

时间:2016-01-05 00:11:30

标签: agda dependent-type

我正在尝试理解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 ℓ

我找不到任何在线解释这个的文档,这就是我在这里问的原因。这如何定义二元关系?

3 个答案:

答案 0 :(得分:6)

@ RodrigoRibeiro的答案解释了Level位,但是一旦你摆脱了宇宙级别,Set → Set → Set类型与二元关系有什么关系?

假设您有二元关系R ⊆ A × B。对其进行建模的命题方法是创建一些索引类型R : A → B → Set,以便对于任何a : A, b : BR a b都有居民iff (a, b) ∈ R。因此,如果您想谈谈AB上的所有关系,您必须讨论所有A - 和B - 索引类型,即您必须谈论RelationOverAandB = A → B → Set

如果您希望抽象出关系的左手和右手基础类型,则意味着AB的选择不再是固定的。所以你必须谈论RELREL A B = A → B → Set

那么REL的类型是什么?正如我们从REL A B示例中看到的那样,它选择AB作为两个参数;其结果是类型 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 ba分别是Universe级别b的参数类型。
  • 运算符awk返回最多两个参数级别。

希望这可以帮助你。