2015-04-22 2 views
2

Мне весело, представившись Coq. Прямо сейчас я застрял делать доказательств о перечислении:В coq, как вы объявляете/подтверждаете элементы перечисления, различны?

Inductive Comparison : Type := 
    | EQUAL 
    | GREATER 
    | LESSER. 

ли это неявно верно, что EQUAL и GREATER и LESSER отличаются (это, кажется, что эти документы означают), или в том, что не определено только с выше код? Я не могу понять, как это доказать.

Proposition comp_sanity: forall x : Comparison, 
    x = EQUAL /\ x = GREATER -> False. 
Proof. 
intros x H_eqgr. 

дает мне:

H_eqgr : x = EQUAL /\ x = GREATER 
-------------------------------------------------- 
False 

но я застрял:

Coq> contradiction H_eqgr. 
Error: Not a contradiction. 

Что я должен делать здесь, чтобы иметь полностью (отчетливо) перечисленное типа?

ответ

4

В вашем случае я бы пошел на тактику discriminate вместо contradiction. Короткая версия будет:

Proposition comp_sanity: forall x : Comparison, 
    x = EQUAL /\ x = GREATER -> False. 
Proof. 
now intros x [h1 h2]; subst; discriminate. 
Qed. 

которые переводят на

Proposition comp_sanity: forall x : Comparison, 
    x = EQUAL /\ x = GREATER -> False. 
Proof. 
intros x hx. 
destruct hx as [h1 h2]. 
rewrite h1 in h2. 
now discriminate h2. 
Qed. 

без магии intros картины.

Бест, В.

4

Тактика contradiction не работает намного лучше, чем пытаться найти что-то в своем контексте, которое имеет тип False. К сожалению, хотя ваш контекст имеет противоречие, до contradiction еще не ясно.

Тактика congruence выполняет больше работы и понимает, что, действительно, два разных конструктора не равны (мы говорим, что конструкторы не пересекаются).

В этом контексте, это более или менее такие же, как вызов subst для распространения равенств о x, что приводит к одной из гипотез EQUAL = GREATER, а затем вызвать discriminate, тактику, которая находит абсурдность в равенстве различных конструкторов.

+0

Хорошо, Подст и конгруэнтность не помогли мне, но я действительно получил дискриминировать работать. Есть ли лучший способ написать это? Доказательство. intros x H_eqgr. утверждают (x = EQUAL) как H_eq. применить H_eqgr. утверждают (x = БОЛЬШЕ) как H_gr. применить H_eqgr. переписать H_eq в H_gr. различают H_gr. –

+0

@ Энциклопедия интро. инверсия H. subst. противоречат H1. дискриминировать. – Veky

+0

@ AnthonyTowns Немного короче доказательства: 'intros? [contra ->]. дискриминировать ". Используя немного магии' intros'. –