我证明了这个问题:
Require Import compcert.lib.Coqlib.
Require Import compcert.lib.Integers.
Require Import compcert.common.Values.
Lemma test: forall (val1 val2: int), ((Vint val1) <> (Vint val2)) -> (Some (Val.cmp Ceq (Vint val1) (Vint val2)) = Some Vfalse).
Proof.
Admitted.
我尝试展开not, Val.cmp, ...
并使用rewrite
而不是H
,但没有去任何地方。任何帮助表示赞赏。
由于
答案 0 :(得分:1)
不幸的是,你所拥有的原始定理是错误的。问题是Val.cmp
如果其中一个比较值不是整数,则返回Vundef
。检查cmp
和cmp_bool
here的定义。
你所拥有的新定理是正确的,但没有以非常有用的形式陈述。最好这样陈述:
forall val1 val2, val1 <> val2 -> Val.cmp Ceq (Vint val1) (Vint val2) = Vfalse
使Vint
和Some
构造函数围绕均衡不会改变定理的真值,但会使其更难应用于大多数具体设置。结果应该是展开Val.cmp
,Val.cmp_bool
和Int.cmp
,然后使用Int.eq_false
重写。