如何在 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
因为它会减少一个参数。
如果我的证明上下文中有一个看起来像 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
因为它会减少一个参数。