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
怎么样?似乎没有返回任何价值?!那个表达是什么意思?
答案 0 :(得分:2)
我不是专家。但从功能的角度来看,pred1
的返回值是函数返回 nat
,不 a nat
。对于任何输入n
,结果函数会将pf
的证明n > 0
转换为nat
。
函数不需要(或不能)返回不存在的参数上的任何值。在极端情况下,当函数的域为空时,codomain也是(或者可以看作)为空。
这就是为什么当pf
在False
(这是一个空类型)时,该函数不能返回任何特定的nat
值,并且它必须不返回任何内容
从语法上讲,如果您将该函数的简化版本与nat
到nat
的简化版本进行比较:
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
中的两个分支/构造函数相比,False
中p
的证明match with
没有构造函数(0个分支)到p1
出于类似的原因,您可以使用False
的证明(空白)来证明任何事情。
答案 1 :(得分:2)
match X with end
旨在排除不可能的案例。实际上,读取pred1
函数的零分支的典型方法是"这种情况是不可能的"。
因此,一个不可能的案例并不需要返回值。
p.s:请注意,我无法设想pred1
有用的风景。