Criando uma hierarquia de classes no Coq?

Eu posso ingenuamente construir uma hierarquia de estruturas algébricas no Coq usando classes de tipo. Estou tendo problemas para encontrar recursos na sintaxe e na semântica da Coq para classes de tipo. No entanto, acredito que a seguir é uma implementação correta de semigrupos, monoides e monoides comutativos:

Class Semigroup {A : Type} (op : A -> A -> A) : Type := {
  op_associative : forall x y z : A, op x (op y z) = op (op x y) z
}.

Class Monoid `(M : Semigroup) (id : A) : Type := {
  id_ident_left  : forall x : A, op id x = x;
  id_ident_right : forall x : A, op x id = x
}.  

Class AbelianMonoid `(M : Monoid) : Type := {
  op_commutative : forall x y : A, op x y = op y x
}.

Se eu entendi corretamente, parâmetros adicionais (por exemplo, o elemento de identidade de um monóide) podem ser adicionados pela primeira declaração deMonoid uma instância deSemigroup, depois parametrizando emid : A. No entanto, algo estranho está ocorrendo no registro criado paraAbelianMonoid.

< Print Monoid.
    Record Monoid (A : Type) (op : A -> A -> A) (M : Semigroup op) 
    (id : A) : Type := Build_Monoid
    { id_ident_left : forall x : A, op id x = x;
      id_ident_right : forall x : A, op x id = x }

< Print AbelianMonoid.
    Record AbelianMonoid (A : Type) (op : A -> A -> A) 
    (M0 : Semigroup op) (id0 : A) (M : Monoid M0 id0) : 
    Type := Build_AbelianMonoid
      { op_commutative : forall x y : A, op x y = op y x }

Isso ocorreu quando eu estava tentando criar uma classe para semigrupos. Eu pensei que a seguinte sintaxe estava correta:

Class Semiring `(P : AbelianMonoid) `(M : Monoid) := {
    ...
}.

No entanto, não pude desambiguar os operadores e elementos de identidade corretos. A impressão dos registros revelou os problemas descritos acima. Então, eu tenho duas perguntas: primeiro, como declaro corretamente a classeMonoid; segundo, como desambiguar funções nas superclasses?

O que eu realmente gostaria é de bons recursos que expliquem claramente as classes de tipos da Coq sem sintaxe antiquada. Por exemplo, pensei que o livro de Hutton explicava claramente as classes de tipo em Haskel

questionAnswers(1)

yourAnswerToTheQuestion