假设我想在Coq中定义一种Monomials。这些将是从一些有序的变量集到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
证明这两个映射是Equal_mapsto_iff
,但我真的想说我的类型确实代表单项式,并且乘法是真正可交换的(并且地图为eq
。
我对Coq来说还很陌生:这是合理的尝试证明吗?
此外,我意识到这可能取决于有限映射的实现:如果FMapList
是错误的选择,而另一种实现则使此操作变得容易,请指出这一点!
答案 0 :(得分:4)
我可以使用引理Equal_mapsto_iff看到如何证明两个映射是相等的,但是我真的很想说我的类型确实表示单项式,并且乘法是真正可交换的(映射是eq)。
我对Coq来说还很陌生:这是合理的尝试证明吗?
此外,我意识到这可能取决于有限地图的实现:如果FMapList是错误的选择,而另一种实现使此操作更容易,请指出这一点!
实际上,您在正确的轨道上。您使用的集合类型不具有两个属性相同的集合在Coq中定义相等的属性。由于这样的集合被实现为二进制树,因此您可能拥有Node(A, Node(B,C)) <> Node(Node(A,B),C)
。
特别是,由于一些问题,在Coq中拥有良好的“集合类型”是一项极具挑战性的任务,请参见答案How to define set in coq without defining set as a list of elements,以获取更多讨论。
做适当的代数确实需要很多复杂的基础结构,@ErikMD的指针是正确的,您应该看一下math-comp和相关的文章,以了解最新的技术。当然,继续尝试吧!
答案 1 :(得分:2)
关于Coq中单项式和多元多项式的形式化,您可以考虑使用multinomials库。在OPAM上可用:
$ opam install coq-mathcomp-multinomials
并且自然证明与您的mon_times_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.
请注意,多项式库建立在与MathComp密切相关的SSReflect extension of the Coq proof language库的基础上。
最后,请注意,该库对于开发涉及多项式多项式的Coq证明非常方便,但不允许直接使用这些Coq数据类型(Eval vm_compute in ...
)进行计算。如果您对此方面也有兴趣,则可能还需要看一下CoqEAL库(尤其是依赖于FMaps
的{{3}}理论)。