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

Coq Ltac:在每个目标中做些不同的事情,coq,dependent-type,theorem-proving,coq-tactic,ltac,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]. 这导致了错误错误的进球数(预计26个战术,得到2个) 对于归纳法生

我已经有了一个证明脚本,我正在探索多个案例,目前进展相当缓慢,因为我有很多解决目标的策略,我正在每个案例中尝试每一个

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

以下是我现在拥有的:

induction e;
    intros;
    pose (bool_dec (is_v_of_expr e1)) as ve1; destruct ve1;
    [> thing1 | thing 2].
这导致了错误
错误的进球数(预计26个战术,得到2个)

对于归纳法生成的每个案例,我试图在第一个目标中从
destruct
thing1
,在第二个目标中从
destruct
thing2

问题是,
inclusion
生成13个子目标,每个子目标通过
destruct
分解为2个。本地选择器
[>thing1 | thing2]
正在尝试匹配所有子目标,而不仅仅是特定析构函数生成的子目标

我如何对战术进行排序,以便对归纳法生成的每个案例运行
destruct
,然后对第一个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]).

实际上,
是完全关联的,并且
;[…]
绑定比
更松散并且是左关联的。此外,所有战术都隐含着多目标,并适用于所有当前关注的目标。