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
a
nat
匹配?似乎没有返回值?!那是什么意思?

我不是专家。但是从功能的角度来看,
pred1
的返回值是一个函数返回
nat
,而不是a
nat
。对于任何输入
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.