Coq“本地战术​​应用”的正确用法是什么?

时间:2016-07-07 02:55:46

标签: coq coq-tactic

我正在阅读关于

的Coq参考手册(8.5p1)
  

战术的本地应用

     

可以使用不同的策略将不同的策略应用于不同的目标   以下表格:

     

[> expr1 | ::: | exprn]

     

对于i = 0,表达式expri被计算为vi; ...; n和所有   必须是战术。 vi应用于第i个目标,= 1; ...;   ñ。如果重点目标的数量不完全是n,则会失败。

所以我尝试了两个目标试图对每个目标应用两个琐碎的idtac策略进行了一些测试,如下所示:

Goal forall P Q: Prop, P \/ Q -> Q \/ P.
intros. destruct H. [ >  idtac | idtac  ].

然而,我收到一个错误,告诉我只有一种策略是预期的:

  

错误:目标数量不正确(预计有1个策略)。

我很困惑。有人可以解释我做错了什么,以及正确的用法是什么?

1 个答案:

答案 0 :(得分:2)

这里的关键部分是

  

如果聚焦目标的数量不完全 n ,则会失败。

你需要2个重点目标。 可以像这样检查重点目标的数量:

Ltac print_numgoals := let n := numgoals in idtac "# of goals:" n.

Goal forall P Q: Prop, P \/ Q -> Q \/ P.
  intros. destruct H.
  print_numgoals.  (* prints 1 *)

有多种方法可以实现多个重点目标:

(1)使用排序:destruct H; [> idtac | idtac].

(2)或略短:destruct H; [> idtac ..].

(3)使用all选择器(请参阅手册,§8.1):

destruct H. all: [ > id_tac | id_tac ].

在最后一种情况下,destruct H. all: print_numgoals.会打印2

总之,应该提到以下内容 - 似乎本地应用确切形式[ > ...])的战术并不是非常有用,因为它从未在标准库(以及其他几个库),除了专门介绍此功能的部分外,手册中没有提到它。它的expr; [ expr_1 | ... | expr_n]形式的版本似乎是最有用的。