在我的理论中,我有一些更大的定义,我使用引理从中推导出一些简单的属性。
我的问题是,简化器不使用派生属性的引理,我必须手动实例化它们。有没有办法让它更自动化?
一个最小的例子如下所示:
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 部分,也不知道从哪里开始。
重写不会实例化未知数。例如,单独重写不能证明 a ∈ ?A 因为这需要实例化 ?A 。然而,求解器是一种任意策略,可以随意实例化未知数。这是 Simplifier 可以处理条件包含额外变量的条件重写规则的唯一方法。