Isabelle 如何从HOL中获取ML值?

Isabelle 如何从HOL中获取ML值?,isabelle,ml,hol,Isabelle,Ml,Hol,我有一个嵌入式ML代码,如下所示: ML ‹ val boo = true; val num = 1234; val rea = 3.14; val str = "hi"; › 有谁能给我一个从HOL获取这些值的代码示例吗?对于所讨论的值的类型,在SML类型和一些规范的Isabelle/HOL类型之间(术语的子集)建立同构应该不会太困难。在实践中,它们通常采用函数的形式,从SML类型的术语到Isabelle/HOL中某些类型的术语。 例如,Isabelle/

我有一个嵌入式ML代码,如下所示:

ML ‹
  val boo = true;
  val num = 1234;
  val rea = 3.14;
  val str = "hi";
›

有谁能给我一个从HOL获取这些值的代码示例吗?

对于所讨论的值的类型,在SML类型和一些规范的Isabelle/HOL类型之间(术语的子集)建立同构应该不会太困难。在实践中,它们通常采用函数的形式,从SML类型的术语到Isabelle/HOL中某些类型的术语。 例如,Isabelle/HOL的标准库已经为您感兴趣的三种类型提供了至少三个这样的函数:

  • Quickcheck\u Common.reflect\u bool:bool->term
    允许将SML的
    bool
    转换为Isabelle/HOL的
    bool
  • HOLogic.mk_nat:int->term
    允许将SML的
    int
    的(适当子集)转换为Isabelle/HOL的
    nat
  • HOLogic.mk_string:string->term
    允许将SML的
    字符串
    转换为Isabelle/HOL的
    字符列表
通过声明和定义新常量,可以将这些值“引入”Isabelle/HOL。以下示例显示了如何对常量
boo
num
str
执行此操作:

ML‹
val boo = true
val num = 1234
val str = "hi"
›

ML‹
fun mk_const c t =
  let 
    val b = Binding.name c 
    val defb = Binding.name (c ^ "_def")
  in (((b, NoSyn), ((defb, []), t)) |> Local_Theory.define) #> snd end
›

ML‹
val boo_t = Quickcheck_Common.reflect_bool boo;
val num_t = HOLogic.mk_nat num;
val str_t = HOLogic.mk_string str;
›

local_setup‹mk_const "num" num_t›
local_setup‹mk_const "boo" boo_t›
local_setup‹mk_const "str" str_t›

lemma "num = 1234"
  unfolding num_def by simp

lemma "boo = True"
  unfolding boo_def by simp

lemma "str = ''hi''"
  unfolding str_def by simp

我不知道SML类型转换的标准函数
real
,但想出一些东西应该不会太难(我建议您研究函数
HOLogic.mk_nat
HOLogic.mk_string
)的实现。在这种情况下,可能还值得查看有关Isabelle代码生成的文档/出版物。

谢谢。我从你的指导中学到了很多。