为什么不能简单地在lambda表达式中处理这个术语?

时间:2015-04-27 22:18:21

标签: isabelle

我已经证明了这个简单的规则:

lemma AAA: the_sector (log_update ?f ?s) ?p = the_sector ?s ?p

该规则不用于简化以下内容:

lemma BBB: "(λA. if A then (the_sector (log_update f s) p) else B)
   =
   (λA. if A then (the_sector s p) else B)"

我知道我可以应用自动(规则分机),然后使用 simp 来证明这个引理,但我的最终目标是比功能平等更难吃。我相信关键点是在if条件中使用函数变量A.我想理解为什么simp在这种情况下不会简化术语。

以下说明为什么我认为这是关键点(两者都得到证实):

lemma CCC: "(λf s p. the_sector (log_update f s) p) = (λf s p. the_sector s p)"
  by simp

lemma DDD: "(if A then (the_sector (log_update f s) p) else B)
       =
       (if A then (the_sector s p) else B)"
  by simp

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

在简化器的默认设置中,同余规则可防止在术语的某些部分进行重写。对于大多数控制运算符(如if x then ... else ...和大小写表达式(例如case x of None => ... | Some y => ...),默认情况下会声明此类规则。它们将简化限制为决定采用哪个分支的术语,即上述示例中的x。这是出于这样的想法,即简化一个不相关的术语是没有意义的,因为采用了其他一些分支。在您的情况下,要重写的术语the_sector ...发生在then分支内部,因此简化器甚至根本不会查看它。

相关的同余规则是if_weak_congoption.weak_case_cong(对于其他数据类型也是如此)。您可以使用declare if_weak_cong[cong del]全局删除它们,也可以使用(simp cong del: if_weak_cong)在本地删除它们。我建议将它们全局保留在原位,因为一些默认的简单规则假设情况区别的弱同余规则已到位。否则,简化器可能不会终止。

还有另一组同余规则(if_congoption.case_cong)在简化分支时利用x的知识。如果您将它们声明为同余规则(if_cong[cong]cong: if_cong),那么将简化then分支,条件是条件成立,而else分支也相应。类似地,在案例区分的分支中,简化器知道审查的术语是适当的形式。

您可以在第9.1.1节的Tutorial on Isabelle/HOL中找到有关同余规则的更多信息。