在coq中,如何声明/证明枚举元素是不同的?

在coq中,如何声明/证明枚举元素是不同的?,coq,Coq,我很高兴向Coq做自我介绍。现在我一直在做关于枚举的证明: Inductive Comparison : Type := | EQUAL | GREATER | LESSER. “相等”、“较大”和“较小”是不同的(这似乎是文档所暗示的),这是隐含的事实,还是仅凭上述代码就无法确定?我不知道如何证明这一点 Proposition comp_sanity: forall x : Comparison, x = EQUAL /\ x = GREATER -> False. P

我很高兴向Coq做自我介绍。现在我一直在做关于枚举的证明:

Inductive Comparison : Type :=
  | 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.

我应该在这里做些什么来获得一个完全(明确)枚举的类型?

这个
矛盾
策略所做的工作并不比试图在您的上下文中找到类型为
False
的内容多。不幸的是,虽然您的上下文存在矛盾,但尚不清楚如何处理矛盾

同余
策略执行更多的工作,并且理解,实际上,两个不同的构造函数并不相等(我们说构造函数是不相交的)


在这种情况下,这或多或少与调用
subst
来传播关于
x
的等式相同,这导致一个假设
EQUAL=better
,然后调用
discrime
,一种在不同构造器的平等中发现荒谬的策略。

在你的例子中,我会选择
区别
策略,而不是
矛盾
。简短的版本是:

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.
没有
介绍
模式魔法

最好的,
V.

好吧,subst和Congression对我没有帮助,但我确实开始工作了。有没有更好的方法写这个?证明。简介x H_eqgr。断言(x=相等)为H_等式。应用H_等式。断言(x=更大)为H_gr。应用H_eqgr。重写H_gr中的H_eq。区分H_gr。@AnthonyTowns简介。倒置H.子项与H1矛盾。有点短的证明:
intros?[contra->]。辨别。
利用一点
介绍
魔力。