我知道重复重复会多次应用战术,直到失败为止。
重复战术采用另一种战术,并继续应用该战术直到失败。
尝试策略“失败”时不执行任何操作:
如果T是一种战术,那么尝试T是一种与T相似的战术,不同之处在于,如果T失败,则尝试T完全不执行任何操作(而不是失败)。
这是否意味着我要做类似的事情:
repeat (try reflexivity).
如果自反性失败,则尝试执行任何操作(但不会失败),因此重复操作只需继续应用try reflexivity
。它是否正确?还是怎么回事?
我问的原因是因为我看到了这个定理:
Theorem In10 : In 10 [1;2;3;4;5;6;7;8;9;10].
Proof.
repeat (try (left; reflexivity); right).
Qed.
当我问一个相关问题时:Are Coq tacticals right associative or left associative?
来源:https://softwarefoundations.cis.upenn.edu/lf-current/Imp.html
答案 0 :(得分:2)
repeat
的实际语义是,如果战术无法取得进展,它将停止。
https://coq.inria.fr/distrib/current/refman/proof-engine/ltac.html?highlight=repeat#coq:tacn.repeat
因此,即使战术确实成功,只要您的目标没有发生变化,简单地使用repeat
和try
也不会造成无限循环。
但是,确实可以使repeat
进入无限循环,只要它在每次迭代中都取得进展即可。例如,以下脚本尝试始终使用cons
构造函数来构建列表,而不是使用nil
在某些时候结束:
Theorem there_exists_a_list_of_nat : list nat.
Proof.
repeat right.
它确实会永远循环(确保在尝试运行之前知道如何取消计算)。
答案 1 :(得分:0)
此模式不会导致无限循环,因为重复t在t未能取得进展时而不是失败时停止。文档(https://coq.inria.fr/refman/proof-engine/ltac.html#coq:tacn.repeat)在后续语句中添加了此内容,尽管它肯定会更清楚。
Software Foundations中的其他解释是错误的;它声称当给出总是可以成功的策略时,repeat进入无限循环,并以repeat simpl为例进行说明,但是repeat simpl可以工作(经过最多一轮的simpl处理,如果再次运行将不会执行任何操作,因此repeat停止)。