LTAC:在每个目标中做一些不同的事情

时间:2018-07-28 04:30:29

标签: coq dependent-type theorem-proving coq-tactic ltac

我有一个证明脚本,可以在其中探索多个案例,由于我有多种解决目标的策略,并且每种情况下我都会尝试,因此它目前运行很慢。

我知道在某些情况下需要采取某些策略,但是我不确定如何做到这一点。

这就是我现在拥有的:

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针对每个归纳案例生成的第二个目标。

1 个答案:

答案 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]).