[英]How to apply do tactic to a sequence
我深入研究test_nostutter_1
exersize,发现了一种无需重复的解决方法:
Example test_nostutter_1: nostutter [3;1;4;1;5;6].
Proof.
constructor 3.
(* This will apply the tactics to the 2-nd subgoal *)
2: {apply eqb_neq. auto. }
constructor 3.
2: {apply eqb_neq. auto. }
constructor 3.
2: {apply eqb_neq. auto. }
constructor 3.
2: {apply eqb_neq. auto. }
constructor 2.
Qed.
我决定更多地使用它,在coq参考手册中,我发现有一种战术可以使战术多次循环。
do num expr
将expr评估为v,该v必须是战术值。 将此战术值v应用了num次。 假设num> 1,在第一次应用v之后,将v至少一次应用于生成的子目标,依此类推。 如果v的应用程序在num个应用程序完成之前失败,它将失败。
所以我尝试了这个:
do 4 constructor 3; 2: {apply eqb_neq. auto. }
但是不幸的是它失败了。 仅此有效:
do 1 constructor 3.
是否可以使用do使其工作?
该行中有几个问题
do 4 constructor 3; 2: {apply eqb_neq. auto. }
首先,您不能在链运算符后使用2:
或{}
;
。 您可以使用的最接近的东西是本地应用程序 tac; [tac1 | tac2]
序列 tac; [tac1 | tac2]
tac; [tac1 | tac2]
tac; [tac1 | tac2]
。 由于我们只想在第二个分支上做某事,因此我们可以在此处省略tac1
。
另外,您不能在战术内使用句点。 句点标志着一条语句的结尾,但是整个do
表达式只是一个语句。 您应该始终使用序列运算符;
链接几种策略。
最后, do n tac; tac
do n tac; tac
工作方式与(do n tac); tac
类似(do n tac); tac
(do n tac); tac
。 您可以在策略表达式中加上括号,例如用do n (tac; tac)
更改行为。
所以这应该工作:
do 4 (constructor 3; [ | apply eqb_neq; auto ]).
我们可以通过几种方式简化生产线。
auto
额外的定理进行自动化。 可以apply eqb_neq; auto
解决任何目标apply eqb_neq; auto
apply eqb_neq; auto
也可以auto using eqb_neq
与auto using eqb_neq
。 do 4 (constructor 3; [ | auto using eqb_neq ]).
auto
策略永远不会失败,因此可以在两个分支上安全地使用它。 do 4 (constructor 3; auto using eqb_neq).
repeat
直到出现故障或不再有子目标。 重复以下步骤,直到第3个构造函数不再适用。 repeat (constructor 3; auto using eqb_neq).
repeat (constructor; auto using eqb_neq).
Hint Constructors
命令通过auto
使nostutter
构造nostutter
自动化。 现在我们可以使整个过程auto
。 (您可以在您的nostutter
定义之后放置hint命令,然后可以在任何地方auto
它。) Hint Constructors nostutter.
auto using eqb_neq.
(* if the above fails, the following increases the search depth so it should succeed. *)
auto 6 using eqb_neq.
eqb_neq
已经被注册为auto
。 这样我们就可以: auto 6.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.