我如何推理Coq中的条件?

时间:2011-10-29 12:48:57

标签: functional-programming conditional coq theorem-proving

我正在使用Coq标准库中的ListSet模块。我不确定如何在证明中推理条件。例如,我遇到以下证据的问题。为上下文提供了定义。

Fixpoint set_mem (x : A) (xs : set) : bool :=
match xs with
  | nil       => false
  | cons y ys =>
      match Aeq_dec x y with
        | left  _ => true
        | right _ => set_mem x ys
      end
end.

Definition set_In : A -> set -> Prop := In (A := A).

Lemma set_mem_correct1 : forall (x : A) (xs : set),
  set_mem x xs = true -> set_In x xs.
Proof. intros. induction xs.
  discriminate.
  simpl; destruct Aeq_dec with a x.
    intuition.
    simpl in H.

当前证明状态包括inr Aeq_dec作为假设。我已经放弃了归纳的基本情况和inl Aeq_dec为真的归纳案例。

  A : Type
  Aeq_dec : forall x y : A, {x = y} + {x <> y}
  x : A
  a : A
  xs : list A
  H : (if Aeq_dec x a then true else set_mem x xs) = true
  IHxs : set_mem x xs = true -> set_In x xs
  n : a <> x
  ============================
   a = x \/ set_In x xs

H如果a <> x为真,则set_mem xs为真的唯一方法。我应该能够将H中的条件应用于a <> x以获取set_mem xs。但是,我不明白该怎么做。我如何处理,分解或应用条件?

1 个答案:

答案 0 :(得分:2)

你试过这个吗? (语法可能有问题,在这里没有coqtop)

destruct (Aeq_dec x a);
[ subst; elim (n eq_refl)
| right; apply (IHxs H)
].

if <foo>或多或少与match <foo> with相同。您必须减少(destructcase,...)以便匹配可以决定(或if,事物必须减少到你使用它的任何类型的第一个或第二个构造函数。)大多数时候,你需要得到案例分析的值(虽然不在这里)。如果你需要它,做一个remember (<value>) as foo; destruct foo而不是直接破坏。)