Предположим, я хочу определить тип мономов в 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
используют лемму Equal_mapsto_iff
, но я действительно хотел бы сказать, что мой тип действительно представляет мономы и что умножение действительно коммутативно (и карты eq
).
Ядовольно плохо для Coq: это разумная вещь, чтобы попытаться доказать?
Кроме того, я понимаю, что это может зависеть от реализации конечной карты: если FMapList
был неправильный выбор, а другая реализация облегчает это,пожалуйста, укажите мне на это!