比较coq中的两个不等值

时间:2016-10-01 22:57:59

标签: coq compcert

我证明了这个问题:

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,但没有去任何地方。任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:1)

不幸的是,你所拥有的原始定理是错误的。问题是Val.cmp如果其中一个比较值不是整数,则返回Vundef。检查cmpcmp_bool here的定义。

你所拥有的新定理是正确的,但没有以非常有用的形式陈述。最好这样陈述:

forall val1 val2, val1 <> val2 -> Val.cmp Ceq (Vint val1) (Vint val2) = Vfalse

使VintSome构造函数围绕均衡不会改变定理的真值,但会使其更难应用于大多数具体设置。结果应该是展开Val.cmpVal.cmp_boolInt.cmp,然后使用Int.eq_false重写。