Ltac:在每个目标中做不同的事情

Ltac: do something different in each goal

我有一个证明脚本,我正在探索多个案例,目前速度很慢,因为我有许多解决目标的策略,并且我正在尝试每个案例中的每一个。

我知道我需要在某些情况下应用某些策略,但我不确定该怎么做。

这是我现在拥有的:

induction e;
    intros;
    pose (bool_dec (is_v_of_expr e1)) as ve1; destruct ve1;
    [> thing1 | thing 2].

给出错误 Incorrect number of goals (expected 26 tactics, was given 2).

我正在尝试在 destruct 的第一个目标中执行 thing1 并在 destruct 的第二个目标中执行 thing2,对于归纳生成的每个案例。

问题是,induction 生成了 13 个子目标,每个子目标都被 destruct 分成 2 个。本地选择器 [> thing1 | thing2 ] 正在尝试匹配 所有 子目标,而不仅仅是特定破坏产生的子目标。

我如何对策略进行排序,以便 destruct 在归纳生成的每个案例上都是 运行,然后 thing1 在第一个破坏生成的案例上是 运行目标,对于每个归纳案例,thing2 在第二个生成的目标上是 运行。

您有两个问题:(1) 默认情况下分号是左结合的,并且 (2) [> ] 语法适用于所有聚焦目标,而不仅仅是产生的目标之前的战术。 (正如 Jason 所指出的,这个解释是不正确的,但答案仍然有效:)

您可以通过将 [> ] 更改为 [ ] 并将分号与括号右关联来解决这些问题:

Goal ((True /\ True) /\ (True /\ True) /\ (True /\ True)).
  Fail (split; [|split]); split; [> exact I | exact I].
  (split; [|split]); (split; [exact I | exact I]).
Qed.

在你的例子中:

induction e; intros;
  pose (bool_dec (is_v_of_expr e1)) as ve1;
  (destruct ve1; [thing1 | thing 2]).