Нужно найти правильную тактику над Int.lt

У меня есть следующая лемма, но я не смог доказать это:

Lemma my_comp2: forall i t:Z,
t<i -> Int.ltu (Int.repr i) (Int.repr t) = false.
Proof.
....

Я нашел тактику равенства (ссылка), но не могу найти тактику для lt/ltu или gt/gtu:

Theorem eq_false: forall x y, x <> y -> eq x y = false.

Любая помощь будет оценена!

Спасибо,

1 ответ

Решение

Эта лемма не может быть доказана, потому что она ложна. А вот контрпример для случая, когда wordsize = 8 биты (я оставлю обобщение для вас).

Давайте принимать i = 256 а также t = 255, Понятно, что предпосылка леммы верна (t < i). Затем, (Int.repr i) = 0 из-за целочисленного обтекания. (Int.repr t) = 255, поскольку в этом случае переполнения нет, но ltu вернусь true для вышеупомянутых значений, а не false как гласит лемма.

Definition i := 256.
Definition t := 255.

Eval compute in ltu (repr i) (repr t).  (* returns true *)


Что касается теоремы eq_false, она значительно отличается от вашей леммы, так как x а также y принадлежать int не Z:

Check eq_false
 : forall x y : int, x <> y -> eq x y = false

Надеюсь это поможет.

Другие вопросы по тегам