如何在 Isabelle 的 ML 级别轻松编写简单的策略?

2023-12-30

在 Isabelle 理论文件中,我可以编写简单的一行策略,如下所示:

apply (clarsimp simp: split_def split: prod.splits)

然而,我发现,当我开始编写 ML 代码来自动化证明、生成 MLtactic对象,这些俏皮话变得相当冗长:

clarsimp_tac (Context.proof_map (
    Simplifier.map_ss (fold Splitter.add_split @{thms prod.splits})
    #> Simplifier.map_ss (fn ss => ss addsimps [@{thm split_def}]))
  @{context}) 1

有没有一种更简单的方法可以在 Isabelle/ML 级别编写简单的单行策略?

例如,类似反引号的内容:@{tactic "clarsimp simp: split_def split: prod.splits"}产生类型的函数context -> tactic,将是一个理想的解决方案。


我看到了多种可能性,这在一定程度上取决于您的应用程序的上下文,什么是最好的。请注意,一般来说,用于自动化证明的单独 ML 代码在过去很常见,但如今相对较少。例如,比较自定义策略的数量相当少HOL-Bali http://isabelle.in.tum.de/library/HOL/HOL-Bali/index.html(1997年开始)JinjaThreads http://afp.sourceforge.net/entries/JinjaThreads.shtml法新社(从 2007 年开始,一直持续到最近)。

嵌套 ML 反引号,例如@{tactic}原则上是可行的,但你很快就会遇到进一步的问题,比如如果你的定理论证再次是 Isar 或 ML 源,会发生什么。

代替反引用ML 中的策略构建块,一个更基本的方法是quote通过给 Isar 中的常规方法语法提供如下所示的证明过程:

ML {*
  (*foo_tac -- the payload of what you want to do,
    note the dependency on ctxt: Proof.context*)
  fun foo_tac ctxt =
    let
      val my_ctxt =
        ctxt |> Simplifier.map_simpset
         (fold Splitter.add_split @{thms prod.splits} #>
          Simplifier.add_simp @{thm split_def})
    in ALLGOALS (clarsimp_tac my_ctxt) end
*}

method_setup foo = {*
  (*concrete syntax like "clarsimp", "auto" etc.*)
  Method.sections Clasimp.clasimp_modifiers >>
    (*Isar method boilerplate*)
    (fn _ => fn ctxt => SIMPLE_METHOD (CHANGED (foo_tac ctxt)))  
*}

这里我先做了一个常规的foo_tacIsabelle/ML 中的定义,然后将其包装为通常的 Isar 方式作为证明方法。后者意味着你有像这样的包装器SIMPLE_METHOD负责将“连锁事实”推入您的目标状态,并且CHANGED确保 Isar 方法取得进展(例如simp or auto).

The foo_tac示例假设您对上下文(或其 simpset)的修改是恒定的,通过硬连接的分割规则。如果您想在那里有更多参数,您可以将其包含在具体方法语法中。注意Method.sections在这方面已经相当成熟了。更基本的参数解析器在“定义证明方法”部分给出isar-ref http://isabelle.in.tum.de/doc/isar-ref.pdf手动的。您还应该通过搜索源来查看现有示例method_setup(伊莎贝尔/伊萨尔)或Method.setup(伊莎贝尔/ML)。

如果您仍然想使用 ML 反引号而不是具体的方法语法,可以尝试一种变体@{context}允许这样的修饰符:

@{context simp add: ...}

这有点投机,是当场发明的,可能会被证明是不好的做法。正如我所说,尽管 ML 是 Isabelle 框架不可或缺的一部分,但 Isabelle 中的细粒度策略编程近年来已经有点过时了。如果您提出具有更多应用程序上下文的更具体问题,我们可以重新考虑反引用方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Isabelle 的 ML 级别轻松编写简单的策略? 的相关文章

  • Windows系统 Emacs运行SML REPL控制台报错 “Searching for program: no such file or directory, sml“

    首先保证在smlnj官网 xff0c 下载并安装了SMLNJ xff0c 然后再检查Emacs是否安装sml mode xff08 需要注意的是Emacs的sml mode只是一种Emacs的编辑模式 xff0c 并不包含SML的编译器之类
  • 1个案例多种模式

    在 SML 中 一个 case 语句中是否可以有多种模式 例如 我有 4 个算术运算符以字符串形式表示 我想打印 PLUS MINUS 其中是 or and MULT DIV 如果是 or TL DR 有什么地方可以简化以下内容以使用更少的
  • SML 中绑定的价值?

    有人可以解释一下为什么评估后 and 的值一定是 16 这是正确的答案吗 我认为答案 3 是因为我们调用函数 f 并将值 1 和 2 作为函数 f 发送 但看不到值 5 和 10 但我想我错了 val x 1 val y 2 val f f
  • number_in_month 练习(SML 中多个列表的迭代)

    我在 SML 中有两个列表 假设列表 A a b c d e f 和列表B b e 我想计算 B 中每个项目与 A 中每个三元组的第二个元素匹配的次数 输出应该是 2 因为b and e每个在 A 中出现一次 到目前为止 这是我的代码 但是
  • number_in_month 练习(SML 列表迭代)

    我需要获取日期列表和月份列表 并获取列出的任何月份中的日期数量总数 从而返回一个整数 我有一个先前定义的number in month函数 它接受一个列表 日期和一个月 并返回该日期中的日期数量 月 它已经过测试并且工作正常 我以此为基础
  • 如何在 Isabelle 中定义偏函数?

    我尝试用以下方法定义偏函数partial function关键词 它不起作用 这是最能表达直觉的 partial function tailrec oddity nat gt nat where oddity Zero Zero oddit
  • 如何在 Isabelle 的 ML 级别轻松编写简单的策略?

    在 Isabelle 理论文件中 我可以编写简单的一行策略 如下所示 apply clarsimp simp split def split prod splits 然而 我发现 当我开始编写 ML 代码来自动化证明 生成 MLtactic
  • SML:为什么函数总是采用一个参数使语言变得灵活

    我 从一本 SML 书中 了解到 SML 中的函数总是只接受一个参数 一个元组 接受多个参数的函数只是一个接受一个元组作为参数的函数 通过函数绑定中的元组绑定来实现 我明白这一点 但在这之后 书上说了一些我不明白的话 this point
  • 伊莎贝尔证明加法的交换律

    我试图证明 Isabelle HOL 中自定义的交换律add功能 我设法证明了关联性 但我坚持这一点 的定义add fun add nat nat nat where add 0 n n add Suc m n Suc add m n 关联
  • SML/NJ:如何使用哈希表?

    我真的很想在 SML 中创建一个哈希表 似乎 SML NJ 中已经有一个结构 问题是 我该如何使用它 我还没有完全理解如何在SML中使用结构 并且我读过的书中的一些非常基本的示例给了我错误 我什至不知道如何纠正 所以使用HashTable结
  • 何时在 SML 中使用分号?

    我知道分号在 REPL 中用作终止符 但我对何时在源文件中使用它们感到困惑 例如 之后不需要val x 1 但如果我之后省略它use foo sml 编译器会抱怨它 那么 分号的使用规则是什么呢 分号用于 SML 中的许多语法实体 它们通常
  • 有类似 Haskell/ML 的 C 编译器吗?

    People have http jlongster com software iphone scheme iphone example 书面games http www artisancoder com 2009 10 scheme hi
  • 如何让 typedef 类型从类型类的母类型继承运算符

    发布答案后续问题 Brian 提供了答案 并建议使用提升和转移的解决方案 然而 我找不到足够的关于举重和转移的教程信息 无法知道如何调整他的答案来完成我需要做的事情 在这里 我在黑暗中工作 并使用给出的答案作为即插即用模板来提出这个后续问题
  • 伊莎贝尔案例分析

    如何在伊莎贝尔中应用案例分析 我正在寻找类似的东西apply induct x 用于归纳 案例分析通常是通过cases方法 另见索引中的 案例 方法 伊莎贝尔 伊萨尔参考手册 http isabelle in tum de website
  • 添加后收集所有非未定义值

    我对伊莎贝尔有以下补充 function proj add real real bit real real bit real real bit where proj add x1 y1 l x2 y2 j add x1 y1 x2 y2 l
  • 要统一的类型变量出现在类型中

    我有一个函数可以从两个列表重建一棵树 我返回所有分支的列表 但收到一个我不明白的错误 但我认为这与返回类型有关 错误是这样的 Can t unify a with a list Type variable to be unified occ
  • 标准 ML 展开列表

    路线 功能expand接收任意类型的列表和整数 数字n 并返回一个列表 其中输入列表的每个项目是 复制的n次 例如 展开 1 2 3 3 必须是 计算结果为 1 1 1 2 2 2 3 3 3 函数的类型必须是 a 列表 int 列表 这是
  • ML 中高阶函数中的 curry 和 uncurry 是什么

    fun curry f x y f x y fun uncurry f x y f x y fun compose f g x f g x 我了解 compose 函数 但不太了解 ML 中的 curry 和 uncurry 谁能解释一下这
  • Isabelle 可以用来画推理树吗?

    使用 Isabelle HOL 2021 可以生成简单推理规则的图表 例如如下 text Writing verb verb thm mode Rule conjI produces thm mode Rule conjI even in
  • 如何使用相对于导入器的路径从 SML 中的另一个文件导入?

    我正在使用 SML NJ 并且我需要使用某个文件中的一组函数f1 sml在另一个文件中f2 sml 然而我并没有跑步f2 sml相反 我直接从其他地方导入它 如果我使用use命令输入f2 sml与路径f1 sml关系到f2 sml观点 当我

随机推荐