Coq不产生归纳假设

Coq不产生归纳假设,coq,proof,theorem-proving,Coq,Proof,Theorem Proving,我得到了如下定理的解: Require Import Coq.Lists.List. Import ListNotations. Inductive suffix {X : Type} : list X -> list X -> Prop := | suffix_end : forall xs, suffix xs xs | suffix_step : forall x xs ys, suffix xs ys ->

我得到了如下定理的解:

Require Import Coq.Lists.List.
Import ListNotations.

Inductive suffix {X : Type} : list X -> list X -> Prop :=
  | suffix_end : forall xs,
          suffix xs xs
  | suffix_step : forall x xs ys,
          suffix xs ys ->
          suffix (x :: xs) ys.

Theorem suffix_app (X: Type) (xs ys: list X) :
  suffix xs ys -> exists ws, xs = ws ++ ys.
Proof.
  induction 1 as [|x xsp ysp hs [zs zeq]]. 
  - exists []. reflexivity.
  - now exists (x :: zs); rewrite zeq.
Qed.
我试图在另一台机器上快速复制它,并尝试这样做:

Theorem suffix_app (X: Type) (xs ys: list X) :
  suffix xs ys -> exists ws, xs = ws ++ ys.
Proof.
  induction 1.
  - exists []. reflexivity.
  - (* Stuck here! *)
Abort.

i、 e.没有“as”条款。然而,由于我无法理解的原因,没有生成自动命名的“zeq”等价物,因此我陷入了困境。为什么在第二种情况下,Coq生成的(自动命名的)等效“zeq”不在这里?

正如@ejgallego在评论中提到的,这是因为
As
子句允许所谓的介绍模式(即@AntonTrunov在评论中提到的,也可以与
介绍
策略一起使用的模式)。
[zszeq]
模式意味着
自毁。。。作为[zs zeq]

要了解有关介绍模式的更多信息,请参阅

它就在这里,请注意,在您的第一个示例中,模式中有一个
destruct
。因此,
解构ihas[zs zeq]。
会让你回到游戏中。我很震惊我从未发现这一点,但是。。。这就是生活。谢谢,这完全回答了我的问题。请随便把它作为答案,我会接受的。除了销毁,
简介
还可以重写(
->
):
归纳1为[| x???[zs->];[exists[]| exists(x::zs)];琐碎。