Ltac:匹配目标与取决于先前目标名称的类型

Ltac: Matching goal with type that depends on name of previous goal

我正在尝试编写如下所示的 Ltac 代码:

match goal with
    | [ e : expr, H : (is_v_of_expr e = true) |- _ ] => idtac
end.
(* The reference e was not found in the current environment *)

问题是,试图匹配上下文中有值的情况,以及关于该值的一些事实。所以我混合了假设名称和假设类型的命名空间。最终目标是有一个循环为上下文中的每个 expr 析构 (is_v_of_expr e),但要确保它不会通过连续析构相同的表达式来循环。

是否可以为这样的东西编写 Ltac 匹配表达式?

您需要使用嵌套匹配。以下应该有效。

match goal with
| e : expr |- _ =>
  match goal with
  | H : is_v_of_expr e = true |- _ => idtac
  end
end.