我有一个证明脚本,可以在其中探索多个案例,由于我有多种解决目标的策略,并且每种情况下我都会尝试,因此它目前运行很慢。
我知道在某些情况下需要采取某些策略,但是我不确定如何做到这一点。
这就是我现在拥有的:
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)
。
对于归纳法生成的每种情况,我都试图在thing1
的第一个目标中执行destruct
,在thing2
的第二个目标中执行destruct
。
问题在于,induction
生成13个子目标,每个子目标都被destruct
分成2个子目标。本地选择器[> thing1 | thing2 ]
试图匹配所有子目标,而不仅仅是匹配特定破坏产生的子目标。
我该如何对策略进行排序,以便对归纳法生成的每个案例运行destruct
,然后对第一个析构生成的目标运行thing1
,然后运行thing2
针对每个归纳案例生成的第二个目标。
答案 0 :(得分:2)
您有两个问题:(1)默认情况下,分号是左关联的;(2)
(正如杰森所指出的,这种解释是不正确的,但是答案仍然有效:)[> ]
语法适用于所有重点目标,而不仅是先前战术所产生的目标。
您可以通过将[> ]
更改为[ ]
并将分号与括号右相关来解决这些问题:
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]).