注入策略能否修改最终目标,或添加无关的假设?
Can the injection tactic modify the end goal, or add extraneous assumptions?
考虑以下发展,Adam Chlipala's simplHyp
的独立部分:
(** Fail if H is in context *)
Ltac notInCtx H := assert H; [ assumption | fail 1 ] || idtac.
Ltac injectionInCtx :=
match goal with
(* Is matching on G strictly necessary? *)
| [ H : ?F ?X = ?F ?Y |- ?G ] =>
(* fail early if it wouldn't progress *)
notInCtx (X = Y);
injection H;
match goal with
(* G is used here *)
| [ |- X = Y -> G ] =>
try clear H; intros; try subst
end
end.
Goal forall (x y : nat), S x = S y -> x = y.
intros x y H.
injectionInCtx.
exact eq_refl.
Qed.
查看内联评论 - G
一开始就匹配,最终用于验证最终目标是否保持不变。这是为了排除 injection H
可能修改目标或添加无关假设的可能性吗?
我不认为你可以修改 G
,但你可以设计一个假设 injection
将产生不止一个等式。
我们定义 injectionInCtx2
与 injectionInCtx
相同,只是它不使用 G
。
Ltac injectionInCtx2 :=
match goal with
| [ H : ?F ?X = ?F ?Y |- _ ] =>
(* fail early if it wouldn't progress *)
notInCtx (X = Y);
injection H;
match goal with
| [ |- X = Y -> _ ] =>
try clear H; intros; try subst
end
end.
Definition make_pair {A} (n:A) := (n, n).
Goal forall (x y : nat), make_pair x = make_pair y -> x = y.
Proof.
intros x y H.
(* [injection H] gives [x = y -> x = y -> x = y] *)
Fail injectionInCtx.
injectionInCtx2.
reflexivity.
Qed.
考虑以下发展,Adam Chlipala's simplHyp
的独立部分:
(** Fail if H is in context *)
Ltac notInCtx H := assert H; [ assumption | fail 1 ] || idtac.
Ltac injectionInCtx :=
match goal with
(* Is matching on G strictly necessary? *)
| [ H : ?F ?X = ?F ?Y |- ?G ] =>
(* fail early if it wouldn't progress *)
notInCtx (X = Y);
injection H;
match goal with
(* G is used here *)
| [ |- X = Y -> G ] =>
try clear H; intros; try subst
end
end.
Goal forall (x y : nat), S x = S y -> x = y.
intros x y H.
injectionInCtx.
exact eq_refl.
Qed.
查看内联评论 - G
一开始就匹配,最终用于验证最终目标是否保持不变。这是为了排除 injection H
可能修改目标或添加无关假设的可能性吗?
我不认为你可以修改 G
,但你可以设计一个假设 injection
将产生不止一个等式。
我们定义 injectionInCtx2
与 injectionInCtx
相同,只是它不使用 G
。
Ltac injectionInCtx2 :=
match goal with
| [ H : ?F ?X = ?F ?Y |- _ ] =>
(* fail early if it wouldn't progress *)
notInCtx (X = Y);
injection H;
match goal with
| [ |- X = Y -> _ ] =>
try clear H; intros; try subst
end
end.
Definition make_pair {A} (n:A) := (n, n).
Goal forall (x y : nat), make_pair x = make_pair y -> x = y.
Proof.
intros x y H.
(* [injection H] gives [x = y -> x = y -> x = y] *)
Fail injectionInCtx.
injectionInCtx2.
reflexivity.
Qed.