Types 判决平等
TL;DR:在Agda中,给定Types 判决平等,types,agda,Types,Agda,TL;DR:在Agda中,给定a:a和证明:a==B,我可以获得元素a:B 在我不断学习Agda的过程中,我创建了以下Prime:nat->Setdatatype,它见证了自然语言的素性 Prime zero = False Prime (succ zero) = False Prime (succ (succ n)) = forall {i : nat} -> divides i p -> i <N p -> zero <N i -> i == (succ
a:a
和证明:a==B
,我可以获得元素a:B
在我不断学习Agda的过程中,我创建了以下
Prime:nat->Set
datatype,它见证了自然语言的素性
Prime zero = False
Prime (succ zero) = False
Prime (succ (succ n)) = forall {i : nat} -> divides i p -> i <N p -> zero <N i -> i == (succ zero)
where
p = succ (succ n)
在哪里
是依赖对sga pred
其中(p,pred(p))
李>p:A
提取值并丢弃证据value:Sg A pred->A
我已经证明了顺序的三分法:对于所有的
a,b
来说,a这证明是很容易的;就这么做吧(tm)
我想就这一专题指出一些理论背景
Agda的核心是Martin Löf的逻辑框架(LF),它是一个最小依赖类型的lambda演算,它为我们提供了依赖函数等。总体而言,Agda基于内涵ML类型理论
在LF中,有一个称为类型转换规则的规则,该规则声明
Γ ⊢ t : A Γ ⊢ A = B
--------------------------
Γ ⊢ t : B
这将强制术语与类型相等。其中,通过计算(beta)和可扩展性(eta)确定两种类型的定义相等
编辑以澄清:
在内涵TT中,判断平等和命题平等是分开的,命题平等不会给你判断。如果您希望给定两个命题相等项的规则在判断上也是相等的,那么您将处于扩展TT中,这通常是不可取的,因为它使类型检查不可判定。所以,在内涵TT中,它并不总是正确的。这是定义等式,而不是命题等式。如果没有某种扩展性,你通常不能从t:A,A=B
(其中=
是命题的)中导出t:B
。对,我在考虑eta转换,但我想这会远离内涵TT。
typeCast : {a : _} {A : Set a} {B : Set a} (el : A) (pr : A == B) -> B
typeCast {a} {A} {.A} elt refl = elt
Γ ⊢ t : A Γ ⊢ A = B
--------------------------
Γ ⊢ t : B