Coq不产生归纳假设

时间:2017-05-21 14:17:54

标签: 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 ->
          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.

即。没有" as"条款。但是,由于自动命名等效于" zeq"不是因为我无法解决的原因而生成的。为什么(&自动命名)等同于" zeq" Coq在第二种情况下在这里产生了什么?

1 个答案:

答案 0 :(得分:2)

正如@ejgallego在评论中提到的那样,这是因为as子句允许所谓的介绍模式(也就是你可以使用intros策略使用的模式,如上所述@AntonTrunov发表评论)。 [zs zeq]模式表示destruct ... as [zs zeq]。 要了解有关简介模式的更多信息,请参阅https://coq.inria.fr/refman/proof-engine/tactics.html#coq:tacn.intros