假设我有这种类型的记录类型和常量定义,例如:
record r =
r_x :: int
r_y :: int
r_z :: int
definition "a ≡ ⦇r_x=1, r_y=2, r_z=3⦈"
现在我想证明一下a,例如:
lemma "r_x a + r_y a = 3"
目前,我正在通过为不同的访问者定义简化引理来进行此类证明:
schematic_goal [simp]: "r_x a = ?x" by (simp add: a_def)
schematic_goal [simp]: "r_y a = ?x" by (simp add: a_def)
schematic_goal [simp]: "r_z a = ?x" by (simp add: a_def)
我的问题是:我能以某种方式自动导出这些引理吗?或者,当与访问器函数一起使用时,是否有展开定义的方法?
我不想通过添加a_def来证明原始引理,因为我通常只想展开a
的使用,其中使用了访问器。
我不想使用缩写,因为简化器可以处理记录中复杂的子句。
答案 0 :(得分:1)
在Isabelle2016中,没有内置的方法可以自动导出用户定义记录的选择器定理。如果必须对同一记录类型的多个定义执行类似的操作,可以按如下方式自动执行派生:
lemma r_sel:
assumes "r ≡ ⦇r_x=x, r_y=y, r_z=z⦈"
shows "r_x r = x" "r_y r = y" "r_z r = z"
using assms by(simp_all)
lemmas a_sel [simp] = r_sel[OF a_def]
每个记录类型只需要一次引理r_sel
。然后,您获得一行的实例化(此处为a_sel
)。对于记录变换器(例如f r = r(|r_x = foo|)
),您可以证明相应的引理r_upd
并导出变换器的实例。
如果您需要更多的自动化(或灵活性),您必须自己在Isabelle / ML中实现派生。通常,可以使用Ctr_sugar
基础结构来构建此类选择器派生,但是当前形式的记录包与Ctr_sugar
不能很好地协同工作。