2016-10-01 9 views
0

Я доказав эту лемму:сравнивающие два неравных значения в 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, ... и используя rewrite над H, но никуда не пошел. Любая помощь приветствуется.

Благодаря

ответ

1

Первоначальная теорема, что у вас была ложной, к сожалению. Проблема заключалась в том, что Val.cmp возвращает Vundef, если одно из сравниваемых значений не является целым числом. Проверьте определение cmp и cmp_boolhere.

Новая теорема, которая у вас есть, верна, но не указана в очень полезной форме. Лучше указать это так:

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.

+0

Хорошая точка. Я сделал редактирование леммы. Можете ли вы снова взглянуть на него? –

+0

Да, только что сделал редактирование. –

+0

'val1' и' val2' не имеют типа 'int'. Они имеют тип 'val'. Поэтому я не могу использовать Int.eq_false. –

 Смежные вопросы

  • Нет связанных вопросов^_^