我如何结束关于coq中opt_c的演示? 我正在读逻辑基础书。它介绍了这个不动点和这个定理: Fixpoint optimize_0plus (a:aexp) : aexp := match a with | APlus (ANum 0) e2 => optimize_0plus e2 | APlus e1 e2 => APlus (optimize_0plus e1) (optimize_0plus e2) | AMinus e1 e2 => AMinus (optimize_0plus e1) (optimize_0plus e2) | AMult e1 e2 => AMult (optimize_0plus e1) (optimize_0plus e2) | _ => a end. Theorem optimize_0plus_sound: forall a st, aeval st (optimize_0plus a) = aeval st a.

我如何结束关于coq中opt_c的演示? 我正在读逻辑基础书。它介绍了这个不动点和这个定理: Fixpoint optimize_0plus (a:aexp) : aexp := match a with | APlus (ANum 0) e2 => optimize_0plus e2 | APlus e1 e2 => APlus (optimize_0plus e1) (optimize_0plus e2) | AMinus e1 e2 => AMinus (optimize_0plus e1) (optimize_0plus e2) | AMult e1 e2 => AMult (optimize_0plus e1) (optimize_0plus e2) | _ => a end. Theorem optimize_0plus_sound: forall a st, aeval st (optimize_0plus a) = aeval st a.,coq,coq-tactic,Coq,Coq Tactic,我决定用sound定理在bexp上定义另一个优化: Fixpoint opt_b (b : bexp) : bexp := match b with | BEq a1 a2 => BEq (optimize_0plus a1) (optimize_0plus a2) | BLe a1 a2 => BLe (optimize_0plus a1) (optimize_0plus a2) | BNot b => BNot (opt_b b) | B

我决定用sound定理在bexp上定义另一个优化:

Fixpoint opt_b (b : bexp) : bexp :=
  match b with
    | BEq a1 a2 => BEq (optimize_0plus a1) (optimize_0plus a2)
    | BLe a1 a2 => BLe (optimize_0plus a1) (optimize_0plus a2)
    | BNot b => BNot (opt_b b)
    | BAnd BTrue b2 => (opt_b b2)
    | BAnd BFalse _ => BFalse
    | BAnd b1 b2 => BAnd (opt_b b1) (opt_b b2)
    | _ => b
  end.
Theorem opt_b_sound: 
  forall b st,
  beval st (opt_b b) = beval st b.
然后,我介绍了Imp comand上的另一个优化(使用以前的优化):

现在我必须证明这个opt_c声音定理,但我无法关闭它:

Theorem opt_c_sound: 
  forall c st st',
  ceval c st st' <-> ceval (opt_c c) st st'.  
Proof.
  intros.
  split. 
  {
    intros. induction H; simpl.
    - constructor.
    - constructor. rewrite optimize_0plus_sound. assumption.
    - apply E_Seq with st'; assumption.
    - apply E_IfTrue.
      + rewrite opt_b_sound. assumption.
      + assumption.
    - apply E_IfFalse.
      + rewrite opt_b_sound. assumption. 
      + assumption.
    - apply E_WhileFalse. rewrite opt_b_sound. assumption.
    - apply E_WhileTrue with st'.
      + rewrite opt_b_sound. assumption.
      + assumption.
      + simpl in IHceval2. assumption. 
  }
  {
    generalize dependent st'.
    generalize dependent st.
    induction c; intros; inversion H; subst.
    - constructor.
    - rewrite optimize_0plus_sound. constructor. trivial.
    - apply E_Seq with st'0. 
      + apply IHc1 in H2. assumption.
      + apply IHc2 in H5. assumption.
    - apply E_IfTrue.
      + rewrite opt_b_sound in H5. assumption.
      + apply IHc1 in H6. assumption.
    - apply E_IfFalse.
      + rewrite opt_b_sound in H5. assumption.
      + apply IHc2 in H6. assumption.
    - apply E_WhileFalse. rewrite opt_b_sound in H4. assumption.
    - apply E_WhileTrue with st'0.
      + rewrite opt_b_sound in H2. assumption.
      + apply IHc in H3. assumption.
      + (* I'm blocked here *)
Thermory opt_c_声音:
对于所有c st',
ceval c st'ceval(选择c)st'。
证明。
介绍。
分裂
{
简介:归纳法;简单归纳法。
-构造器。
-构造函数。重写优化加上声音。假设。
-将E_Seq与st'假设一起应用。
-如有必要,请使用E_。
+重写opt_b_声音。假设。
+假设。
-应用E_IfFalse。
+重写opt_b_声音。假设。
+假设。
-应用E_WhileFalse。重写opt_b_sound。假设。
-在使用st'时应用E_。
+重写opt_b_声音。假设。
+假设。
+IHceval2中的simpl。假设。
}
{
广义相依st′。
广义相依st。
归纳c;引子;倒转H;子。
-构造器。
-重写优化\u 0plus\u声音。构造函数。琐碎。
-将E_-Seq与st'0一起应用。
+在H2中应用IHc1。假设。
+在H5中应用IHc2。假设。
-如有必要,请使用E_。
+重写H5中的opt_b_音。假设。
+在H6中应用IHc1。假设。
-应用E_IfFalse。
+重写H5中的opt_b_音。假设。
+在H6中应用IHc2。假设。
-应用E_WhileFalse。重写H4中的opt_b_音。假设。
-在使用st'0的同时应用E_。
+重写H2中的opt_b_音。假设。
+在H3中应用IHc。假设。
+(*我被封锁在这里*)

如何关闭这个定理?

问题是您正在对
c
执行归纳,这不会为
WhileTrue
情况产生有用的归纳假设。要解决这个问题,您需要使用
记住
策略对
ceval(opt_c)st'
执行归纳:

remember (opt_c c) as c'.
generalize dependent c.
induction H.

我必须把你的代码放在哪里?而不是归纳c或我被阻止的地方?而不是
归纳c
。我仍然无法关闭定理…嗯,我想我已经找出了错误。我编辑了我的答案。
remember (opt_c c) as c'.
generalize dependent c.
induction H.