我经常发现“自动”不会解决对我来说似乎很简单的等式,至少在涉及∪
,∩
和-
的条件上使用某些搜索。
Failed to finish proof⌂:
goal (1 subgoal):
1. ArityAnalysis.Afix Aexp Γ⋅(Aexp e⋅n) f|` (fv Γ ∪ fv e - domA Γ) =
ArityAnalysis.Afix Aexp Γ⋅(Aexp e⋅n) f|` ((fv Γ ∪ fv e - domA Γ) ∩ - domA Γ)
我可以解决它(例如by auto (metis Diff_eq Diff_idemp)
),但我想知道是否存在一些我缺少的自动化。也许某些专用的simp设置为ac_simps
用于集合操作?
答案 0 :(得分:2)
关于Isabelle2013-2中的集合的推理主要是由经典推理器使用引入和消除规则来尝试逐点解决方案。通过在Isabelle中重写,我不知道任何关于布尔代数的推理设置。 (备注:正式证明存档中的正则表达式条目提供了一种方法regexp
来处理这种等式,但它没有与auto
等其他自动化方法集成。)幸运的是,所有定理您需要在HOL库中,但默认情况下它们不在simpset中,因为它们有时会对您不利。在您的示例中,只需将Diff_eq
添加到simpset。
使用更复杂的集合表达式,可能很难找到一组规范化重写规则。因此,我更喜欢让经典推理器的设置与集合相等。这要求相等性作为子目标发生,即,它不能隐藏在功能应用程序之下。也就是说,您希望通过证明f x = f y
表示x = y
来证明arg_cong
。将arg_cong
[intro]
添加到auto
会将其指向该方向,但它可能并不总是有效,因为HO统一可能会妨碍。在这种情况下,通常只需在
f
即可
by(auto intro: arg_cong[where f="%x. ArityAnalysis.Afix Aexp Γ⋅(Aexp e⋅n) f|` x"])