我已经证明了这个简单的规则:
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
感谢您的任何建议。
答案 0 :(得分:1)
在简化器的默认设置中,同余规则可防止在术语的某些部分进行重写。对于大多数控制运算符(如if x then ... else ...
和大小写表达式(例如case x of None => ... | Some y => ...
),默认情况下会声明此类规则。它们将简化限制为决定采用哪个分支的术语,即上述示例中的x
。这是出于这样的想法,即简化一个不相关的术语是没有意义的,因为采用了其他一些分支。在您的情况下,要重写的术语the_sector ...
发生在then
分支内部,因此简化器甚至根本不会查看它。
相关的同余规则是if_weak_cong
和option.weak_case_cong
(对于其他数据类型也是如此)。您可以使用declare if_weak_cong[cong del]
全局删除它们,也可以使用(simp cong del: if_weak_cong)
在本地删除它们。我建议将它们全局保留在原位,因为一些默认的简单规则假设情况区别的弱同余规则已到位。否则,简化器可能不会终止。
还有另一组同余规则(if_cong
和option.case_cong
)在简化分支时利用x
的知识。如果您将它们声明为同余规则(if_cong[cong]
或cong: if_cong
),那么将简化then分支,条件是条件成立,而else分支也相应。类似地,在案例区分的分支中,简化器知道审查的术语是适当的形式。
您可以在第9.1.1节的Tutorial on Isabelle/HOL中找到有关同余规则的更多信息。