数学课:证明Munit是他自己的否定

时间:2016-11-14 05:29:57

标签: math typeclass coq

我刚刚开始使用数学类库,我想证明以下引理:

Require Import
    MathClasses.interfaces.abstract_algebra MathClasses.interfaces.vectorspace MathClasses.interfaces.canonical_names. 

Lemma Munit_is_its_own_negation `{Module R M} : Munit = - Munit.

我打算像这样证明这一点:

  1. 使用right_identityMunit = - Munit & Munit
  2. 将Munit添加到右侧
  3. 使用右侧的left_inverseMunit = Munit
  4. 使用reflexivity
  5. 但是,当我尝试应用rewrite <- right_inverse时,我收到以下错误:

    Error:
    Unable to satisfy the following constraints:
    In environment:
    R : Type
    M : Type
    Re : Equiv R
    Rplus : Plus R
    Rmult : Mult R
    Rzero : Zero R
    Rone : One R
    Rnegate : Negate R
    Me : Equiv M
    Mop : SgOp M
    Munit : MonUnit M
    Mnegate : Negate M
    sm : ScalarMult R M
    H : Module R M
    
    ?A : "Type"
    
    ?B : "Type"
    
    ?H : "Equiv (MonUnit M)"
    
    ?op : "?A → ?B → MonUnit M"
    
    ?inv : "?A → ?B"
    
    ?RightInverse : "RightInverse ?op ?inv Munit"
    

    为什么Coq会在环境中寻找Equiv (MonUnit M)而不仅仅是Equiv MMonUnit M?是否有可能完成此证明?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

Munit是参数化MonUnit类型类的实例。这意味着Munit本质上是一个记录(只有一个字段 - mon_unit),但我想您希望得到关于M类型的单位元素的陈述,因为通常否定记录没有多大意义。

我认为原则上可以让Coq解包Munit并做正确的事,但如果我们能够重申这个问题,为什么还要挣扎:

Lemma mon_unit_is_its_own_negation `{Module R M} :
  mon_unit = - mon_unit.

然后一切都如你所描述的那样:

Proof.
  rewrite <- (right_identity (- mon_unit)).
  now rewrite left_inverse.
Qed.