我正在尝试在Coq开发中使用MSet库,我需要一个map
函数,该函数在库中不存在,但可以像往常一样使用fold
实现。
在下面的gist中,我简化了我正在研究的内容,充满了公理,只是为了直截了当。
我的问题是要证明以下map
函数的属性:
Definition map (f : Exp -> Exp) s
:= MSet.fold (fun a ac => MSet.add (f a) ac) MSet.empty s.
使用Coq MSet库中的fold
。我要展示的属性是:
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.
其目的是为了表明,如果集合e
中的元素map f s
,则e'
中存在另一个元素s
,s.t。 e = f e'
。我很难证明归纳案例,因为set_induction
产生的归纳假设似乎根本没用。
有人可以向我提供有关如何进行的任何线索吗?
答案 0 :(得分:2)
首先,我认为您对smap
的定义存在问题。您必须交换MSet.empty
和s
,否则您可以证明:
Lemma snap_trivial : forall f s, smap f s= s.
Proof.
intros. reflexivity.
Qed.
使用正确的定义,您可以使用适合此类目标的fold_rec
引理。