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

时间:2015-04-22 05:25:21

标签: 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.

我应该在这里做一个完全(明显)枚举的类型?

2 个答案:

答案 0 :(得分:4)

contradiction策略并没有比尝试在您的上下文中找到类型为False的内容做更多的工作。不幸的是,虽然您的背景存在矛盾,但contradiction尚不清楚。

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

在这种情况下,这与调用subst传播关于x的平等大致相同,这会产生一个假设EQUAL = GREATER,然后调用discriminate一种在不同构造者的平等中找到荒谬的策略。

答案 1 :(得分: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模式魔法。

最佳, 诉