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)];琐碎。