如何在 Coq 中简化形式为 True -> P 的假设?

How do I simplify a hypothesis of the form True -> P in Coq?

如果我的证明上下文中有一个看起来像 H: True -> P 的假设,并且我想将其转换为 H: P,那么最简单的方法是什么?我试过 simpl in H 但它什么也没做,我发现的唯一方法是非常不令人满意的 pose proof (H Coq.Init.Logic.I) as H。有没有更简单的方法?

除了使用 pose proof.

之外,还有两种方法可以解决这个问题

使用 specialize.

这种策略可以让你为你的假设提供论据。 在你的情况下你可以做

specialize (H I).

甚至

specialize H with (1 := I).

如果你想创建一个副本而不是直接实例化H,你可以使用as

使用 forward.

我想这就是您想要的。 forward H.会要求你证明H的第一个假设。所以你会做这样的事情:

forward H.
- auto.
- (* Then resume with H : P *)

但您也可以为其提供(目标关闭)策略:

forward H by auto.
(* Now you have one goal, and H has type P *)

forward 目前还不是标准库的一部分。然而,它可以很容易地定义(这里是 MetaCoq 库中的定义)。

Ltac forward_gen H tac :=
  match type of H with
  | ?X -> _ => let H' := fresh in assert (H':X) ; [tac|specialize (H H'); clear H']
  end.

Tactic Notation "forward" constr(H) := forward_gen H ltac:(idtac).
Tactic Notation "forward" constr(H) "by" tactic(tac) := forward_gen H tac.

注意这里的simpl不起作用,因为它不是通常意义上的简化假设的策略,它实际上只是应用一些计算规则的策略,它基本上评估目标或假设你应用它。 True -> P 不会减少到 P 因为它会减少一个参数。