dav*_*vik 3 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 ?
Run Code Online (Sandbox Code Playgroud)
我在网上找不到任何解释这个的文档,这就是我在这里问的原因.这如何定义二元关系?
@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
Run Code Online (Sandbox Code Playgroud)
我们有
REL A B = A ? B ? Set
Run Code Online (Sandbox Code Playgroud)
它本身就有类型Set
(记住,我们在这里忽略宇宙级别).
因此,
REL : Set ? Set ? Set ?
Run Code Online (Sandbox Code Playgroud)
我想看一个例子更容易:
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
Run Code Online (Sandbox Code Playgroud)
类型签名相当于
data _?_ : ? -> ? -> Set where
Run Code Online (Sandbox Code Playgroud)
_?_
两个自然数之间的关系也是如此.它包含所有数字对,使得第一个数字小于或等于第二个数字.以同样的方式我们可以写
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
Run Code Online (Sandbox Code Playgroud)
类型签名相当于
data _?_ {?} {A : Set ?} : A -> List A -> Set where
Run Code Online (Sandbox Code Playgroud)
_?_
是类型A
元素和类型元素列表之间的关系A
.
宇宙单态变体REL
本身就是一个二元关系:
MonoREL : REL Set Set (Level.suc Level.zero)
MonoREL A B = A ? B ? Set
Run Code Online (Sandbox Code Playgroud)