举一个简单的例子来说明我一直在遇到这个问题,假设我想证明forall f : nat -> bool, exists i j, i<>j /\ f i = f j.
显而易见的事情是检查f 0, f 1, f 2,
的值并相应地继续。但是,如果我只是说destruct (f 0)
,则Coq不会修改目标,因为f 0
不会作为子项发生。因此,我没有关于f 0
目前正在采用什么价值的信息。理想情况下,我希望Coq在上下文中添加见证H : f 0 = false
,以便我可以跟踪它。
我一直在做的解决这些问题的方法是证明辅助引理bool_destruct : forall b : bool, b = false \/ b = true
。现在,如果我说destruct (bool_destruct (f 0))
Coq会将所需的H
添加到上下文中。当然,当你必须为每种归纳类型证明这种引理时,这是乏味的。因此,我想知道是否有一个很好的策略来处理这些情况。
答案 0 :(得分:4)
破坏策略已经支持你想要的东西:
<rule name="Disable Azure Domain" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="*.azurewebsites.net" />
</conditions>
<action type="Redirect" url="http://www.example.com{REQUEST_URI}" redirectType="Permanent" />
</rule>
你使用destruct (f 0) eqn:f_is0.
的想法没有你想象的那么糟糕,例如,在math-comp中使用类似的想法加上bool_destruct
策略的模式泛化特征来提供自定义破坏视图。