使用访问者时自动展开记录定义

时间:2016-06-02 09:50:38

标签: isabelle

假设我有这种类型的记录类型和常量定义,例如:

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的使用,其中使用了访问器。

我不想使用缩写,因为简化器可以处理记录中复杂的子句。

1 个答案:

答案 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不能很好地协同工作。