在Ltac
中,依赖性归纳对我来说似乎有所不同,而不是。
以下工作正常:
Require Import Coq.Program.Equality.
Goal forall (x:unit) (y:unit), x = y.
intros.
dependent induction x.
dependent induction y.
trivial.
Qed.
dependent induction
在这里过度,因为destruct
工作得很好。此外,如果destruct
用于帮助,则无需在校对脚本中将该事物命名为Ltac
:
Ltac ok :=
match goal with
| [H : unit |- _] => destruct H
end.
Goal forall (x:unit) (y:unit), x = y.
intros.
ok.
ok.
trivial.
Qed.
但是,当Ltac
替换为destruct
时,同一dependent induction
失败:
Ltac wat :=
match goal with
| [H : unit |- _] => dependent induction H
end.
Goal forall (x:unit) (y:unit), x = y.
intros.
wat.
(*
Error: No matching clauses for match goal
(use "Set Ltac Debug" for more info).
*)
Set Ltac Debug
没有提供其他有用信息,除了dependent induction
实际上是在x
和y
上进行了尝试。
奇怪的是,如果我在没有匹配的情况下将dependent induction
包裹在另一个Ltac
中,并将其应用于与我实际想要执行感应的术语相同的术语,那么一切都会顺利进行:
Ltac go H := let z := fresh in remember H as z; dependent induction z; subst H.
Ltac why :=
match goal with
| [H : unit |- _] => go H
end.
Goal forall (x:unit) (y:unit), x = y.
intros.
why.
why.
trivial.
Qed.
这里发生了什么,为什么dependent induction
看起来如此依赖于上下文?
答案 0 :(得分:1)
这确实是一个错误,并于2015年3月修复。