coq中有限映射的相等性(使用map2定义)

coq中有限映射的相等性(使用map2定义),coq,proof,Coq,Proof,假设我想在Coq中定义一类单项式。这些将是从某个有序变量集到nat的有限映射,其中,例如,x²y³由发送x到2,y到3的映射表示,其他所有内容都得到默认值零 基本定义似乎并不难: Require Import Coq.FSets.FMapFacts Coq.FSets.FMapList Coq.Structures.OrderedType. Module Monomial (K : OrderedType). Module M := FMapList.Make(K). M

假设我想在Coq中定义一类单项式。这些将是从某个有序变量集到nat的有限映射,其中,例如,x²y³由发送x到2,y到3的映射表示,其他所有内容都得到默认值零

基本定义似乎并不难:

Require Import
  Coq.FSets.FMapFacts
  Coq.FSets.FMapList
  Coq.Structures.OrderedType.

Module Monomial (K : OrderedType).
  Module M := FMapList.Make(K).

  Module P := WProperties_fun K M.
  Module F := P.F.

  Definition Var : Type := M.key.
  Definition Monomial : Type := M.t nat.

  Definition mon_one : Monomial := M.empty _.

  Definition add_at (a : option nat) (b : option nat) : option nat :=
    match a, b with
      | Some aa, Some bb => Some (aa + bb)
      | Some aa, None => Some aa
      | None, Some bb => Some bb
      | None, None => None
    end.

  Definition mon_times (M : Monomial) (M' : Monomial) : Monomial :=
    M.map2 add_at M M'.

End Monomial.
在这一点上,我想证明如下:

Lemma mon_times_comm : forall M M', mon_times M M' = mon_times M' M.
我可以用引理
Equal\u mapsto\u iff
证明这两个映射是相等的,但是我真的想说我的类型真的代表了单项式,乘法是真正可交换的(映射是
eq

我对Coq很陌生:这是一件合理的事情来证明吗


此外,我意识到这可能取决于有限映射实现:如果
FMapList
是错误的选择,而另一个实现使这更容易,请告诉我
$ opam install coq-mathcomp-multinomials
它自然地证明了与你的
mon\u times\u comm
引理类似的结果:

From mathcomp Require Import ssreflect ssrfun ssrbool eqtype ssrnat seq.
From mathcomp Require Import choice finfun tuple fintype ssralg bigop.
From SsrMultinomials Require Import freeg mpoly.

Lemma test1 (n : nat) (m1 m2 : 'X_{1..n}) : (m1 + m2 = m2 + m1)%MM.
Proof.
move=> *.
by rewrite addmC.
Qed.

Lemma test2 (n : nat) (R : comRingType) (p q : {mpoly R[n]}) :
  (p * q = q * p)%R.
Proof.
move=> *.
by rewrite mpoly_mulC.
Qed.
请注意,多项式库是建立在与函数密切相关的库之上的

最后,请注意,该库非常方便地开发涉及多项式的Coq证明,但不直接允许使用这些Coq数据类型进行计算(
Eval vm\u compute in…
)。如果您对这方面也感兴趣,您可能还想看看这个库(尤其是它依赖于
fmap
)的理论)

我可以用引理Equal_mapsto_iff证明这两个映射是相等的,但我想说的是,我的类型真的代表了单项式,乘法是真正可交换的(映射是eq)

我对Coq很陌生:这是一件合理的事情来证明吗

此外,我意识到这可能取决于有限映射实现:如果FMapList是错误的选择,而另一个实现使这更容易,请告诉我

事实上,你走在正确的轨道上。您正在使用的集合类型不具有两个具有相同元素的集合在Coq中定义相等的属性。这样的集合被实现为二叉树,您可能有
节点(A,节点(B,C))节点(节点(A,B),C)

特别是,在Coq中,拥有一个好的“集合类型”是一项极具挑战性的任务,因为有几个问题,请参阅anwser了解更多的讨论


做正确的代数确实需要很多复杂的基础设施,@ErikMD的指针是正确的,你应该看看数学竞赛和相关论文,了解最新技术。当然,继续试验

谢谢你的回答,真的很有帮助。然而,为了学习如何驾驶Coq,我真的在玩单项式等等。我花了一些时间研究multipoly.v,但我很难找到真正证明可交换性的位(或任何类似的)。因为我对这方面还很陌生,所以我还不想深入研究MathComp和SSReflect扩展。@RupertSwarbrick;实际上,作为一个起点,我不建议查看我在回答中提到的文件。如果您正在寻找一些关于如何在Coq中进行证明的参考资料,例如,您可能对这篇论文感兴趣,如果您特别对使用MathComp/SSReflect在代数中进行证明感兴趣,您可能想看看这篇论文,其中也包含练习。非常感谢您的回复。你确定定义上的平等吗?我使用的是FMapList,我认为它将一个映射表示为一个有序的关联列表(这是唯一的)。事实上,您应该能够在
FMapList
中为特定的实现证明它,但是请注意,由于接口问题,Coq没有提供引理。此外,定义的类型太弱,因为它既没有说明排序的规范性,也没有说明唯一性不变量。