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 也为(或可以视为)空。
这就是为什么当 pf
在 False
中(这是一个空类型)时,函数不能 return 任何特定的 nat
值,它必须return 没有。
在句法上,如果将函数的简化版本与 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.
p
中 False
的证明 pf
与 match with
中的两个 branches/constructors 相比没有构造函数(0 个分支) =27=].
出于类似的原因,您可以使用 False
的证明来(空洞地)证明任何事情。
match X with end
是为了排除不可能的情况。实际上,读取 pred1
函数的零分支的典型方法是 "this case is impossible".
因此,不可能的情况不需要 return 值。
p.s:请注意,我无法想象 pred1
有用的场景。
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 也为(或可以视为)空。
这就是为什么当 pf
在 False
中(这是一个空类型)时,函数不能 return 任何特定的 nat
值,它必须return 没有。
在句法上,如果将函数的简化版本与 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.
p
中 False
的证明 pf
与 match with
中的两个 branches/constructors 相比没有构造函数(0 个分支) =27=].
出于类似的原因,您可以使用 False
的证明来(空洞地)证明任何事情。
match X with end
是为了排除不可能的情况。实际上,读取 pred1
函数的零分支的典型方法是 "this case is impossible".
因此,不可能的情况不需要 return 值。
p.s:请注意,我无法想象 pred1
有用的场景。