比较coq中的两个不相等的值
comparing two unequal values in coq
我正在证明这个引理:
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, ...
并在 H
上使用 rewrite
,但没有成功。感谢任何帮助。
谢谢
不幸的是,你原来的定理是错误的。问题是 Val.cmp
returns 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
.
重写
我正在证明这个引理:
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, ...
并在 H
上使用 rewrite
,但没有成功。感谢任何帮助。
谢谢
不幸的是,你原来的定理是错误的。问题是 Val.cmp
returns 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
.