尝试重复编写是否会导致Coq中出现无限循环?

时间:2018-12-12 20:23:18

标签: coq coq-tactic

我知道重复重复会多次应用战术,直到失败为止。

  

重复战术采用另一种战术,并继续应用该战术直到失败。

尝试策略“失败”时不执行任何操作:

  

如果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

2 个答案:

答案 0 :(得分:2)

repeat的实际语义是,如果战术无法取得进展,它将停止。

https://coq.inria.fr/distrib/current/refman/proof-engine/ltac.html?highlight=repeat#coq:tacn.repeat

因此,即使战术确实成功,只要您的目标没有发生变化,简单地使用repeattry也不会造成无限循环。

但是,确实可以使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停止)。