我正在使用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
。但是,我不明白该怎么做。我如何处理,分解或应用条件?
答案 0 :(得分:2)
destruct (Aeq_dec x a);
[ subst; elim (n eq_refl)
| right; apply (IHxs H)
].
(if <foo>
或多或少与match <foo> with
相同。您必须减少(destruct
,case
,...)以便匹配可以决定(或if
,事物必须减少到你使用它的任何类型的第一个或第二个构造函数。)大多数时候,你需要得到案例分析的值(虽然不在这里)。如果你需要它,做一个remember (<value>) as foo; destruct foo
而不是直接破坏。)