在我的coq开发中,我正在学习如何为我的问题域创建新的策略,la Prof. Adam Chlipala。
在该页面上,他描述了如何通过将repeat
包裹在响应各种有趣条件的match
周围来创建强大的策略。 repeat
然后迭代,允许进行深远的推理。
使用repeat
有一个警告(强调我的):
我们在这里使用的
repeat
称为战术或战术组合。repeat t
的行为是循环运行t
,在所有生成的子目标上运行t
,在生成的生成的子目标上运行t
,等等上。当t
在此搜索树中的任何一点失败时,该特定子目标将由后来的策略处理。 因此,重要的是永远不要使用repeat
一个始终成功的策略。
现在,我已经有了一个强大的策略,auto
。它类似地将链条链接在一起,这次是从提示数据库中找到的。来自auto
的页面:
auto
要么完全解决目标,要么完好无损。auto
和trivial
永不失败。
啵!我已经投入了一些精力来策划auto
的提示数据库,但我似乎禁止在使用repeat
的策略中使用它们(即有趣的策略)。
是否有auto
的某些变体可能会失败,或者在循环中正确使用?
例如,也许这种变体在“使[目标]完整无缺”时失败。
编辑:将auto
合并到循环中并不是“正确”的方法(参见this),但实际的问题是失败的版本汽车仍然很有意思。
答案 0 :(得分:3)
正如@AntonTrunov所提到的,如果目标没有改变,你总是可以使用progress
战术来使战术失败。在auto
的情况下,因为它应该解决目标或保持不变,你也可以将它包装在solve [ auto ]
中,这将具有相同的效果,因为如果auto
它会失败没有完全解决目标(here is the doc for solve
)。