Types 判决平等

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

TL;DR:在Agda中,给定
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