创建 Coq 策略:如何使用新生成的名称?

Creating Coq tactic: how to use a newly generated name?

我想创建一个如下所示的 Coq 策略。我断言一个名为 H 的命题,我证明该命题,然后我在该命题内使用 simpl。该策略看起来像这样:

Tactic Notation "foo" :=
  assert (True) as H; try apply I;
  simpl in H.

但是,我希望 Coq 为我生成一个新名称,而不是为这个假设使用名称 H。问题是,我怎样才能在这个假设中使用 simpl

Tactic Notation "foo" :=
  assert (True) as ?; try apply I;
  simpl in (* what? *).

有没有一种方法可以生成一个假设名称,然后在相同的策略中引用它?

您可以为此使用 fresh 策略。这是一个例子:

Tactic Notation "foo" :=
  let H := fresh "H" in
  assert True as H; try apply I; simpl in H.

Goal False.
foo. (* H : True *)
foo. (* H, H0 : True *)
Abort.