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]).
我有一个证明脚本,我正在探索多个案例,目前速度很慢,因为我有许多解决目标的策略,并且我正在尝试每个案例中的每一个。
我知道我需要在某些情况下应用某些策略,但我不确定该怎么做。
这是我现在拥有的:
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]).