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.