我正在阅读关于
的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个策略)。
我很困惑。有人可以解释我做错了什么,以及正确的用法是什么?
答案 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]
形式的版本似乎是最有用的。