如何在 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 级别轻松编写简单的策略? 的相关文章

  • 二变量多项式的霍纳规则

    霍纳规则用于简化在特定变量值下评估多项式的 过程 https rosettacode org wiki Horner 27s rule for polynomial evaluation Standard ML 我已经使用 SML 轻松地将
  • 尝试像集合和子集一样对待类型类和子类型

    这个问题与我之前的SO问题有关类型类 我问这个问题是为了设置一个有关语言环境的未来问题 我不认为类型类适合我想要做的事情 但是类型类的工作方式让我了解了我想要从语言环境中得到什么 下面 当我使用大括号表示法时 0 0 它不代表普通的 HOL
  • 使用不同大小的函数进行自动终止证明

    我写了一个自定义尺寸的函数size2对于我的数据类型 使用此函数 我可以手动证明函数的终止 termination apply relation measure a b c size2 c apply auto done 有没有办法制作fu
  • 如何在 Isabelle 的 ML 级别轻松编写简单的策略?

    在 Isabelle 理论文件中 我可以编写简单的一行策略 如下所示 apply clarsimp simp split def split prod splits 然而 我发现 当我开始编写 ML 代码来自动化证明 生成 MLtactic
  • SML 中的霍纳算法? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试实施霍纳算法 http en wikipedia org wiki Horner 27s algorithm
  • 记录列表上的SML功能

    我试图声明一个函数 该函数将元组内的记录列表作为参数 但语法并不像我希望的那样直观 这就是我想做的 type Player id int privateStack int list fun foo id x xs Player player
  • SML:为什么函数总是采用一个参数使语言变得灵活

    我 从一本 SML 书中 了解到 SML 中的函数总是只接受一个参数 一个元组 接受多个参数的函数只是一个接受一个元组作为参数的函数 通过函数绑定中的元组绑定来实现 我明白这一点 但在这之后 书上说了一些我不明白的话 this point
  • 何时在 SML 中使用分号?

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

    在 SML 中 可以采用以下方式对惰性编程进行建模 Have a datatype to wrap a computation datatype a susp Susp of unit gt a A function to hold the
  • Isabelle/HOL 中的 primrec 和 fun 有什么区别?

    我正在阅读 Isabelle 教程 并试图澄清我对 primrec 和 fun 的使用的概念 到目前为止我搜索过的内容 包括答案here https lists cam ac uk mailman htdig cl isabelle use
  • SML 和函数式编码风格

    我开始学习标准机器学习编程语言 https www coursera org course proglang course 在第一个作业中 我尝试编写一个函数is older需要两个日期并评估为true or false 它评估为true如
  • 标准机器学习语法

    我是标准机器学习的新手 并尝试编写以下代码 fun whilestat test stmt1 fn x gt if test x then stmt1 x whilestat test stmt1 else x 问题是它给了我以下错误 w
  • 有类似 Haskell/ML 的 C 编译器吗?

    People have http jlongster com software iphone scheme iphone example 书面games http www artisancoder com 2009 10 scheme hi
  • 伊莎贝尔的文件准备

    我想获得与相关的 LaTeX 代码这个理论 https github com rjraya Isabelle blob master curves Hales thy 以前的答案仅提供文档的链接 让我描述一下我做了什么 我去了目录Hales
  • 读取 SML 中的命令行参数

    我正在尝试读取输入文件的名称 argv 1 这是我到目前为止所做的 val args CommandLine arguments val x y args val agora x 但我不断收到此错误消息 uncaught exception
  • 在 SML 中使用foldr 连接字符串

    我正在尝试声明一个函数 字符串列表 gt 字符串 例如输入 Chicago city USA 应该返回 Chicago city USA 到目前为止我所做的是 fun gather ts foldr op ts 这似乎有点符合 但问题是 我
  • SML 中的柯里化匿名函数

    我有下面的功能并且它有效 fn x gt x 2 2 但这不起作用 fn x y gt x y 2 3 谁能告诉我为什么 或者给我一些提示让它发挥作用 fn x gt fn y gt x y 2 3 works fn只是没有相同的语法糖来定
  • 使用 SML 和 HOL 推理规则从第一原理证明定理

    我正在尝试证明这个定理 p q lt gt q p thm将 SML 与 HOL 推理规则结合使用 这是 SML 代码 val thm1 ASSUME p bool q bool val thm2 ASSUME p bool val thm
  • 在 Trie 中插入值

    我在 SML 目录中找到了 Trie 的实现 signature DICT sig type key string concrete type type a entry key a concrete type type a dict abs
  • number_in_month 练习(计算列表中的元素数)

    我一直在尝试使用 SML 对整数 3 元组列表中的元素进行计数 该列表等于给定的整数 但它不起作用 谁能帮我找出下面的代码有什么问题或者为我纠正它 fun number in month x int int int list m int i

随机推荐