Coq nat 匹配类型检查

Coq nat type check on match

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.

我很困惑第一个分支如何使用 O returns 类型为 (0 > 0) -> nat 的函数。问题是:match False with end 怎么是 nat?好像没有返回值?!这个表情是什么意思?

我不是专家。但是从函数的角度来看,pred1的return值是一个函数returningnat,而不是一个nat。对于任何输入 n,结果函数将 n > 0 的证明 pf 转换为 nat.

函数不需要(或不能)return 不存在参数的任何值。在极端情况下,当函数的域为空时,codomain 也为(或可以视为)空。

这就是为什么当 pfFalse 中(这是一个空类型)时,函数不能 return 任何特定的 nat 值,它必须return 没有。

在句法上,如果将函数的简化版本与 natnat 中的函数进行比较:

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.

pFalse 的证明 pfmatch with 中的两个 branches/constructors 相比没有构造函数(0 个分支) =27=].

出于类似的原因,您可以使用 False 的证明来(空洞地)证明任何事情。

match X with end是为了排除不可能的情况。实际上,读取 pred1 函数的零分支的典型方法是 "this case is impossible".

因此,不可能的情况不需要 return 值。

p.s:请注意,我无法想象 pred1 有用的场景。