【问题标题】:How can I use functions written in ML inside Isabelle?如何在 Isabelle 中使用用 ML 编写的函数?
【发布时间】:2022-01-25 19:01:38
【问题描述】:

抱歉,如果这被认为是一个愚蠢的问题,但我怎样才能让 Isabelle 理论识别 ML 代码?例如,假设我有一个 Isabelle 文件,看起来像

ML ‹
type vec = real * real;

fun addvec ((a,b):vec) ((c,d):vec) : vec = (a+b,c+d); 
›

lemma "addvec (1,2) (3,4) = (4,6)"

很遗憾,addvec 在引理中未被识别。如何使功能被识别?我已经阅读了How to get ML values from HOL? 以及 Isabelle Cookbook。前者使用local_setup 使用名为mk_const 的函数将常量分配给Isabelle 常量(据我所知)

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

Binding.nameLocal_Theory.define 函数有什么作用,local_theory 类型是什么?

提前致谢!

【问题讨论】:

  • 短版:你不容易。如果只是因为您可以在 ML 而不是在 Isabelle 中编写非终止函数。想要达到什么目标?
  • 我什至认为函数一般是不可能的。您需要在 SML 中进行反射才能研究函数的结构。
  • @MathiasFleury 我正在尝试最终在 ML 中编写一个函数,该函数可以获取 Isabelle 中记录的字段名称,然后在 Isabelle 中使用此函数。它的内容非常丰富,我是 ML 的完整初学者。
  • 您是尝试使用 SML 类型在 SML 中编写函数,还是尝试使用 Isabelle(又名“术语”)在 SML 中编写函数?链接的问题询问了前者(我认为不可能将记录从 Isabelle 翻译成 SML)。但后者也很有意义。
  • @MathiasFleury 最初我想用 SML 类型在 SML 中编写一个函数,我可以在 Isabelle 中使用它,因为记录字段是在 SML 中实现的。

标签: isabelle ml


【解决方案1】:

我们的想法不是定义一个用 ML 编写的函数,而是在 ML 中定义一个可以在 Isabelle 中使用的函数。

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
›


record point =
  coord_x::int

例如,让我们定义一个只调用coord_x的函数:

ML ‹
val f = Abs ("x", @{typ "point"}, Const( \<^const_name>‹coord_x›, @{typ "point"} --> @{typ int}) $ Bound 0)
›

现在我们已经写好了定义,我们可以给它绑定一个名字:

local_setup‹mk_const "c" f›
thm c_def
(*c ≡ coord_x*)

local_setup是改变理论的关键字(所以添加常量,改变上下文等等)。

现在显然您很可能不想要像 coord_x 这样的硬编码常量。

这里有一些一般的cmets:我从来没有用过唱片,我写了很多伊莎贝尔。它们可能很有用(因为它们是可扩展的等等),但它们很奇怪/因为它们是可扩展的/。因此,如果您可以处理数据类型,请这样做。它更好,它是一个合适的类型(所以 locales/instances/... 可以正常工作)。

【讨论】:

  • 是的,快到了。我应该早点指定这个,但我也希望 c 是单态的(它目前在 Isabelle 中是 point =&gt; int),这样如果它们有不同的类型,我可以将它与其他字段放在同一个集合中。例如:如果那里有一个名为name :: string 的字段,那么我可以在同一个集合中获得namec。很抱歉造成额外的延误。
  • 更精确地指定类型:将point替换为您想要的类型,例如string point_scheme
  • 对不起,我不完全明白。我尝试在这里更改val f = Abs ("x", @{typ "string point_scheme"}, Const( \&lt;^const_name&gt;‹coord_x›, @{typ "string point_scheme"} --&gt; @{typ int}) $ Bound 0) 的类型,但c 仍然是char list point_scheme =&gt; int 类型,这是一个问题,因为附加了int 类型。这意味着如果我在 point 记录中有字段 name::string,那么如果我使用相同的方法,我就不能将两个名称放在同一个集合中。
  • 等等,这和单态无关。您是否要重载 c 使其适用于多条记录?或者,如果这是您想要的,只需将类型 int 更改为 string。我需要你想要的 MWE,我很困惑。
  • 回到你的第一条评论:你想写一组不同类型的元素吗?这不起作用。如果您有有限数量的可能类型,则可以使用数据类型,但这不能直接工作。 Isabelle 是一种类型化的语言!我想我们又回到了:你想用那一套做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 2018-08-11
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多