就像标题所说,我正在寻找一种在Coq中证明st X + st Y = st Y + (st X - 1) + 1
的方法。我一直在尝试应用plus_comm
,plus_assoc
和plus_permute
的各种组合,但我无法让它通过。有什么建议?
以下是目标窗口:
3 subgoal
n : nat
m : nat
st : state
H : st Y + st X = n + m /\ beval st (BNot (BEq (AId X) (ANum 0))) = true
______________________________________(1/3)
st Y + 1 + (st X - 1) = n + m
答案 0 :(得分:1)
对于整数,ring
或omega
应该能够解决这样的目标。它也可以手动完成。它有助于禁用符号,以便显示函数名称(按顺序使用SearchAbout
查找有用的引号)。以下可能不是最短的证据,只是我发现的第一个:
Require Import ZArith.
Lemma simple: forall x y, (x + y)%Z = (y + (x - 1) + 1)%Z.
intros.
rewrite Z.add_sub_assoc.
replace ((y + x)%Z) with ((x + y)%Z).
Focus 2.
rewrite Z.add_comm.
reflexivity.
set (t := ((x + y)%Z)).
replace (1%Z) with (Z.succ 0).
Focus 2.
symmetry.
apply Z.one_succ.
rewrite Zminus_succ_r.
rewrite Z.add_succ_r.
rewrite <- Zminus_0_l_reverse.
rewrite <- Zplus_0_r_reverse.
rewrite Z.succ_pred.
reflexivity.
Qed.
答案 1 :(得分:0)
对于那些希望使用欧米茄作为快速修复的人来说,这是将目标变为可以应用的形式的一种方法:
inversion H.
inversion H1.
rewrite negb_true_iff in H3.
apply beq_nat_false in H3.
omega.
为什么omega在我们这样做之后工作而不是在目标处于原始状态时,这是Github用户jaewooklee93的一个很好的答案:
“你不需要在这里考虑plus_comm或类似的lemmas,因为omega可以解决那些容易出问题的问题。你的目标几乎是微不足道的,但是omega明确目标的原因仅仅是因为nat之间的减号是与我们已经知道的不一样; 2-5 = 0,因为nat中没有负面概念。所以如果你不提供st X大于零的事实,omega无法为你清除目标但是你在H1中已经有了这个条件。因此,你唯一应该做的就是简化H1并将引用应用到H1以使其为X X&lt;&gt; 0.然后omega可以正常工作。“