Coq mset的归纳证明
我试图在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
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下的集合的图像”,它具有稍微不同的属性。