如何在不使用Coq中的generalize依赖的情况下以不同的顺序进行介绍?

时间:2014-12-19 19:32:10

标签: coq

鉴于我有forall n m,有没有办法解决这个问题:

intros n m. generalize dependent n.

但只需一步,只需将intros(或替代策略)应用于m

2 个答案:

答案 0 :(得分:1)

您可能想要沿着这些线路(但是为了能够将策略应用于多分类望远镜而使用异构列表):

Require Import ListTactics.

Ltac introNthAcc n acc := match constr:n with
  | 0    => intro ; list_iter ltac:(fun x => generalize dependent x) acc
  | S ?n =>
     let H := fresh "H" in
     intro H ; introNthAcc n (cons H acc)
end.

Ltac introNth n := introNthAcc n (@nil Prop).

Goal forall a b c, a /\ b /\ c.

 introNth 1.

答案 1 :(得分:0)

不幸的是,基本的Coq策略语言对于这种簿记步骤并不是很好。我个人更喜欢使用SSReflect,因为它们更经济。比较

intros n m. generalize dependent n.

与SSR等效

move=> n m; move: n.

请注意,如果您的定理是一个普遍量化的事实,您也可以将nm直接放在冒号之前,从而保存第一个intros步骤,例如

Lemma my_lemma n m : P n m.
Proof.
move: n.
(* Rest of proof *)
Qed.

或者更好的是,如果您在推广后立即执行induction

Lemma my_lemma n m : P n m.
Proof.
elim: n.
(* Rest of proof *)
Qed.