Coq中类型类的Axiom重用

Coq中类型类的Axiom重用,coq,Coq,我试图使用typeclass进行代码重用,但在子typeclass定理中应用父typeclass公理时,我遇到了setoid错误。我通过以下等式和加法操作进行了MRE: Require Import Setoid. (* Equality *) Parameter CEq : forall A, A->A->Prop. Arguments CEq [A] _ _. Notation "x ¦ y" := (CEq x y) (at level 70, no associativit

我试图使用typeclass进行代码重用,但在子typeclass定理中应用父typeclass公理时,我遇到了setoid错误。我通过以下等式和加法操作进行了MRE:

Require Import Setoid.

(* Equality *)
Parameter CEq : forall A, A->A->Prop.
Arguments CEq [A] _ _.
Notation "x ¦ y" := (CEq x y) (at level 70, no associativity).
Axiom ceq_reflexivity: forall A, forall a:A, a¦a.
Axiom ceq_symmetry: forall A, forall a b:A, a¦b->b¦a.
Axiom ceq_transitivity: forall A, forall a b c:A, a¦b->b¦c->a¦c.
Add Parametric Relation A : (A) (@CEq A)
  reflexivity proved by (@ceq_reflexivity A)
  symmetry proved by (@ceq_symmetry A)
  transitivity proved by (@ceq_transitivity A)
  as ceq_rel.

(* Addition *)
Parameter CAdd: forall A, A->A->A.
Arguments CAdd [A] _ _.
Infix "±" := CAdd  (at level 50, left associativity).
以下是父类和子类:

(* Parent Typeclass *)
Class CDiscT (CDisc: Set) := {
  O: forall CDisc, CDisc;
  cdisc_add_neutral:forall CDisc, forall x:CDisc, x±(O CDisc)¦x;
}.

(* Natural Set & Child Typeclass *)
Parameter CNat: Set.
Class CNatT `{CDiscT CNat} := {}.
下面是失败的定理:

(* Axiom inheritance test *)
Example test `{CNatT}: (O CNat)¦(O CNat)±(O CNat).
Proof.
  rewrite <- cdisc_add_neutral. (* Error *)
  reflexivity.
Qed.

在CNatT定理中使用CDiscT公理缺少什么?有更好的方法吗?

这可能部分是因为您的示例过于简化,但是使用
cdisc\u add\u neutral
从右向左重写是有问题的,因为右侧的
x
匹配任何内容,并且可以有任何类型

您得到的错误是Coq试图用它重写整个目标,但这将使用逻辑含义
impl
,这反过来要求您的关系
CEq
impl
的子关系

你可以通过专门化引理来避免这种情况:

  rewrite <- (cdisc_add_neutral CNat) at 1.
  rewrite <- (cdisc_add_neutral CNat) at 1.
rewrite cdisc_add_neutral