locale
解釈せずに、定義から直接コードを生成したいと思っています。例:
(* A locale, from the code point of view, similar to a class *)
locale MyTest =
fixes L :: "string list"
assumes distinctL: "distinct L"
begin
definition isInL :: "string => bool" where
"isInL s = (s ∈ set L)"
end
インスタンス化する仮定MyTest
は実行可能であり、それらのコードを生成できます
definition "can_instance_MyTest L = distinct L"
lemma "can_instance_MyTest L = MyTest L"
by(simp add: MyTest_def can_instance_MyTest_def)
export_code can_instance_MyTest in Scala file -
isInL
任意の の定義を実行する関数を定義できますMyTest
。
definition code_isInL :: "string list ⇒ string ⇒ bool option" where
"code_isInL L s = (if can_instance_MyTest L then Some (MyTest.isInL L s) else None)"
lemma "code_isInL L s = Some b ⟷ MyTest L ∧ MyTest.isInL L s = b"
by(simp add: code_isInL_def MyTest_def can_instance_MyTest_def)
ただし、コードのエクスポートは失敗します。
export_code code_isInL in Scala file -
No code equations for MyTest.isInL
なぜ私はそのようなことをしたいのですか?私は、eg hereに似ているが有限locale
のコンテキストで a を使用しています。グラフが有効かどうかのテストは簡単です。ここで、グラフ アルゴリズムのコードを Scala にエクスポートしたいと考えています。もちろん、コードは任意の有効なグラフで実行する必要があります。valid_graph
次のような Scala の例えを考えています。
class MyTest(L: List[String]) {
require(L.distinct)
def isInL(s: String): Bool = L contains s
}