Coq中带匹配表达式的构造函数等式分解

Coq中带匹配表达式的构造函数等式分解,coq,coq-tactic,Coq,Coq Tactic,我有一个类似的问题,但是,我的等式包含一个匹配表达式。考虑这个例子(这是无关紧要的,但只是用于澄清): 此时,在环境中使用n:nat,目标是: Some (S n) = match positive n with | Some n0 => Some (S n0) | None => None end 我想将其转换为环境中的两个子目标n,n0:nat: positive n = Some n0 (* Verifying the match *) S n = S n0

我有一个类似的问题,但是,我的等式包含一个
匹配
表达式。考虑这个例子(这是无关紧要的,但只是用于澄清):

此时,在环境中使用
n:nat
,目标是:

Some (S n) =
match positive n with
| Some n0 => Some (S n0)
| None => None
end
我想将其转换为环境中的两个子目标
n,n0:nat

positive n = Some n0  (* Verifying the match *)
S n = S n0            (* Verifying the result *)
我希望,如果证明平等的
匹配
有多个可能有效的案例,那么新的目标是所有可能性的分离,例如

Some (S n) =
match positive n with
| Some (S n0) => Some (S (S n0))
| Some O => Some (S O)
| None => None
end
我希望

   (positive n = Some (S n0) /\ S n = S (S n0))  (* First alternative *)
\/ (positive n = Some O      /\ S n = S O)       (* Second alternative *)

是否有一种Coq策略可以做到这一点或类似的事情?

我很难理解你的动机。在您的示例中,使用更一般的引理更容易证明您的结果:

Fixpoint positive (n : nat) :=
  match n with
  | O => Some O
  | S n => match positive n with
    | Some n => Some (S n)
    | None => None (* Note that this never happens *)
    end
  end.

Lemma positiveness n : positive n = Some n.
Proof.
  now induction n as [|n IH]; simpl; trivial; rewrite IH.
Qed.

Lemma positiveness' n : Some (S n) = positive (S n).
Proof. now rewrite positiveness. Qed.

也许您想要执行的案例分析更适合不同的应用程序?

我很难理解您的动机。在您的示例中,使用更一般的引理更容易证明您的结果:

Fixpoint positive (n : nat) :=
  match n with
  | O => Some O
  | S n => match positive n with
    | Some n => Some (S n)
    | None => None (* Note that this never happens *)
    end
  end.

Lemma positiveness n : positive n = Some n.
Proof.
  now induction n as [|n IH]; simpl; trivial; rewrite IH.
Qed.

Lemma positiveness' n : Some (S n) = positive (S n).
Proof. now rewrite positiveness. Qed.
也许您想要执行的案例分析更适合于不同的应用程序

是否有一种Coq策略可以做到这一点或类似的事情

如果运行
析构函数(正n)eqn:H
,将得到两个子目标。在第一个子目标中,您可以得到:

  n, n0 : nat
  H : positive n = Some n0
  ============================
  Some (S n) = Some (S n0)
在第二个子目标中,你得到

  n : nat
  H : positive n = None
  ============================
  Some (S n) = None
这并不完全是您要求的,但是在第二个子目标中,您可以编写
assert(exists n0,positive n=Some n0)
;这将为您提供所寻求的目标,您可以通过
销毁
存在的
并使用
一致性
区分
来实现剩余目标,以表明
正n
不能同时是
部分

是否有一种Coq策略可以做到这一点或类似的事情

如果运行
析构函数(正n)eqn:H
,将得到两个子目标。在第一个子目标中,您可以得到:

  n, n0 : nat
  H : positive n = Some n0
  ============================
  Some (S n) = Some (S n0)
在第二个子目标中,你得到

  n : nat
  H : positive n = None
  ============================
  Some (S n) = None

这并不完全是您要求的,但是在第二个子目标中,您可以编写
assert(exists n0,positive n=Some n0)
;这将给你你所寻求的目标,你可以通过
销毁
存在的
并使用
一致性
区分性
来实现剩下的目标,以表明
正n
不能同时是
一些

是的,这是我在MWE上的尝试。我同意这是愚蠢的。我的问题是可以这样回答的,还是我应该编辑它以给出一个更有意义的例子?@Keelan是的,有一个更好的例子会很有用。在Coq中,我们常常试图对一个可以用更简单的方法解决的问题实施一个困难的解决方案,从而使我们的生活变得复杂。因此,了解你为什么需要案例分析将有助于解决你的问题。对不起,这有点复杂:这是家庭作业,我不想发布太多,但另一方面,我无法找到另一个自然出现这种情况的例子。我将和我的老师讨论。抱歉占用了你的时间。是的,这是我尝试的MWE。我同意这是愚蠢的。我的问题是可以这样回答的,还是我应该编辑它以给出一个更有意义的例子?@Keelan是的,有一个更好的例子会很有用。在Coq中,我们常常试图对一个可以用更简单的方法解决的问题实施一个困难的解决方案,从而使我们的生活变得复杂。因此,了解你为什么需要案例分析将有助于解决你的问题。对不起,这有点复杂:这是家庭作业,我不想发布太多,但另一方面,我无法找到另一个自然出现这种情况的例子。我将和我的老师讨论。很抱歉占用了你的时间。