我想知道在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中做同样的事情?
请注意。我问的原因是:
我不想将这个n
人为地引入到定理本身的陈述中,就像之前链接的页面中所做的那样,恕我直言是不自然的。
我尝试induction H.
,但似乎无效。 Coq无法对length l
的{{1}}进行案例分析,也没有生成归纳假设(IH)。
感谢。
答案 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