为什么 simp 不在 lambda 表达式中处理这个术语?

Why won't simp handle this term inside of a lambda expression?

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

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)"

我知道我可以应用 auto(rule ext) 然后是 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

感谢任何建议。

在简化器的默认设置中,同余规则防止重写术语的某些部分。对于大多数控制运算符,如 if x then ... else ... 和 case 表达式(例如 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) 在本地删除它们。我建议将它们保留在全局位置,因为一些默认的 simp 规则假定用于区分大小写的弱同余规则已经到位。否则,简化器可能不会终止。

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

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