Решая равенство / неравенство в цели, код Coq
Как я могу доказать, что эти два утверждения равны:
Val.shru (Val.and a (Vint b)) (Vint c) = Vint? 3434 / \? 3434 <> d
Val.shru (Val.and a (Vint b)) (Vint c) <> d
Концепция довольно проста, но застряла в поиске правильной тактики для ее решения. Это на самом деле лемма, которую я собираюсь доказать:
Require Import compcert.common.Values.
Require Import compcert.lib.Coqlib.
Require Import compcert.lib.Integers.
Lemma val_remains_int:
forall (a : val) (b c d: int),
(Val.shru (Val.and a (Vint b)) (Vint c)) <> (Vint d) ->
(exists (e : int), (Val.shru (Val.and a (Vint b)) (Vint c)) = (Vint e) /\ e <> d).
Proof.
intros.
eexists.
...
Admitted.
Спасибо,
1 ответ
Решение
Если вы можете построить значение типа int
(i0
в приведенном ниже примере), то эта лемма не выполняется:
Require Import compcert.lib.Coqlib.
Require Import compcert.lib.Integers.
Require Import compcert.common.Values.
Variable i0 : int.
Fact counter_example_to_val_remains_int:
~ forall (a : val) (b c d: int),
(Val.shru (Val.and a (Vint b)) (Vint c)) <> (Vint d) ->
(exists (e : int),
(Val.shru (Val.and a (Vint b)) (Vint c)) = (Vint e)
/\ e <> d).
Proof.
intro H.
assert (Vundef <> Vint i0) as H0 by easy.
specialize (H Vundef i0 i0 i0 H0); clear H0.
simpl in H.
destruct H as (? & contra & _).
discriminate contra.
Qed.
Есть как минимум две причины:
Val.and
а такжеVal.shru
вернутьVundef
для всех аргументов, которые не являютсяVint
(это пример принципа GIGO);- также вы не можете сдвинуть биты слишком далеко в C - результат не определен (это о
Val.shru
).
Что касается модифицированной леммы, которую вы упомянули в своем комментарии, просто reflexivity
сделал бы:
Lemma val_remains_int: forall a b c d: int,
Vint (Int.shru (Int.and a b) c) <> Vint d ->
exists (e : int), Vint (Int.shru (Int.and a b) c) = Vint e /\ e <> d.
Proof.
intros a b c d Hneq.
eexists. split.
- reflexivity.
- intro Heq. subst. auto.
Qed.