Coq nat类型检查匹配

时间:2016-09-05 16:39:07

标签: types coq

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的第一个分支如何返回类型为(0 > 0) -> nat的函数感到困惑。问题是:match False with end nat怎么样?似乎没有返回任何价值?!那个表达是什么意思?

2 个答案:

答案 0 :(得分:2)

我不是专家。但从功能的角度来看,pred1的返回值是函数返回 nat a nat。对于任何输入n,结果函数会将pf的证明n > 0转换为nat

函数不需要(或不能)返回不存在的参数上的任何值。在极端情况下,当函数的域为空时,codomain也是(或者可以看作)为空。

这就是为什么当pfFalse(这是一个空类型)时,该函数不能返回任何特定的nat值,并且它必须不返回任何内容

从语法上讲,如果您将该函数的简化版本与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.
pf中的两个分支/构造函数相比,Falsep的证明match with没有构造函数(0个分支)到p1

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

答案 1 :(得分:2)

match X with end旨在排除不可能的案例。实际上,读取pred1函数的零分支的典型方法是"这种情况是不可能的"。

因此,一个不可能的案例并不需要返回值。

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