使用MSet进行coq的证明

时间:2016-07-25 14:28:03

标签: set coq

所以我仍然是coq的新手,而且MSets给了我一些问题。以下是计算元素是否在列表或集合中的两个函数,如果您认为set_contains定义正确或者有更好的方法,请告诉我。谢谢你的帮助。

    Require Import MSets ZArith.
    Module mset := MSetAVL.Make Positive_as_OT.
    Notation pos_set := mset.t.

    Definition set_contains (x : positive) (s : pos_set) :=
      mset.mem x s.

    Fixpoint list_contains (x : positive) (l : list positive) : bool :=
      match l with
      | nil => false
      | y :: l' =>
        if Pos.eqb x y then true
        else nodelist_contains x l'
     end.

   Lemma nodelist_nodeset_contains :
      forall x  (s : pos_set),
        (nodelist_contains x (mset.elements s)) = (nodeset_contains x s).
    Proof.
      induction s.
      destruct list_contains.
      destruct set_contains.
      auto.

似乎set_contains在析构后的基本情况下求值为true,我不知道为什么。在证明的那个阶段,集合不是mset.empty吗?

我也不知道如何使用mset.In,我在这个证明的基本情况下遇到了麻烦,显然我遇到了同样的问题。我想最终说明:

    Lemma nodelist_containsP :
      forall x (l : pos_set),
        reflect (mset.In x l) (nodeset_contains x l).

如果有人对此感兴趣,我就是这样做的。

       intros.
       apply iff_reflect.
       unfold nodeset_contains.
       symmetry.
       apply mset.mem_spec.
       Qed.

1 个答案:

答案 0 :(得分:1)

list_containsset_contains是函数,因此尝试destruct它们没有意义。 Coq试图推断你的意思并猜测你想要分别以list_containsset_contains开头的表达式的值。

这不是你想要的。你想要的是观察同一输入上两个函数的行为。你可以通过检查它来做到这一点。

这应该会向您发送正确的方向:

  destruct s as [mset mset_isok].
  induction mset.
  + unfold set_contains, mset.mem.
    simpl.
    reflexivity.
  + unfold list_contains, set_contains, mset.mem.
    simpl.