Coq 不生成归纳假设
Coq not generating inductive hypothesis
我得到了以下定理的解决方案,如下所示:
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" 的自动命名等价物由于我无法解决的原因而未生成,因此我被卡住了。为什么在第二种情况下,Coq 生成的(自动命名的)等效于 "zeq"?
正如@ejgallego 在评论中提到的,这是因为 as
子句允许所谓的介绍模式(即您也可以与 intros
策略一起使用的模式,如@AntonTrunov 在评论中提到)。
[zs zeq]
模式表示 destruct ... as [zs zeq]
。
要了解有关介绍模式的更多信息,请参阅 https://coq.inria.fr/refman/proof-engine/tactics.html#coq:tacn.intros
我得到了以下定理的解决方案,如下所示:
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" 的自动命名等价物由于我无法解决的原因而未生成,因此我被卡住了。为什么在第二种情况下,Coq 生成的(自动命名的)等效于 "zeq"?
正如@ejgallego 在评论中提到的,这是因为 as
子句允许所谓的介绍模式(即您也可以与 intros
策略一起使用的模式,如@AntonTrunov 在评论中提到)。
[zs zeq]
模式表示 destruct ... as [zs zeq]
。
要了解有关介绍模式的更多信息,请参阅 https://coq.inria.fr/refman/proof-engine/tactics.html#coq:tacn.intros