我正在试验代码生成器。我的理论包含一个编码不变量的数据类型:
typedef small = "{x::nat. x < 10}" morphisms to_nat small
by (rule exI[where x = 0], simp)
definition "is_one x ⟷ x = small 1"
现在我想导出is_one
. 看来我首先必须为代码生成器设置数据类型,如下所示:
code_datatype small
instantiation small :: equal
begin
definition "HOL.equal a b ⟷ to_nat a = to_nat b"
instance
apply default
unfolding equal_small_def
apply (rule to_nat_inject)
done
end
lemma [code abstype]: "small (to_nat x) = x" by (rule to_nat_inverse)
现在我可以定义一个is_one
不违反抽象的代码方程:
definition [code del]:"small_one = small 1"
declare is_one_def[code del]
lemma [code]: "is_one x ⟷ x = small_one" unfolding is_one_def small_one_def..
lemma [code abstract]: "to_nat small_one = 1"
unfolding small_one_def by (rule small_inverse, simp)
export_code is_one in Haskell file -
问题1:我可以避免将定义small_one
拉出is_one
吗?
现在我有一个小项目的复合值:
definition foo :: "small set list" where "foo = [ {small (10-i), small i} . i <- [2,3,4] ]"
在这种形式下,我无法使用它导出代码(“代码方程式 foo 中的抽象违规...”)。
问题 2:如何[code abstract]
为这样的值定义引理?似乎代码生成器不接受形式的引理map to_nat foo = ...
。