在 coq 中,你如何 declare/prove 枚举元素是不同的?
In coq, how do you declare/prove enumeration elements are distinct?
我很高兴向 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.
我应该在这里做什么才能拥有完全(明确)的枚举类型?
contradiction
策略并没有比尝试在您的上下文中找到类型为 False
的东西做更多的工作。不幸的是,虽然你的上下文有矛盾,但还不清楚contradiction
。
congruence
策略执行更多的工作,并且理解,实际上,两个不同的构造函数是不相等的(我们说构造函数是不相交的)。
在这种情况下,这或多或少与调用 subst
传播关于 x
的等式相同,这导致一个假设 EQUAL = GREATER
,然后调用 discriminate
,一种发现不同构造函数相等的荒谬策略。
在你的情况下,我会选择 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
模式魔法。
最好的,
五、
我很高兴向 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.
我应该在这里做什么才能拥有完全(明确)的枚举类型?
contradiction
策略并没有比尝试在您的上下文中找到类型为 False
的东西做更多的工作。不幸的是,虽然你的上下文有矛盾,但还不清楚contradiction
。
congruence
策略执行更多的工作,并且理解,实际上,两个不同的构造函数是不相等的(我们说构造函数是不相交的)。
在这种情况下,这或多或少与调用 subst
传播关于 x
的等式相同,这导致一个假设 EQUAL = GREATER
,然后调用 discriminate
,一种发现不同构造函数相等的荒谬策略。
在你的情况下,我会选择 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
模式魔法。
最好的, 五、