コードジェネレーターを試しています。私の理論には、不変式をエンコードするデータ型が含まれています。
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 = ...
です。