【发布时间】:2019-03-25 06:47:02
【问题描述】:
假设我想在 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_mapsto_iff 证明这两个映射是 Equal,但我真的想说我的类型确实代表单项式并且乘法是真正可交换的(并且映射是 @ 987654325@)。
我对 Coq 还是很陌生:尝试证明这是合理的事情吗?
另外,我意识到这可能取决于有限映射的实现:如果 FMapList 是错误的选择,而另一个实现使这更容易,请指出这一点!
【问题讨论】: