繁体   English   中英

如何对序列应用战术

[英]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_neqauto 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).
  • 我们可以让Coq选择要应用的构造函数。 这样可以完成(或几乎完成)证明。
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM