MSets上的感应证明

时间:2017-11-30 11:35:34

标签: coq

我正在尝试在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产生的归纳假设似乎根本没用。

有人可以向我提供有关如何进行的任何线索吗?

1 个答案:

答案 0 :(得分:2)

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

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

使用正确的定义,您可以使用适合此类目标的fold_rec引理。