[英]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.