Coq 使用假设删除匹配语句中的大小写
我想在函数中使用一个假设来排除Coq 使用假设删除匹配语句中的大小写,coq,Coq,我想在函数中使用一个假设来排除match语句中的一些情况。我想知道Coq是如何做到这一点的 一个非常简单的例子是在nat上使用match的函数。我想使用一个假设,即n0,这样我就不必为0提供匹配模式,如下所示: Fixpoint minus_1 (n:nat) (H:n<>0): nat := match n with | S n' => n' end. 不动点减去_1(n:nat)(H:n0):nat:= 匹配 |n'=>n' 结束。 上面的示例给出了错误
match
语句中的一些情况。我想知道Coq是如何做到这一点的
一个非常简单的例子是在nat
上使用match
的函数。我想使用一个假设,即n0
,这样我就不必为0
提供匹配模式,如下所示:
Fixpoint minus_1 (n:nat) (H:n<>0): nat :=
match n with
| S n' => n'
end.
不动点减去_1(n:nat)(H:n0):nat:=
匹配
|n'=>n'
结束。
上面的示例给出了错误:非穷举模式匹配:未找到模式0的子句
如何利用H
不必为0
提供模式 您可以依靠程序库来填补一些空白,例如:
Require Import Arith Program.
Program Fixpoint minus_1 (n: nat) (h: n <> 0) : nat :=
match n with
| S p => p
| _ => _
end.
需要导入算术程序。
程序不动点减_1(n:nat)(h:n0):nat:=
匹配
|sp=>p
| _ => _
结束。
或者,您可以使用策略(在v8.4中)构建术语“手动”:
不动点减去_1(n:nat)(h:n0){structn}:nat。
将n分解为[| p]。
-案例h;自反性。
-精确p。
定义
以下是一个适用于旧版本Coq的版本:
Definition minus_1 (n: nat) (h: n <> 0) : nat.
revert h.
elim n.
intros heq; case heq; reflexivity.
intros p _ _; exact p.
Defined.
定义减1(n:nat)(h:n0):nat。
回复h。
艾琳。
heq简介;病例heq;自反性。
简介p u ;;精确p。
定义
在所有情况下,您都可以使用
打印减号1.
查看结果项。您可以在匹配项上使用返回
注释:
Lemma notNotEqual : forall x:nat, (x <> x) -> False.
auto.
Qed.
Definition predecessor (n:nat) : n<>0 -> nat :=
match n return (n <> 0 -> nat) with
| 0 =>
fun H : 0 <> 0 =>
match notNotEqual 0 H with end
| S m => fun _ => m
end.
谢谢最后两个例子就是我想要的。(如果你有一个更复杂的例子,第一个就不那么安全了,你可能会忘记一些重要的情况。)注意,你的函数不是一个真正的不动点,你应该用
定义来定义它。如果是真正的递归调用,您必须使用策略修复
,并确保在子项上使用它才能通过终止检查器。谢谢您的回答!能够使用match语句使函数更具可读性。我仍在努力理解何时需要回报或不需要回报。。。
Lemma notNotEqual : forall x:nat, (x <> x) -> False.
auto.
Qed.
Definition predecessor (n:nat) : n<>0 -> nat :=
match n return (n <> 0 -> nat) with
| 0 =>
fun H : 0 <> 0 =>
match notNotEqual 0 H with end
| S m => fun _ => m
end.
Definition predecessor_alt (n:nat) : n<>0 -> nat.
refine
(match n return (n <> 0 -> nat) with
| 0 => _
| S m => fun _ => m
end).
intros; assert False as nope.
auto.
inversion nope.
Defined.