如何在Coq中引入新变量?

时间:2015-10-08 01:44:47

标签: coq coq-tactic

我想知道在Coq定理证明期间是否有办法引入一个全新的变量?

有关完整示例,请考虑以下属性from here关于列表长度的均匀性。

Inductive ev_list {X:Type}: list X -> Prop :=
  | el_nil : ev_list []
  | el_cc  : forall x y l, ev_list l -> ev_list (x :: y :: l).

现在我想证明,对于任何列表l,如果length为偶数,则ev_list l成立:

Lemma ev_length__ev_list': forall X (l : list X), ev (length l) -> ev_list l.
Proof.
  intros X l H.

给出:

1 subgoals
X : Type
l : list X
H : ev (length l)
______________________________________(1/1)
ev_list l

现在,我想“定义”一个新的自由变量n和一个假设n = length l。在手写的数学中,我认为我们可以做到这一点,然后对n进行归纳。但有没有办法在Coq中做同样的事情?

请注意。我问的原因是:

  1. 我不想将这个n人为地引入到定理本身的陈述中,就像之前链接的页面中所做的那样,恕我直言是不自然的。

  2. 我尝试induction H.,但似乎无效。 Coq无法对length l的{​​{1}}进行案例分析,也没有生成归纳假设(IH)。

  3. 感谢。

3 个答案:

答案 0 :(得分:8)

这是Coq证明中的常见问题。您可以使用remember策略:

remember (length l) as n.

如果您也在H上进行归纳,那么您可能还需要事先通过l进行归纳,

generalize dependent l.
induction H.

答案 1 :(得分:1)

根据Curry-Howard Isomorphism,你的语境中的假设只是变量。您可以使用函数定义新变量。以下refine策略使用新变量n(设置为length l)和e证明n = length l来扩展目标(设置为eq_refl)。

Lemma ev_length__ev_list': forall X (l : list X), ev (length l) -> ev_list l.
Proof.
  intros X l H.
  refine ((fun n (e:n = length l) => _) (length l) eq_refl).
  (* proof *)
Admitted.

答案 2 :(得分:1)

如果您只想为感应添加新变量,可以直接使用

induction (length l) eqn:H0