Types 匹配时的Coq nat类型检查
我对第一个带有Types 匹配时的Coq nat类型检查,types,coq,Types,Coq,我对第一个带有O的分支如何返回类型为(0>0)->nat的函数感到困惑。问题是:如何将False与endanat匹配?似乎没有返回值?!那是什么意思?我不是专家。但是从功能的角度来看,pred1的返回值是一个函数返回nat,而不是anat。对于任何输入n,结果函数将n>0的证明pf转换为nat 函数不需要(或不能)返回不存在参数的任何值。在极端情况下,当功能域为空时,编码域也为空(或可视为空) 这就是为什么当pf处于False(这是一个空类型)时,函数不能返回任何特定的nat值,并且它必须不返回
O
的分支如何返回类型为(0>0)->nat
的函数感到困惑。问题是:如何将False与end
anat
匹配?似乎没有返回值?!那是什么意思?我不是专家。但是从功能的角度来看,pred1
的返回值是一个函数返回nat
,而不是anat
。对于任何输入n
,结果函数将n>0
的证明pf
转换为nat
函数不需要(或不能)返回不存在参数的任何值。在极端情况下,当功能域为空时,编码域也为空(或可视为空)
这就是为什么当pf
处于False
(这是一个空类型)时,函数不能返回任何特定的nat
值,并且它必须不返回任何内容
从语法上讲,如果将函数的简化版本与从nat
到nat
的函数进行比较:
Theorem nzgtz : ~ 0 > 0.
Proof.
unfold not.
unfold gt.
unfold lt.
intros H.
inversion H.
Qed.
Print nzgtz.
Definition pred1 (n : nat) : n > 0 -> nat :=
match n with
| O => fun pf => match (nzgtz pf) with end
| S n' => fun _ => n'
end.
与p1
中的两个分支/构造函数相比,p
中的pf
的False
证明没有与匹配的构造函数(0个分支)
出于类似的原因,您可以使用False
的证明来(真空地)证明任何事情 将X与end进行匹配
是为了排除不可能的情况。实际上,读取pred1
函数的零分支的典型方法是“这种情况不可能”
因此,不可能的情况不需要返回值
p、 学生:请注意,我无法想象一个
pred1
会有用的场景。我理解这种直觉,但我希望非常严格。第一个分支的类型(n>0)->nat到底是什么?在Coq中,nat被定义为由零(O)及其后继者(S(0)、S(1)等)构成。没有与nat关联的“空”数量。虽然(0>0)的计算结果应为False,但函数是否仍应返回nat?@pyrrhic我认为您不能有意义地返回任何nat
。如果您有一个函数f:Empty->nat
,函数的图像/编码域应该是什么?由于域中没有可映射的内容,因此图像中无法显示或返回任何内容False
是一个空类型,其中没有居住者。哦,pred1
在教学中非常有用:)。它非常类似于中的pred_strong1
函数,用作指导依赖类型编程,特别是子集类型的入门示例。@AntonTrunov这正是我要找的参考!!多谢各位@安东特鲁诺夫,我明白了!然而,我一点也不喜欢那一章,也不喜欢那种特殊的子类型方法;简单的模式应用会导致大量的证明无关问题,因此,从一开始就使用真正的子类型库更好,即使学习曲线更高。有这样的“真正的子类型库”的例子吗?看一个具体的例子来完全理解你的意思是非常有趣的。我说的“真”是指完整。我想很多人都有自己的想法,我用了这个:它的全部力量只会在以后出现(见tuple.v)。我的意思是,pred pf1 n1=pred pf2 n2
什么时候成立?
Definition p : False -> nat :=
fun pf => match pf with end.
Definition p1 : nat -> nat :=
fun pf => match pf with
| 0 => 0
| S p => p
end.