Coq:Ltac内部的“依赖感应”

时间:2014-10-25 14:50:01

标签: coq ltac

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实际上是在xy上进行了尝试。

奇怪的是,如果我在没有匹配的情况下将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看起来如此依赖于上下文?

1 个答案:

答案 0 :(得分:1)

这确实是一个错误,并于2015年3月修复。