Coq中具有多个字段的TypeClass与单个字段的TypeClass/Compute命令的意外行为
我在Coq和《软件基础》一书一起学习打字课 运行以下命令:Coq中具有多个字段的TypeClass与单个字段的TypeClass/Compute命令的意外行为,coq,typeclass,Coq,Typeclass,我在Coq和《软件基础》一书一起学习打字课 运行以下命令: Class Eq A := { eqb: A -> A -> bool; }. Notation "x =? y" := (eqb x y) (at level 70). Instance eqBool : Eq bool := { eqb := fun (b c : bool) => match b, c with | true, true => true | true, fal
Class Eq A :=
{
eqb: A -> A -> bool;
}.
Notation "x =? y" := (eqb x y) (at level 70).
Instance eqBool : Eq bool :=
{
eqb := fun (b c : bool) =>
match b, c with
| true, true => true
| true, false => false
| false, true => false
| false, false => true
end
}.
Compute (true =? false).
我得到了消息=false:bool
,正如预期的那样。
但是如果我做了下面的事情
Class Eq A :=
{
eqb: A -> A -> bool;
eqb_refl: forall (x : A), eqb x x = true;
}.
Notation "x =? y" := (eqb x y) (at level 70).
Instance eqBool : Eq bool :=
{
eqb := fun (b c : bool) =>
match b, c with
| true, true => true
| true, false => false
| false, true => false
| false, false => true
end
}.
Proof.
intros []; reflexivity.
Qed.
Compute (true =? false).
我得到消息=(let(eqb,):=eqb中的eqBool)true-false:bool
。
我似乎无法简化这个表达式,也不确定哪里出了问题,哪里出了问题。
如何使用额外的假设定义上面的typeclass,并且仍然能够使用我定义的实例(即获得与以前相同的消息)
非常感谢 使用
Qed
命令创建不透明的定义,像Compute
这样的命令永远不会打开这些定义。您可以使用程序实例
命令告诉Coq仅使证明义务不透明:
Require Import Coq.Program.Tactics.
Class Eq A :=
{
eqb: A -> A -> bool;
eqb_refl: forall (x : A), eqb x x = true;
}.
Notation "x =? y" := (eqb x y) (at level 70).
Program Instance eqBool : Eq bool :=
{
eqb := fun (b c : bool) =>
match b, c with
| true, true => true
| true, false => false
| false, true => false
| false, false => true
end
}.
Next Obligation. now destruct x. Qed.
Compute (true =? false).
另一种方法是重用现有函数和关于它们的证明:
来自Coq Require Import Bool。实例eqBool:Eq bool:={eqb:=eqb;eqb_refl:=eqb_reflx}。