条件未知的条件重写规则

Conditional rewrite rules with unknowns in condition

在我的理论中,我有一些更大的定义,我使用引理从中推导出一些简单的属性。

我的问题是,用于导出属性的引理没有被简化器使用,我必须手动实例化它们。有没有办法让它更自动化?

下面显示了一个最小示例:

definition complexFact :: "int ⇒ int ⇒ int ⇒ bool" where
"complexFact x y z ≡ x = y + z"

lemma useComplexFact: "complexFact x y z ⟹ x = y + z"
by (simp add: complexFact_def)

lemma example_1:
assumes cf: "complexFact a b c"
shows "a = b + c"
apply (simp add: cf useComplexFact) (* easy, works *)
done

lemma example_2a:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (simp add: cf useComplexFact) (* does not work *)
oops

lemma example_2b:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (simp add: useComplexFact[OF cf]) (* works *)
done

lemma example_2c:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (subst useComplexFact) (* manually it also works*)
apply (subst cf)
apply simp+
done

我在参考手册中找到了以下段落,所以我想我可以使用自定义求解器来解决我的问题。 然而,我从来没有真正接触过 Isabelle 的内部 ML 部分,也不知道从哪里开始。

Rewriting does not instantiate unknowns. For example, rewriting alone can- not prove a ∈ ?A since this requires instantiating ?A . The solver, however, is an arbitrary tactic and may instantiate unknowns as it pleases. This is the only way the Simplifier can handle a conditional rewrite rule whose condition contains extra variables.

Isabelle 简化器本身从不实例化条件重写规则假设中的未知数。但是,求解器可以做到这一点,最可靠的是assumption。因此,如果 complex_fact a b c 确实出现在目标假设中(而不是通过 simp add:[simp] 添加到简单集),假设求解器将启动并实例化未知数。但是,它只会在假设中使用 complex_fact 的第一个实例。所以如果有几个,它不会尝试所有的。综上,还是写

比较好
lemma
  assumes cf: "complexFact a b c"
  shows "a = b + c"
  using cf
  apply(simp add: useComplexFact)

你的例子的第二个问题是 a = b + cabc 是自由的不是一个好的重写规则,因为头部符号左边不是常量,而是自由变量a。因此,简化器不会使用等式 a = b + ca 替换为 b + c,而是将等式 a = b + c 的字面值替换为 True。您可以在 simplifer 的跟踪中看到此预处理(使用 using [[simp_trace]] 在本地启用它)。这就是 example_1 有效而其他无效的原因。如果你可以改变你的左手边,使得有一个常量作为头部符号,那么一些像样的证明自动化应该是可能的,而无需编写自定义求解器。

此外,您可以通过使用 useComplexFact 作为销毁规则来进行一些(有限的)形式的正向推理。也就是说,

using assms
apply(auto dest!: useComplexFact)

在某些情况下也可以。但是,这非常接近于在可扩展性方面展开定义。