使用访问器时自动展开记录定义
Automatically unfolding a record definition when accessor is used
假设我有一个记录类型和这个类型的常量定义,例如:
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
的用法,其中使用了访问器。
我不想使用缩写,因为这样简化器就可以处理记录中复杂的子项。
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
.
一起很好地工作。
假设我有一个记录类型和这个类型的常量定义,例如:
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
的用法,其中使用了访问器。
我不想使用缩写,因为这样简化器就可以处理记录中复杂的子项。
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
.