立方形
立方体模式通过立方体的各种特性扩展了Agda类型理论。特别是,它增加了计算的单叶性和更高的归纳类型,因此赋予计算意义同伦类型理论与单叶基础.立方型的版本Agda实施的理论是CCHM公司立方体类型Kan复合运算分解为均匀组成和广义输运。这就是为什么更高归纳类型的通用模式工作,遵循CHM公司纸张。还有一篇研究论文专门介绍立方体Agda athttps://www.doi.org/10.1017/S0956796821000034.
要使用立方体模式,Agda需要使用--立方的
命令行选项或{-#
选项 --立方的 #-}
在文件的顶部。还有一个立方体模式的变体,使用激活--擦除的cubical
,描述如下在下面.
立方体模式为Agda增加了以下功能:
间隔类型和路径类型
广义运输(运输
)
部分元素
均匀成分(hcomp公司
)
胶水类型
更高的感应类型
立方标识类型
Cubical Agda有两个主要的图书馆:
在本文档中,我们将依赖agda/立方
图书馆和访问立方基元的推荐方法是添加以下内容位于文件顶部(这假定agda/立方
库已安装并对Agda可见)。
{-#选项--立方#-}
打开 进口 立方体。核心。一切
遵循以下说明:https://github.com/agda/cubical安装库。为了使此库对Agda可见,请添加/路径/to/cublical/cubical.agda-lib
到.agda/库
和立方的
到.agda/默认值
(其中路径/目标
是绝对值路径,其中agda/立方
库已安装)。对于Agda图书馆管理的详细信息参见图书馆管理.
不想依赖的专家用户agda/立方
可以添加文件顶部的相关导入语句(有关详细信息看见附录:立方Agda基元). 然而,对于初学者来说,这是建议至少使用agda/立方
库。
间隔和路径类型
立体类型理论的关键思想是增加一个区间类型我 :
IUniv公司
(这是一种特殊的原因IUniv公司
是因为它不支持运输
和hcomp公司
操作)。一个变量我 : 我
直观地对应于实际单位间隔。在空上下文中,只有两个类型的值我
:的两个端点间隔,i0(i0)
和i1
.
区间元素构成a德摩根代数,最小值为(∧
),最大值(∨
)和否定(~
).
_∧_ : 我 → 我 → 我_∨_ : 我 → 我 → 我~_ : 我 → 我
De Morgan代数的所有性质都具有定义性。这个区间的端点i0(i0)
和i1
是底部和顶部元素。
i0(i0) ∨ 我 = 我i1 ∨ 我 = i1我 ∨ j个 = j个 ∨ 我i0(i0) ∧ 我 = i0(i0)i1 ∧ 我 = 我我 ∧ j个 = j个 ∧ 我~ (~ 我) = 我i0(i0) = ~ i1~ (我 ∨ j个) = ~ 我 ∧ ~ j个~ (我 ∧ j个) = ~ 我 ∨ ~ j个
同伦类型理论和单叶基础的核心思想是路径之间的对应关系(如拓扑)和(证明相关)等式(如Martin-Löf的恒等式)。这封信是从字面上看,Cubical Agda中有一条类型中的路径A类
是表示为超出间隔的函数,我 → A类
.A型路径类型实际上是更通用的内置异类路径类型:
--路径P:∀{У}(A:I→集У)→A i0→A i1→集▽
--非依赖路径类型
路径 : ∀ {ℓ} (A类 : 设置 Ş) → A类 → A类 → 设置 ℓ路径 A类 一 b条 = 路径P (λ _ → A类) 一 b条
因此,立方体Agda中平等的核心概念是异质的平等(在意义上PathOver路径
HoTT)。为了定义路径,我们使用λ-抽象,为了应用它们,我们使用常规应用程序。对于例如,这是常量路径的定义(或证明自反性):
回流 : ∀ {ℓ} {A类 : 设置 ℓ} {x个 : A类} → 路径 A类 x个 x个回流 {x个 = x个} = λ 我 → x个
虽然它们使用相同的语法,但路径与函数并不完全相同。例如,类型化的lambdas不能用于形成路径,它们用于以下功能:
非refl : ∀ {ℓ} {A类 : 设置 ℓ} {x个 : A类} → (我 : 我) → A类非refl {x个 = x个} = λ (我 : 我) → x个
因为直觉,路径对应于平等路径P (λ
我 → A) x个 年
打印为x个 ≡ 年
什么时候A类
没有提到我
。通过迭代路径类型,我们可以定义正方形、立方体和Agda中更高的立方体,使类型理论成为立方体。例如a平方英寸A类
由4个点和4条线组成:
方形 : ∀ {ℓ} {A类 : 设置 ℓ} {x0个 x1个 年 y1个 : A类} →
x0个 ≡ x1个 → 年 ≡ y1个 → x0个 ≡ 年 → x1个 ≡ y1个 → 设置 ℓ方形 第页 q个 第页 秒 = 路径P (λ 我 → 第页 我 ≡ q个 我) 第页 秒
将等式视为区间外的函数使其成为可能以非常直接的方式进行大量的等式推理:
sym(对称) : ∀ {ℓ} {A类 : 设置 ℓ} {x个 年 : A类} → x个 ≡ 年 → 年 ≡ x个sym(对称) 第页 = λ 我 → 第页 (~ 我)
刚果 : ∀ {ℓ} {A类 : 设置 ℓ} {x个 年 : A类} {B类 : A类 → 设置 Ş} ((f) : (一 : A类) → B类 一) (第页 : x个 ≡ 年)
→ 路径P (λ 我 → B类 (第页 我)) ((f) x个) ((f) 年)刚果 (f) 第页 我 = (f) (第页 我)
由于函数计算这些满足一些新的与标准Agda定义相比,定义相等:
symInv公司 : ∀ {ℓ} {A类 : 设置 ℓ} {x个 年 : A类} (第页 : x个 ≡ 年) → sym(对称) (sym(对称) 第页) ≡ 第页symInv公司 第页 = 回流刚果Id : ∀ {ℓ} {A类 : 设置 ℓ} {x个 年 : A类} (第页 : x个 ≡ 年) → 刚果 (λ 一 → 一) 第页 ≡ 第页刚果Id 第页 = 回流congComp公司 : ∀ {ℓ} {A类 B类 C类 : 设置 ℓ} ((f) : A类 → B类) (克 : B类 → C类) {x个 年 : A类} (第页 : x个 ≡ 年) →
刚果 (λ 一 → 克 ((f) 一)) 第页 ≡ 刚果 克 (刚果 (f) 第页)congComp公司 (f) 克 第页 = 回流
路径类型也让我们证明了新事物在标准Agda中是不可证明的。例如,函数扩展性,声明逐点等于函数是相等的,有一个非常简单的证明:
funExt(功能扩展) : ∀ {ℓ} {A类 : 设置 ℓ} {B类 : A类 → 设置 ℓ} {(f) 克 : (x个 : A类) → B类 x个} →
((x个 : A类) → (f) x个 ≡ 克 x个) → (f) ≡ 克funExt公司 第页 我 x个 = 第页 x个 我
运输
虽然路径类型非常适合于推理相等性,但它们不允许我们沿着类型之间的路径传输,甚至组成路径,其中特别意味着我们还不能证明路径的归纳原理。作为补救措施,我们还具有内置(通用)传输操作运输
和同构合成操作hcomp公司
.运输操作是广义的,因为它让我们指定标识函数的位置。
运输 : ∀ {ℓ} (A类 : 我 → 设置 ℓ) (第页 : 我) (一 : A类 i0(i0)) → A类 i1
使用时还有一个额外的条件需要满足运输
要进行类型检查:A类
应该是一个常量函数约束第页 = i1
感到满意。这里的常数是指A类
定义上等于λ _ → A类 i0(i0)
,这反过来要求A类 i0(i0)
和A类 i1
在定义上也是平等的。
什么时候?第页
是i1
,运输 A类 第页
将计算为单位函数。
只有在这种情况下,这才是正确的A类
是一条平凡的路径侧面条件需要。
这种附带条件可能会让人觉得奇怪第页
和A类
进行交互,但两者都可以依赖于范围中的区间变量,因此假设第页
可以影响什么A类
看起来像。
不同值的侧面条件的一些示例第页
:
我们可以使用运输
定义定期运输:
运输 : ∀ {ℓ} {A类 B类 : 设置 Ş} → A类 ≡ B类 → A类 → B类运输 第页 一 = 运输 (λ 我 → 第页 我) i0(i0) 一
通过结合运输和最小操作,我们可以定义路径归纳原理:
J : ∀ {ℓ} {A类 : 设置 ℓ} {x个 : A类} (P(P) : ∀ 年 → x个 ≡ 年 → 设置 ℓ)
(d日 : P(P) x个 回流) {年 : A类} (第页 : x个 ≡ 年)
→ P(P) 年 第页J P(P) d日 第页 = 运输 (λ 我 → P(P) (第页 我) (λ j个 → 第页 (我 ∧ j个))) d日
路径和命题等式之间的一个微妙区别Agda的类型是J
无法保持定义上。如果J
使用模式匹配进行定义,如Agda标准库则适用,但路径类型如下没有归纳定义,这不适用于上述定义J
特别是,固定家庭中的交通只恒等函数直到一条路径,这意味着计算规则对于J
仅支持路径:
transportRefl(传输参考) : ∀ {ℓ} {A类 : 设置 ℓ} (x个 : A类) → 运输 回流 x个 ≡ x个transportRefl(传输参考) {A类 = A类} x个 我 = 运输 (λ _ → A类) 我 x个J参考 : ∀ {ℓ} {A类 : 设置 ℓ} {x个 : A类} (P(P) : ∀ 年 → x个 ≡ 年 → 设置 ℓ)
(d日 : P(P) x个 回流) → J P(P) d日 回流 ≡ d日JRefl公司 P(P) d日 = transportRefl(传输参考) d日
在阿格达内部运输
操作按实例计算类型,例如,对于∑类型,它是按元素计算的。对于路径类型,但是还不可能提供计算规则因为我们需要一些方法来记住而且,这必须适用于任意更高的多维数据集(因为我们可以迭代路径类型)。为此,我们介绍“同构合成操作”(hcomp公司
)那个将路径的二进制合成推广到高阶的n元合成多维立方体。
部分元素
为了描述同质合成操作,我们需要能够编写部分指定的n维立方体(即立方体缺少一些面)。给定区间的一个元素第页 :
我
有一个谓词IsOne公司
表示约束第页
= i1
这是一个证明i1
实际上等于i1
调用1=1 : IsOne公司 i1
。我们使用希腊字母,如φ
或ψ
当这样一个第页
应该被认为是在IsOne公司
.
使用它,我们引入了一种称为部分 φ A类
.想法是这样的部分 φ A类
是中多维数据集的类型A类
仅在以下情况下定义IsOne公司 φ
持有。部分 φ A类
是的特殊版本IsOne公司 φ → A类
具有更广泛的判断平等性:的两个元素部分 φ A类
如果它们代表相同的子立方体,则视为相等;例如,立方体的面可以按不同的顺序给出然而,这两个要素仍将被视为相同的。
还有一个依赖版本的部分 φ A类
调用部分P φ A类
这需要A类
仅当IsOne公司 φ
.
部分 : ∀ {ℓ} → 我 → 设置 ℓ → S设置 ℓ部分P : ∀ {ℓ} → (φ : 我) → 部分 φ (设置 ℓ) → S设置 ℓ
有一种新形式的模式匹配,可以用来介绍部分元素:
部分Bool : ∀ 我 → 部分 (我 ∨ ~ 我) 布尔部分Bool 我 (我 = i0(i0)) = 真的部分Bool 我 (我 = i1) = 假
术语部分Bool 我
应该被认为是带有不同的值(i) = i0)
和(i) = i1)
.类型术语部分 φ A类
也可以使用模式匹配lambda.
部分Bool : ∀ 我 → 部分 (我 ∨ ~ 我) 布尔部分Bool 我 = λ 哪里
(我 = i0(i0)) → 真的 (我 = i1) → 假
当案例重叠时,他们必须同意:
partialBool“” : ∀ 我 j个 → 部分 (~ 我 ∨ 我 ∨ (我 ∧ j个)) 布尔partialBool“” 我 j个 = λ 哪里
(我 = i1) → 真的 (我 = i1) (j个 = i1) → 真的 (我 = i0(i0)) → 假
请注意,案例的顺序不必与间隔公式完全匹配。
此外,IsOne公司 i0(i0)
实际上是荒谬的:
空的 : {A类 : 设置} → 部分 i0(i0) A类空的 = λ()
立方Agda也有立方亚型,如CCHM类型理论中所述:
_[_↦_] : ∀ {ℓ} (A类 : 设置 ℓ) (φ : 我) (u个 : 部分 φ A类) → S设置 ℓA类 [ φ ↦ u个 ] = 附属的 A类 φ u个
一个术语v(v) : A类 [ φ ↦ u个 ]
应该被认为是一个类型术语A类
定义上等于u个 : A类
什么时候IsOne公司 φ
是满意的。任何术语u个 : A类
可以看作是A类 [ φ ↦ u个
]
这与它自己的观点一致φ
:
英寸S : ∀ {ℓ} {A类 : 设置 ℓ} {φ : 我} (u个 : A类) → A类 [ φ ↦ (λ _ → u个) ]
人们还可以忘记,部分元素与u个
在φ
:
输出S : ∀ {ℓ} {A类 : 设置 ℓ} {φ : 我} {u个 : 部分 φ A类} → A类 [ φ ↦ u个 ] → A类
这些胁迫满足以下等式:
输出S (英寸S 一) = 一英寸S {φ = φ} (输出S {φ = φ} 一) = 一输出S {φ = i1} {u个} _ = u个 1=1
注意,给定一 : A类 [ φ ↦ u个 ]
和α : IsOne公司 φ
,它不是这个案子输出S 一 = u个 α
; 然而,在模式绑定的下面(φ = i1)
,一个有输出S 一 = u个 1=1
.
通过所有这些立体式基础设施,我们现在可以描述hcomp公司
操作。
均匀成分
齐次合成操作推广了二进制合成这样我们就可以组成多个可组合的立方体。
hcomp公司 : ∀ {ℓ} {A类 : 设置 ℓ} {φ : 我} (u个 : 我 → 部分 φ A类) (u0(单位) : A类) → A类
打电话时hcomp公司 {φ = φ} u个 u0(单位)
Agda确保u0(单位)
同意具有u个 i0(i0)
在φ
想法是u0(单位)
是基础和u个
指定打开框的侧面。因此,这是一个开放(更高尺寸)立方体,其中u0(单位)
缺少。这个hcomp公司
然后,运算给出了与之相反的缺失边u0(单位)
例如,路径的二进制组合可以写为:
compPath(组件路径) : ∀ {ℓ} {A类 : 设置 ℓ} {x个 年 z(z) : A类} → x个 ≡ 年 → 年 ≡ z(z) → x个 ≡ z(z)compPath(组件路径) {x个 = x个} 第页 q个 我 = hcomp公司 (λ{ j个 (我 = i0(i0)) → x个 ; j个 (我 = i1) → q个 j个 })
(第页 我)
我们被赋予了形象第页 : x个 ≡ 年
和q个 : 年 ≡ z(z)
,以及两条路径的合成是通过计算这个开放式广场:
x z轴^ ^| |x | | q j| |x--------------->年第i页
图纸中的方向我
从左到右j个
去自下而上。当我们从x个
到z(z)
沿着我
我们有我 : 我
在上下文中,我们将第页 我
作为底部。方向j个
我们正在做的作文是在第一个参数中抽象为hcomp公司
.
注意,部分元素u个
不必指定打开盒子的所有边,给更多的边只会给你对结果进行更多控制hcomp公司
.例如,如果我们省略(i) = i0) → x个
侧面定义compPath(组件路径)
我们仍然得到一个类型为的有效项A类
然而,该术语将简化为hcomp公司 (λ{ j个 () }) x个
什么时候我 = i0(i0)
所以这个定义不会建立从以下位置开始的路径x个
.
我们还可以将立方体的均匀填充定义为
hfill公司 : ∀ {ℓ} {A类 : 设置 ℓ} {φ : 我}
(u个 : ∀ 我 → 部分 φ A类) (u0(单位) : A类 [ φ ↦ u个 i0(i0) ])
(我 : 我) → A类hfill公司 {φ = φ} u个 u0(单位) 我 = hcomp公司 (λ{ j个 (φ = i1) → u个 (我 ∧ j个) 1=1
; j个 (我 = i0(i0)) → 输出S u0(单位) })
(输出S u0(单位))
什么时候?我
是i0(i0)
这是u0(单位)
以及何时我
是i1
这是hcomp公司 u个 u0(单位)
因此,这可以被视为给了我们一个打开盒子。在上述正方形的特殊情况下hfill公司
给了我们一个构成的直接立方体证明第页
具有回流
是第页
.
compPathRefl(compPathRefl) : ∀ {ℓ} {A类 : 设置 ℓ} {x个 年 : A类} (第页 : x个 ≡ 年) → compPath(压缩路径) 第页 反射 ≡ 第页compPathRefl(compPathRefl) {x个 = x个} {年 = 年} 第页 j个 我 = hfill公司 (λ{ _ (我 = i0(i0)) → x个 ; _ (我 = i1) → 年 })
(英寸S (第页 我))
(~ j个)
胶水类型
为了能够证明单价定理,我们还必须添加“粘合”类型。这些让我们将类型之间的等价转换为类型之间的路径。类型的等价A类
和B类
是定义为地图(f) : A类 → B类
使其纤维可收缩。
纤维 : ∀ {ℓ} {A类 B类 : 设置 ℓ} ((f) : A类 → B类) (年 : B类) → 设置 ℓ纤维 {A类 = A类} (f) 年 = Σ[ x个 ∈ A类 ] (f) x个 ≡ 年是控制 : ∀ {ℓ} → 设置 ℓ → 设置 ℓ是控制 A类 = Σ[ x个 ∈ A类 ] (∀ 年 → x个 ≡ 年)
记录 等于 {ℓ} {A类 B类 : 设置 ℓ} ((f) : A类 → B类) : 设置 ℓ 哪里
领域
同等安全 : (年 : B类) → 是控制 (纤维 (f) 年)
_≃_ : ∀ {ℓ} (A类 B类 : 设置 ℓ) → 设置 ℓA类 ≃ B类 = Σ[ (f) ∈ (A类 → B类) ] (等于 (f))
等价的最简单的例子是恒等函数。
idfun公司 : ∀ {ℓ} → (A类 : 设置 ℓ) → A类 → A类互联网娱乐 _ x个 = x个等同身份证 : ∀ {ℓ} (A类 : 设置 ℓ) → 等于 (互联网娱乐 A类)同等安全 (等同身份证 A类) 年 =
((年 , 回流) , λ z(z) 我 → z(z) .snd公司 (~ 我) , λ j个 → z(z) .snd公司 (~ 我 ∨ j个))
等同于 : ∀ {ℓ} (A类 : 设置 ℓ) → A类 ≃ A类等同于 A类 = (互联网娱乐 A类 , 等同身份证 A类)
等价类型的一个重要特例是同构类型(即带有相互关联的来回映射的类型反向)。
由于一切都必须达到更高的维度,胶水类型需要与基类型等价的部分类型族A类
:
胶水 : ∀ {ℓ ℓ'} (A类 : 设置 ℓ) {φ : 我}
→ 部分 φ (Σ[ T型 ∈ 设置 ℓ' ] T型 ≃ A类) → 设置 ℓ'
它们带有构造函数和消除器:
胶 : ∀ {Ş ℓ'} {A类 : 设置 ℓ} {φ : 我} {Te公司 : 部分 φ (Σ[ T型 ∈ 设置 ℓ' ] T型 ≃ A类)}
→ 部分P φ T型 → A类 → 胶水 A类 Te公司脱胶 : ∀ {Ş Ş'} {A类 : 设置 ℓ} (φ : 我) {Te公司 : 部分 φ (Σ[ T型 ∈ 设置 ℓ' ] T型 ≃ A类)}
→ 胶水 A类 Te公司 → A类
使用Glue类型,我们可以将类型的等价转换为如下路径跟随:
ua公司 : ∀ {ℓ} {A类 B类 : 设置 ℓ} → A类 ≃ B类 → A类 ≡ B类ua公司 {_} {A类} {B类} 电子 我 = 胶水 B类 λ{ (我 = i0(i0)) → (A类 , 电子)
; (我 = i1) → (B类 , 等同于 B类) }
我们的想法是用胶水粘合A类
与一起B类
什么时候我 = i0(i0)
使用电子
和B类
当我 = i1
使用身份等效性。因此,这给了我们单价的关键部分:将等价物转换为路径的函数。的另一部分唯一性是这个映射本身是一个等价的,如下所示根据的计算规则ua公司
:
尿酸β : ∀ {ℓ} {A类 B类 : 设置 ℓ} (电子 : A类 ≃ B类) (x个 : A类) → 运输 (ua公司 电子) x个 ≡ 电子 .有限状态试验 x个尿酸β 电子 x个 = transportRefl(传输参考) (电子 .有限状态试验 x个)
沿着我们从申请中获得的路径运输ua公司
到因此,等效性与应用等效性相同。这是是什么使得在计算中使用单价公理成为可能立方阿格达:我们可以把等价物打包成路径,实现平等使用这些路径进行推理,最后沿着这些路径进行传输为了用等价物进行计算。
我们有以下等式:
胶水 A类 {i1} Te公司 = Te公司 1=1 .有限状态试验脱胶 φ (胶 t吨 一) = 一胶 (λ{ (φ = i1) → 克 }) (脱胶 φ 克) = 克脱胶 i1 {Te公司} 克 = Te公司 1=1 .snd公司 .有限状态试验 克胶 {φ = i1} t吨 一 = t吨 1=1
有关Glue类型和单价的更多结果,请参阅Glue的文件类型和单价agda/立方
库或1个实验室
.
较高电感类型
Cubical Agda还让我们可以直接将更高的电感类型定义为带有路径构造函数的数据类型。例如圆和圆环体可以定义为:
数据 S¹ : 设置 哪里
基础 : S¹ 环 : 基础 ≡ 基础数据 圆环体 : 设置 哪里
指向 : 圆环体 第1行 : 指向 ≡ 指向 第2行 : 指向 ≡ 指向 广场 : 路径P (λ 我 → 第1行 我 ≡ 第1行 我) 第2行 第2行
然后可以使用图案匹配:
t2c型 : 圆环体 → S¹ × S¹t2c型 指向 = (基础 , 基础)t2c型 (第1行 我) = (环 我 , 基础)t2c型 (第2行 j个) = (基础 , 环 j个)t2c型 (广场 我 j个) = (环 我 , 环 j个)
二氧化碳 : S¹ × S¹ → 圆环体二氧化碳 (基础 , 基础) = 指向二氧化碳 (环 我 , 基础) = 第1行 我二氧化碳 (基础 , 环 j个) = 第2行 j个二氧化碳 (环 我 , 环 j个) = 广场 我 j个
在给出路径和方形构造函数的情况时,我们必须确保函数将边界映射到正确的地方。对于例如,以下定义没有将Agda的typechecker作为最后一个案例的边界与预期的不匹配方形构造函数的边界(作为第1行
和第2行
案例混淆)。
c2t_坏 : S¹ × S¹ → 圆环体c2t巴德 (基础 , 基础) = 指向c2t巴德 (环 我 , 基础) = 第2行 我c2t巴德 (基础 , 环 j个) = 第1行 j个c2t巴德 (环 我 , 环 j个) = 广场 我 j个
由较高电感类型上的模式匹配定义的函数对所有构造函数进行定义计算。
c2t-t2c型 : ∀ (t吨 : 圆环体) → 二氧化碳 (t2c型 t吨) ≡ t吨c2t-t2c型 指向 = 回流c2t-t2c型 (第1行 _) = 回流c2t-t2c型 (第2行 _) = 回流c2t-t2c型 (广场 _ _) = 回流t2c-c2t : ∀ (第页 : S¹ × S¹) → t2c型 (二氧化碳 第页) ≡ 第页t2c-c2t (基础 , 基础) = 回流t2c-c2t (基础 , 环 _) = 回流t2c-c2t (环 _ , 基础) = 回流t2c-c2t (环 _ , 环 _) = 回流
通过将这种同构化为等价,我们得到了一个直接的证明圆环等于两个圆。
圆环Select S¹×S¹ : 圆环体 ≡ S¹ × S¹Torus elec S´×S´ = isoToPath(isoToPath) (国际标准化组织 t2c型 二氧化碳 t2c-c2t c2t-t2c型)
Cubical Agda还支持参数化和递归更高归纳类型,例如命题截断(挤压类型)定义为:
数据 缩_缩 {ℓ} (A类 : 设置 ℓ) : 设置 ℓ 哪里
∣_∣ : A类 → ∥ A类 ∥ 壁球 : ∀ (x个 年 : ∥ A类 ∥) → x个 ≡ 年是Prop : ∀ {ℓ} → 设置 ℓ → 设置 ℓ是Prop A类 = (x个 年 : A类) → x个 ≡ 年recPropTrunc公司 : ∀ {ℓ} {A类 : 设置 ℓ} {P(P) : 设置 ℓ} → 是Prop P(P) → (A类 → P(P)) → ∥ A类 ∥ → P(P)recPropTrunc公司 Pprop公司 (f) ∣ x个 ∣ = (f) x个recPropTrunc公司 Pprop公司 (f) (壁球 x个 年 我) =
Pprop公司 (recPropTrunc公司 Pprop公司 (f) x个) (recPropTrunc公司 Pprop公司 (f) 年) 我
有关更高电感类型的更多示例,请参阅agda/立方
库或1个实验室
.
索引归纳类型
Cubical Agda为运输
基元何时用于替换索引归纳类型的索引。一把定义(满足其模式的技术限制匹配)将在应用于沿索引的传输时进行计算。作为例如,让我们考虑以下运行示例:
数据 等式 {一} {A类 : 设置 一} (x个 : A类) : A类 → 设置 一 哪里
refl等式 : 等式 x个 x个数据 Vec公司 {一} (A类 : 设置 一) : 国家 → 设置 一 哪里
[] : Vec公司 A类 零 _∷_ : ∀ {n个} → A类 → Vec公司 A类 n个 → Vec公司 A类 (苏克 n个)
匹配的函数等式
当它的所有端点都是变量时,也就是说,非常通用的引理sym等式
和运输设备
下面,将计算所有情况:它们将计算到给定的右侧当他们的论点是refl等式
,并将计算为当他们的论点被传递进来时,在密码域中的传递第二个变量。
sym等式 : ∀ {一} {A类 : 设置 一} {x个 年 : A类} → 等式 x个 年 → 等式 年 x个sym等式 refl等式 = refl等式运输设备 : ∀ {一} {A类 B类 : 设置 一} → 等式 A类 B类 → A类 → B类运输设备 refl等式 x个 = x个路径到Eq : ∀ {一} {A类 : 设置 一} {x个 年 : A类} → x个 ≡ 年 → 等式 x个 年路径到Eq {x个 = x个} 第页 = 运输 (λ 我 → 等式 x个 (第页 我)) i0(i0) refl等式模块 _{一} {A类 B类 : 设置 一} {x个 年 : A类} {(f) : A类 ≃ B类} 哪里
_ : sym等式 (refl等式 {x个 = x个}) ≡ refl等式 _ = 回流 _ : 运输设备 (路径到Eq (ua公司 (idEquiv公司 布尔))) ≡ λ x个 → x个 _ = 回流
在假定类型的情况下匹配索引类型(因此他们的运输系统也是开放的)通常会产生更多的运输系统与paths的可比结构相比。例如,比较uaβ等式
下面有四个挂起的传输,然而尿酸β
只有一个!
uaβ等式 : 运输设备 (路径到Eq (ua公司 (f))) ≡ (f) .有限状态试验uaβ等式 = funExt(功能扩展) λ z(z) →
compPath(组件路径) (transportRefl(传输参考) ((f) .有限状态试验 _))
(刚果 ((f) .有限状态试验) (compPath(组件路径) (transportRefl(传输参考) _)
(compPath(组件路径) (transportRefl(传输参考) _)
(transportRefl(传输参考) _))))
在更具体的情况下,例如当索引是构造函数时在其他一些归纳类型中,模式匹配定义不会应用于传输时进行计算。有关不支持的特定情况,请参阅什么有效,什么无效.
如果不支持的IndexedMatch
警告已启用(默认情况下为),Agda将为每一个计算行为不能扩展到包括运输。在内部,传输由一个附加的构造函数表示,并且必须扩展模式匹配定义以涵盖这些建造师。为此,模式匹配统一的结果必须转换为嵌入(在HoTT意义上)。这是正在进行的工作。
对于Cubical Agda的日常使用,建议禁用不支持的IndexedMatch
警告。您可以使用-Wno不支持的索引匹配
中的选项选项
pragma或在您的agda-lib型
文件。
什么有效,什么无效
本节列出了图案匹配的一些常见情况统一产生了无法覆盖的东西运输,以及可以运输的情况。
以下两个定义依赖于数据的注入性构造函数(特别是构造函数苏克
),所以不会计算运输值。
sucInj等式 : ∀ {n个 k个} → 等式 (苏克 n个) (苏克 k个) → 等式 n个 k个sucInj等式 refl等式 = refl等式头 : ∀ {n个} {一} {A类 : 设置 一} → Vec公司 A类 (苏克 n个) → A类头 (x个 ∷ _) = x个
为了证明计算的失败,我们可以设置以下内容人工示例使用头
.通过传递向量真的 ∷ []
通过两次运输,即使他们会取消,头
的计算被卡住了。
模块 _ (n个 : 国家) (第页 : n个 ≡ 1) 哪里 私有的
血管内皮细胞 : Vec公司 布尔 n个 血管内皮细胞 = 运输 (λ 我 → Vec公司 布尔 (第页 (~ 我))) (真的 ∷ [])
硬盘 : 布尔 硬盘 = 头 (运输 (λ 我 → Vec公司 布尔 (第页 我)) 血管内皮细胞)
--不进行类型检查:
--_:hd≡true
--_=回流
--相反,hd是一个涉及head应用于
--运输
如果定义被固定在传输上,通常最好的解决方法是避免将其视为应该是的可简化表达式,以及自己管理运输。例如,使用以下证据运输 (对称 第页) (运输 第页 x) ≡ x个
,我们可以用硬盘
向上的通往一条道路,即使它在定义上被卡住了。
--从上面继续。。
_ : 硬盘 ≡ 真的 _ = 刚果 头 (运输 (λ 我 → Vec公司 布尔 (第页 (~ 我))) (真的 ∷ []))
在其他情况下,可以用以下方式重新表述证据:避免在模式匹配中出现不支持的情况,从而避免计算。对于示例,返回suc注入
,我们可以定义为应用程序Eq
(总是计算),以及苏克
有一个部分定义的逆:
应用程序Eq : ∀ {一 b条} {A类 : 设置 一} {B类 : 设置 b条} ((f) : A类 → B类) {x个 年 : A类}
→ 等式 x个 年 → 等式 ((f) x个) ((f) 年)应用程序Eq (f) refl等式 = refl等式sucInjEq′ : ∀ {n个 k个} → 等式 (苏克 n个) (苏克 k个) → 等式 n个 k个sucInjEq′ = 应用程序Eq λ{ (苏克 n个) → n个 ; 零 → 零 }
基于与Cubical Agda(K,类型构造函数的内射性)永远不会在传输上计算。注释启用Cubical和K与--安全的
.
荒谬的条款不需要任何特殊处理(因为荒诞仍然是荒谬的),所以定义依赖于阿格达的能够自动分离归纳类型的构造函数将不生成不支持的IndexedMatch
警告。
零未成功Eq : ∀ {n个} {一} {A类 : 设置 一} → 等式 零 (苏克 n个) → A类零NotSucEq ()
其详细阐述涉及使用源自键入中的图案匹配设置ω
尚无法扩展。这个下面的例子非常人为,因为它最小化了来自Cubical图书馆的示例.重点是要扩展测试
为了覆盖运输,我们需要至,给定第页 : ℓ′ ≡ ℓ
,生成路径P (λ 我 → 阿格 ℓ (第页 i) ) _ _
,但是设置ω
还没有被认为是撒谎。
数据 阿格 (ℓ : 水平) : 水平 → 设置ω 哪里
阿格 : ∀ {ℓ′} → 阿格 ℓ ℓ′ → 阿格 ℓ ℓ′测试 : ∀ {ℓ ℓ′} → 阿格 ℓ ℓ′ → 布尔测试 {ℓ} (阿格 _) = 真的
模式和索引匹配
在Cubical Agda中使用索引匹配时,子句的参数(和它们的右手边)需要传输到索引帐户,也就是说类型这些论点中必须有很好的形式条款.
例如,以下代码在Cubical Agda中是禁止的,并且当--不带-K
已启用:
子集 : (@0个 P(P) : A类 → 设置 第页) → x个 ≡ 年 → P(P) x个 → P(P) 年子集 _ 回流 第页 = 第页
这是因为谓词P(P)
被删除,但在内部,我们沿着论据传递第页
沿着一条涉及P(P)
,在相关位置。
结果类型中使用的任何参数,或出现在强制(点)图案,必须具有正确的模态类型。
带擦除胶水的立方体Agda
选项--擦除的cubical
启用立方体变量Agda中的Glue(以及中定义的其他内置程序)阿格达。内置。立方体。胶水
)只能用于已擦除设置。
常规Cubical Agda代码可以导入使用--擦除的cubical
.常规立方Agda代码也可以是从使用的代码导入--擦除的cubical
,但名称仅当选项--擦除
使用。在这种情况下,名称被视为它们被标记为已擦除,但与图案有关的例外匹配:
此异常的原因是应该可以导入使用的模块中的代码--立方的
,其中未擦除的构造函数不被视为已擦除。
请注意,从Cubical Agda模块重新导出的名称使用打开 进口 M(M) 参数 公众的
被视为使用立方Agda定义。
工具书类
Cyril Cohen、Thierry Coquand、Simon Huber和Anders Mörtberg;“立方型理论:对单价公理.
蒂埃里·科昆德(Thierry Coquand)、西蒙·胡贝尔(Simon Huber)、安德斯·莫特伯格(Anders Mörtberg);“关于高电感立方型理论中的类型”.
附录:立方Agda基元
Cubical Agda原语和内部由一系列在中找到的文件lib/prim/Agda/建筑/立体
的目录阿格达。这个agda/立方
库导出所有这些原语本文档中使用的名称。专家可能会发现了解实际导出的内容很有用,因为有很多没有真正由导出的可用原语agda/立方
,因此,本节的目标是列出这些内容文件夹。然而,对于普通用户和初学者agda/立方
库应该足够了,可以安全地忽略此部分。
警告:许多内置模块的定义可以写入尽管如此,Agda在内部用于实现立方体Agda,使用不同的实现很容易导致不稳定。偶数虽然它们可以在用户代码中定义,但不支持使用案例。
包含基元的关键文件是阿格达。原始。立方形
.出口以下内容建筑
、基元和假设:
{-#构建CUBEINTERVALUNIV IUniv#-} --IUniv:SSet₁
{-#构建间隔I#-} --I:IUniv公司
{-#构建IZERO i0#-}
{-#内置IONE i1#-}
中缀 30 初级中缀 20 primI蛋白 primI最大值原始的
primI蛋白 : 我 → 我 → 我 -- _∧_
primI最大值 : 我 → 我 → 我 --_∧_
初级 : 我 → 我 -- ~_
{-#内置ISONE ISONE#-} --IsOne:I→SSet
假设
它是一个 : IsOne公司 i1 -- 1=1
是One1 : ∀ 我 j个 → IsOne公司 我 → IsOne公司 (primI最大值 我 j个)
是One2 : ∀ 我 j个 → IsOne公司 j个 → IsOne公司 (primI最大值 我 j个)
{-#构建ITISONE它是一个#-}
{-#内置ISONE1 ISONE1#-}
{-#内置ISONE2 ISONE2#-}
{-#构建部分#-}
{-#BUILTIN PARTIALP部分#-}
假设
是一个空的 : ∀ {一} {A类 : 部分 i0(i0) (设置 一)} → 部分P i0(i0) A类{-#BUILTIN ISONEEMPTY为OneEmpty#-}
原始的
主要POr : ∀ {一} (我 j个 : 我) {A类 : 部分 (primI最大值 我 j个) (设置 一)}
→ 部分P 我 (λ z(z) → A类 (是One1 我 j个 z(z))) → 部分P j个 (λ z(z) → A类 (是One2 我 j个 z(z)))
→ 部分P (原始最大值 我 j个) A类 --以primHComp和primTransp计算
primComp公司 : ∀ {一} (A类 : (我 : 我) → 设置 (一 我)) {φ : 我} → (∀ 我 → 部分 φ (A类 我)) → (一 : A类 i0(i0)) → A类 i1语法 主要POr 第页 q个 u个 t吨 = [ 第页 ↦ u个 , q个 ↦ t吨 ]原始的
primTransp公司 : ∀ {一} (A类 : (我 : 我) → 设置 (一 我)) (φ : 我) → (一 : A类 i0(i0)) → A类 i1 原始HComp : ∀ {一} {A类 : 设置 一} {φ : 我} → (∀ 我 → 部分 φ A类) → A类 → A类
间隔我
属于它自己的种类,IUniv公司
.此类类型不支持合成和传输(不同于设置
),但功能类型从此排序中的类型到中的类型设置
do(不同于S设置).
路径类型由导出阿格达。内置。立方体。路径
:
假设
路径P : ∀ {ℓ} (A类 : 我 → 设置 ℓ) → A类 i0(i0) → A类 i1 → 设置 ℓ{-#BUILTIN PATHP路径#-}
中缀 4 _≡__≡_ : ∀ {ℓ} {A类 : 设置 ℓ} → A类 → A类 → 设置 ℓ_≡_ {A类 = A类} = 路径P (λ _ → A类)
{-#构建路径_≡_#-}
立方子类型由导出阿格达。内置。立方体。附属的
:
{-#内置子系统#-}
假设
股份有限公司 : ∀ {ℓ} {A类 : 设置 ℓ} {φ} (x个 : A类) → 附属的 A类 φ (λ _ → x个)
{-#在S#-}中构建子项
原始的
primSubOut(主SubOut) : ∀ {ℓ} {A类 : 设置 Ş} {φ : 我} {u个 : 部分 φ A类} → 附属的 _ φ u个 → A类
等效项由导出阿格达。内置。立方体。等同
:
记录 等于 {ℓ ℓ'} {A类 : 设置 ℓ} {B类 : 设置 ℓ'} ((f) : A类 → B类) : 设置 (ℓ ⊔ ℓ') 哪里
领域
同等安全 : (年 : B类) → 是控制 (纤维 (f) 年)
中缀 4 _≃__≃_ : ∀ {ℓ ℓ'} (A类 : 设置 ℓ) (B类 : 设置 ℓ') → 设置 (ℓ ⊔ ℓ')A类 ≃ B类 = Σ (A类 → B类) λ (f) → 等于 (f)equivFun公司 : ∀ {ℓ ℓ'} {A类 : 设置 ℓ} {B类 : 设置 Ş'} → A类 ≃ B类 → A类 → B类equivFun公司 电子 = 有限状态试验 电子同等证明 : ∀ {洛杉矶 书信电报} (T型 : 设置 洛杉矶) (A类 : 设置 书信电报) → (w个 : T型 ≃ A类) → (一 : A类)
→ ∀ ψ ((f) : 部分 ψ (纤维 (w个 .有限状态试验) 一)) → 纤维 (w个 .有限状态试验) 一 [ ψ ↦ (f) ]同等证明 A类 B类 w个 一 ψ 联邦调查局 = 对照 {A类 = 纤维 (w个 .有限状态试验) 一} (w个 .snd公司 .同等安全 一) ψ 联邦调查局 哪里
控制 : ∀ {ℓ} {A类 : 设置 ℓ} → 是控制 A类 → (φ : 我) → (u个 : 部分 φ A类) → A类 控制 {A类 = A类} (c(c) , 第页) φ u个 = hcomp公司 (λ{ 我 (φ = i1) → 第页 (u个 1=1) 我 ; 我 (φ = i0(i0)) → c(c) }) c(c){-#内置设备_≃_#-}
{-#BUILTIN EQUIVFUN EQUIVFUN#-}
{-#BUILTIN EQUIVPROOF EQUIVPROOF#-}
胶水类型由导出阿格达。内置。立方体。胶水
:
打开 进口 阿格达。内置。立方体。等同 公众的原始的
primGlue(primGlue) : ∀ {ℓ ℓ'} (A类 : 设置 ℓ) {φ : 我}
→ (T型 : 部分 φ (设置 ℓ')) → (电子 : 部分P φ (λ o(o) → T型 o(o) ≃ A类))
→ 设置 ℓ' prim^胶水 : ∀ {ℓ ℓ'} {A类 : 设置 ℓ} {φ : 我}
→ {T型 : 部分 φ (设置 Ş')} → {电子 : 部分P φ (λ o(o) → T型 o(o) ≃ A类)}
→ 部分P φ T型 → A类 → primGlue(primGlue) A类 T型 电子 原色^unglue : ∀ {ℓ ℓ'} {A类 : 设置 Ş} {φ : 我}
→ {T型 : 部分 φ (设置 Ş')} → {电子 : 部分P φ (λ o(o) → T型 o(o) ≃ A类)}
→ primGlue(primGlue) A类 T型 电子 → A类 面向所有人的primFace : (我 → 我) → 我
请注意,胶水类型在agda/立方
制造它们更易于使用:
胶水 : ∀ {ℓ ℓ'} (A类 : 设置 ℓ) {φ : 我}
→ (Te公司 : 部分 φ (Σ[ T型 ∈ 设置 ℓ' ] T型 ≃ A类))
→ 设置 ℓ'胶水 A类 Te公司 = primGlue(primGlue) A类 (λ x个 → Te公司 x个 .有限状态试验) (λ x个 → Te公司 x个 .snd公司)
这个阿格达。内置。立方体。身份证件
导出立体标识类型:
假设
身份证件 : ∀ {ℓ} {A类 : 设置 ℓ} → A类 → A类 → 设置 ℓ{-#构建ID ID#-}
{-#内置圆锥#-}
{-#内置REFLID REFLID#-}
原始的
primDepIMin公司 : _ primIdFace(原始ID面) : ∀ {ℓ} {A类 : 设置 ℓ} {x个 年 : A类} → 身份证件 x个 年 → 我 primIdPath : ∀ {ℓ} {A类 : 设置 Ş} {x个 年 : A类} → 身份证件 x个 年 → x个 ≡ 年原始的
primIdElim公司 : ∀ {一 c(c)} {A类 : 设置 一} {x个 : A类}
(C类 : (年 : A类) → 身份证件 x个 年 → 设置 c(c)) →
((φ : 我) (年 : A类 [ φ ↦ (λ _ → x个) ])
(w个 : (x个 ≡ 输出S 年) [ φ ↦ λ{ (φ = i1) _ → x个 } ]) →
C类 (输出S 年) (圆锥 φ (输出S w个))) →
{年 : A类} (第页 : 身份证件 x个 年) → C类 年 第页