我如何结束关于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.
我决定用sound定理在bexp上定义另一个优化:我如何结束关于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
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.