这是Isabelle's Code generation: Abstraction lemmas for containers?后续:与伊莎贝尔的代码生成工作:数据细化和高阶函数
我想在下面的理论the_question
生成代码:
theory Scratch imports Main begin
typedef small = "{x::nat. x < 10}" morphisms to_nat small
by (rule exI[where x = 0], simp)
code_datatype small
lemma [code abstype]: "small (to_nat x) = x" by (rule to_nat_inverse)
definition a_pred :: "small ⇒ bool"
where "a_pred = undefined"
definition "smaller j = [small i . i <- [0 ..< to_nat j]]"
definition "the_question j = (∀i ∈ set (smaller j). a_pred j)"
的问题是smaller
的公式不适合代码生成,因为它提到了抽象函数small
。
现在根据Andreas的答案,我的最后一个问题和数据细化的文件,下一步就是引入一个类型套小数字,并在该类型创建定义为smaller
:
typedef small_list = "{l. ∀x∈ set l. (x::nat) < 10}" by (rule exI[where x = "[]"], auto)
code_datatype Abs_small_list
lemma [code abstype]: "Abs_small_list (Rep_small_list x) = x" by (rule Rep_small_list_inverse)
definition "smaller' j = Abs_small_list [ i . i <- [0 ..< to_nat j]]"
lemma smaller'_code[code abstract]: "Rep_small_list (smaller' j) = [ i . i <- [0 ..< to_nat j]]"
unfolding smaller'_def
by (rule Abs_small_list_inverse, cases j, auto elim: less_trans simp add: small_inverse)
现在smaller'
是可执行的。据我了解,我需要在small list
重新定义操作作为操作上small_list
:
definition "small_list_all P l = list_all P (map small (Rep_small_list l))"
lemma[code]: "the_question j = small_list_all a_pred (smaller' j)"
unfolding small_list_all_def the_question_def smaller'_code smaller_def Ball_set by simp
我可以定义一个漂亮的代码方程the_question
。但是small_list_all
的定义不适合代码生成,因为它提到了抽象态射small
。我如何使small_list_all
可执行? (请注意,我不能展开a_pred
的代码公式,因为问题实际上发生在实际递归a_pred
的代码公式中。另外,我想避免涉及在运行时重新检查不变量的黑客行为。 )
感谢您的建议。我不认为它适合我的真实用例,但至少这是另一种解决方法,可以添加到我的工具箱中。 – 2013-05-01 14:22:06