鉴于您的描述和示例,我认为我无法正确推断出您遇到的一般问题。
如果您已经知道H : f = g
,您可以将它用于rewrite H
任何您想展示和的东西f
,g
或者只是elim H
一次重写所有内容。你不需要assert
辅助定理,如果你这样做,你显然需要类似assert
or的东西pose proof
。
如果该相等性隐藏在某些 eta 扩展下方,例如在您的示例中,请删除该层,然后按上述方法进行操作。以下是两种(多种)可能的方法:
intros A B P Q a H. assert (P = Q) as H0 by apply H. rewrite H0; reflexivity.
assert
这通过设置相等性然后重写来解决您的示例证明。另一种可能性是定义 eta 减少助手(还没有找到预定义的)并使用它们。这将更加冗长,但可能适用于更复杂的情况。
如果你定义
Lemma eta_reduce : forall (A B : Type) (f : A -> B),
(fun x => f x) = f.
intros. reflexivity.
Defined.
Tactic Notation "eta" constr(f) "in" ident(H) :=
pattern (fun x => f x) in H;
rewrite -> eta_reduce in H.
您可以执行以下操作:
intros A B P Q a H. eta P in H. eta Q in H. rewrite H; reflexivity.
(这种表示法有点松散,可能会在错误的地方重写。不要依赖它,如果出现异常,请手动执行pattern
and 。)rewrite