条件未知的条件重写规则
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 + c
与 a
、b
和 c
是自由的不是一个好的重写规则,因为头部符号左边不是常量,而是自由变量a
。因此,简化器不会使用等式 a = b + c
将 a
替换为 b + c
,而是将等式 a = b + c
的字面值替换为 True
。您可以在 simplifer 的跟踪中看到此预处理(使用 using [[simp_trace]]
在本地启用它)。这就是 example_1
有效而其他无效的原因。如果你可以改变你的左手边,使得有一个常量作为头部符号,那么一些像样的证明自动化应该是可能的,而无需编写自定义求解器。
此外,您可以通过使用 useComplexFact
作为销毁规则来进行一些(有限的)形式的正向推理。也就是说,
using assms
apply(auto dest!: useComplexFact)
在某些情况下也可以。但是,这非常接近于在可扩展性方面展开定义。
在我的理论中,我有一些更大的定义,我使用引理从中推导出一些简单的属性。
我的问题是,用于导出属性的引理没有被简化器使用,我必须手动实例化它们。有没有办法让它更自动化?
下面显示了一个最小示例:
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 + c
与 a
、b
和 c
是自由的不是一个好的重写规则,因为头部符号左边不是常量,而是自由变量a
。因此,简化器不会使用等式 a = b + c
将 a
替换为 b + c
,而是将等式 a = b + c
的字面值替换为 True
。您可以在 simplifer 的跟踪中看到此预处理(使用 using [[simp_trace]]
在本地启用它)。这就是 example_1
有效而其他无效的原因。如果你可以改变你的左手边,使得有一个常量作为头部符号,那么一些像样的证明自动化应该是可能的,而无需编写自定义求解器。
此外,您可以通过使用 useComplexFact
作为销毁规则来进行一些(有限的)形式的正向推理。也就是说,
using assms
apply(auto dest!: useComplexFact)
在某些情况下也可以。但是,这非常接近于在可扩展性方面展开定义。