Coq 为什么取消假设会改变入职策略的行为?

Coq 为什么取消假设会改变入职策略的行为?,coq,coq-tactic,Coq,Coq Tactic,我正试图证明这两者是等价的。以下是有效的代码: Require Import Coq.Relations.Relation_Definitions. Require Import Coq.Relations.Relation_Operators. Hint Constructors clos_refl_trans. Hint Constructors clos_refl_trans_1n. Lemma clos_refl_trans_1n_right: forall {A: Type}

我正试图证明这两者是等价的。以下是有效的代码:

Require Import Coq.Relations.Relation_Definitions.
Require Import Coq.Relations.Relation_Operators.

Hint Constructors clos_refl_trans.
Hint Constructors clos_refl_trans_1n.

Lemma clos_refl_trans_1n_right:
  forall {A: Type} {R: relation A} (x y: A), 
    clos_refl_trans A R x y -> clos_refl_trans_1n A R x y.
Proof.
  intros A R x y H.
  induction H as [ | | x y z _ IH1 _ IH2]; eauto.
  induction IH1; eauto.
Qed.
请注意,下划线表示丢弃的变量。如果我给出这些变量的名称,自动化将失败:

Lemma clos_refl_trans_1n_right:
  forall {A: Type} {R: relation A} (x y: A),
    clos_refl_trans A R x y -> clos_refl_trans_1n A R x y.
Proof.
  intros A R x y H.
  induction H as [ | | x y z H1 IH1 H2 IH2]; eauto.
  induction IH1; eauto. (* three subgoals left *)
Fail Qed.
经过检验,我们发现第二个例子中的内部归纳假设较弱。归纳策略似乎在检测问题假设和内部归纳对象之间的幕后依赖关系

Lemma clos_refl_trans_1n_right:
  forall {A: Type} {R: relation A} (x y: A),
    clos_refl_trans A R x y -> clos_refl_trans_1n A R x y.
Proof.
  intros A R x y H.
  induction H as [ | | x y z H1 IH1 H2 IH2]; eauto.
  induction IH1 in z, IH2 |- *. all: eauto.
Qed.

这有文件记录吗?基本原理是什么?我如何预测它会发生?

我认为基本上它会使你的归纳假设依赖于所有与你归纳的事物相关的假设。 如果你在
h:qn
y:h=h'
的上下文中对
x:pnm
进行归纳,可能会将它们包括在混合中。 在很多情况下,这与您想要的不一致,并且事先做一些
清理
可能会使您的归纳突然通过

还有一种非常有用的
归纳法
归纳法。。。在
中,允许您指定在进行归纳时要保留上下文的哪一部分

Lemma clos_refl_trans_1n_right:
  forall {A: Type} {R: relation A} (x y: A),
    clos_refl_trans A R x y -> clos_refl_trans_1n A R x y.
Proof.
  intros A R x y H.
  induction H as [ | | x y z H1 IH1 H2 IH2]; eauto.
  induction IH1 in z, IH2 |- *. all: eauto.
Qed.
在这里,您得到了一个我并不真正理解的警告(
无法删除x
无法删除y
),但您得到了预期的结果。 这还有一个优点,即它允许您指定应该概括的内容


也许有人有更好的解释。

我认为基本上这会使你的归纳假设依赖于所有与你归纳的东西相关的假设。 如果你在
h:qn
y:h=h'
的上下文中对
x:pnm
进行归纳,可能会将它们包括在混合中。 在很多情况下,这与您想要的不一致,并且事先做一些
清理
可能会使您的归纳突然通过

还有一种非常有用的
归纳法
归纳法。。。在
中,允许您指定在进行归纳时要保留上下文的哪一部分

Lemma clos_refl_trans_1n_right:
  forall {A: Type} {R: relation A} (x y: A),
    clos_refl_trans A R x y -> clos_refl_trans_1n A R x y.
Proof.
  intros A R x y H.
  induction H as [ | | x y z H1 IH1 H2 IH2]; eauto.
  induction IH1 in z, IH2 |- *. all: eauto.
Qed.
在这里,您得到了一个我并不真正理解的警告(
无法删除x
无法删除y
),但您得到了预期的结果。 这还有一个优点,即它允许您指定应该概括的内容

也许有人有更好的解释