Coq中具有多个字段的TypeClass与单个字段的TypeClass/Compute命令的意外行为

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

我在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, 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}。