Coq mset的归纳证明

Coq mset的归纳证明,coq,Coq,我试图在Coq开发中使用MSet库,我需要一个map函数,该函数在库中没有,但可以像往常一样使用fold实现 在下面,我对我正在研究的内容做了一个简化,充满了公理,只是为了直截了当 我的问题是证明以下map函数的一个属性: Definition map (f : Exp -> Exp) s := MSet.fold (fun a ac => MSet.add (f a) ac) MSet.empty s. 它使用Coq MSet库中的折叠。我要显示的属性是: Lemma m

我试图在Coq开发中使用MSet库,我需要一个
map
函数,该函数在库中没有,但可以像往常一样使用
fold
实现

在下面,我对我正在研究的内容做了一个简化,充满了公理,只是为了直截了当

我的问题是证明以下
map
函数的一个属性:

Definition map (f : Exp -> Exp) s
  := MSet.fold (fun a ac => MSet.add (f a) ac) MSet.empty s.
它使用Coq MSet库中的
折叠
。我要显示的属性是:

  Lemma map_lemma : forall s f e, In e (map f s) -> exists e', In e' s /\ e = f e'.
  Proof.
     induction s using set_induction ; intros ; try fsetdec.
这是为了表明,如果集合
map f s
中的一个元素
e
,则在
s
,s.t.
e=f e'
中存在另一个元素
e'
。我的困难在于证明归纳的情况,因为由
set\u归纳产生的归纳假设似乎根本没有用处


有人能给我一些关于我该怎么做的线索吗

首先,我认为您对
smap
的定义存在问题。您必须交换
MSet.empty
s
,否则您可以证明:

Lemma snap_trivial : forall f s, smap f s= s.
Proof.
  intros. reflexivity.
Qed.

有了正确的定义,您可以使用适合于这种目标的
fold\u rec
引理。

关于集合不包括
map
操作的说明,因为它只有在映射函数是内射的且保序的情况下才有意义。对于所有其他情况,您所讨论的是“f下的集合的图像”,它具有稍微不同的属性。