我遇到了一个证明,在我将这个引理引入Isabelle的简化集之前,我无法轻易实现自动化:
lemma ex_ex_eq_hint:
"(∃x. (∃xs ys. x = f xs ys ∧ P xs ys) ∧ Q x) ⟷
(∃xs ys. Q (f xs ys) ∧ P xs ys)"
by auto
现在我想知道:有一个很好的理由为什么简化器或经典推理器不能一般地自动执行这种简化?这个引理的更一般形式是否可以添加到默认的simpset来实现这个目标?
答案 0 :(得分:3)
在Isabelle2015中,简化器知道许多规则来消除由等式确定的存在性约束变量。对于您的情况,相关的是simp_thms(36-40)
:
(∃x. ?P) ⟷ ?P
∃x. x = ?t
∃x. ?t = x
(∃x. x = ?t ∧ ?P x) ⟷ ?P ?t
(∃x. ?t = x ∧ ?P x) ⟷ ?P ?t
此外,如果一方未提及绑定变量,ex_simps(1-2)
将存在性推入合取中:
(∃x. ?P x ∧ ?Q) ⟷ (∃x. ?P x) ∧ ?Q
(∃x. ?P ∧ ?Q x) ⟷ ?P ∧ (∃x. ?Q x)
在许多情况下,这些规则足以消除存在量词。但是,在您的情况下,xs
和ys
之间存在进一步的存在量词。原则上,上述规则和ex_comm
,即(∃x y. ?P x y) ⟷ (∃y x. ?P x y)
(以及op &
的关联性,但无论如何都是默认的简单规则),足以通过重写来证明您的引理。然而,人们必须拉出合取的存在感 out ,然后置换量词,使x
最内层。在一般情况下,这些步骤都不是所希望的。此外,交换性受Isabelle的术语顺序的约束,因此简化器甚至可能不会以indended方式应用它。
因此,这个问题通常不能通过一组有限的重写规则来解决,因为可能存在任意多的量词嵌套。然而,它可以通过一个simproc来解决,该simproc触发存在量词并搜索量化的谓词项以获得约束变量的相等性。如果相等性出现在可以消除存在性的位置,那么它必须在现场产生适当的重写规则(转换可能对此有用)。
然而,simproc应该确保它不会过多地干扰目标的结构。在您的示例中已经可以看到一些此类干扰。在左侧,谓词Q不在内部量词的范围内,但它位于右侧。
这意味着并不清楚这种转变在所有情况下都是可取的。例如,在左侧,auto
,fastforce
等使用的经典推理器可以归入一个存在量词,然后使用经典推理找到x
的实例化通过分析Q
。这可能会导致平等x = f xs ys
的进一步简化,这可能导致进一步的实例化。相反,在右侧,推理者首先必须为存在量词引入两个逻辑示意图变量才能开始查看Q
。
总而言之,我建议您分析一下设置,看看为什么这种形式的量词嵌套在目标状态下完全出现了。也许你可以调整它,使一切都适用于现有的规则集。