Isabelle 如何转换“;thm CONGI”;我可以保存到文件中的ASCII字符串?

Isabelle 如何转换“;thm CONGI”;我可以保存到文件中的ASCII字符串?,isabelle,Isabelle,从第11页和第12页,我找到了一些与我尝试做的事情相关的开始信息 我试图做的代表性工作是以下ML声明: val syntax_str = Syntax.string_of_term @{context} (prop_of @{thm conjI}); 我想将定理congi作为ASCII字符串保存到文件中,并使其如下所示: P \<Longrightarrow> Q \<Longrightarrow> P \<and> Q 谢谢。我不确定这是否是最好的方法,

从第11页和第12页,我找到了一些与我尝试做的事情相关的开始信息

我试图做的代表性工作是以下ML声明:

val syntax_str = Syntax.string_of_term @{context} (prop_of @{thm conjI});
我想将定理
congi
作为ASCII字符串保存到文件中,并使其如下所示:

P \<Longrightarrow> Q \<Longrightarrow> P \<and> Q

谢谢。

我不确定这是否是最好的方法,但您可以试试:

fun render_thm ctxt thm =
  Print_Mode.setmp ["xsymbols"]
    (fn _ => Display.pretty_thm ctxt thm
             |> Pretty.str_of
             |> YXML.parse_body
             |> XML.content_of) ()
现在,如果您运行:

ML {* render_thm @{context} @{thm iffI} *}
您将得到一个字符串,该字符串在Isabelle/jEdit中显示为:

⟦?P ⟹ ?Q; ?Q ⟹ ?P⟧ ⟹ ?P = ?Q
但实际上,内部是:

\<lbrakk>?P \<Longrightarrow> ?Q; ?Q \<Longrightarrow> ?P\<rbrakk> \<Longrightarrow> ?P = ?Q
\?P\?Q?Q\?P\\?P=?Q

如果您使用
文件将字符串保存到文件中,您将得到后一个版本。write

我查看了大锤代码(基本上是
~/src/HOL/Tools/sledgehammer/sledgehammer\u isar\u proof.ML中的函数
string\u of isar\u
)以下是我为使其发挥作用所做的努力:

ML ‹ fun term_to_xsymbols ctxt0 t = 
  let val ctxt = ctxt0
    |> Config.put show_markup false
    |> Config.put Printer.show_type_emphasis false
    |> Config.put show_types false
    |> Config.put show_sorts false
    |> Config.put show_consts false
    |> Config.put show_question_marks false
  in
    t
    |> singleton (Syntax.uncheck_terms ctxt)
    |> Sledgehammer_Isar_Annotate.annotate_types_in_term ctxt
    |> Sledgehammer_Util.with_vanilla_print_mode (Syntax.unparse_term ctxt #> Pretty.string_of)
    |> Sledgehammer_Util.simplify_spaces
  end
 ›


ML‹
  val pretty_str = term_to_xsymbols @{context} (prop_of @{thm conjI});
  writeln pretty_str;
  File.write (Path.explode (
    File.platform_path(Resources.master_directory @{theory}) ^ 
    "/pretty_str.txt")) pretty_str;
›
Isabelle/jedit中的输出:

⟦P; Q⟧ ⟹ P ∧ Q
val pretty_str = "⟦P; Q⟧ ⟹ P ∧ Q": string
文本文件中的输出:

\<lbrakk>P; Q\<rbrakk> \<Longrightarrow> P \<and> Q
\P;Q\\P\Q

Mathieu,谢谢。我必须选择一个答案,David的答案略短,但您的答案让我注意到Sledgehammer做了很多工作或处理来显示其校样,因此了解
Sledgehammer\u isar\u proof.ML
对我将来可能有用。另外,我可能想像你一样设置
show
选项。当然,没问题,我也会选择大卫的。在写完我的文章后,我刚刚看到了它。请注意,sledgehammer中的代码包含了很多想法,以确保解析器重建的术语与之前打印的相同(可能还不是100%)。标准的漂亮印刷品远远不是这样。大卫,谢谢。我可以对保存的内容进行一些处理,以获得我想要的内容。在将这些字符串保存到磁盘后,您希望如何处理它们?如果只是为了机器使用,您可能需要存储一个术语的YXML表示。@Lars,我想为我的PDF文档创建一个定理附录。最终的计划是找到
apply
by
等语句中使用的许多或所有定理名称,使用定义的ML创建THY,以将定理公式保存到THY,其中Isabelle将在THY上运行。有了这个,我将创建一个定理的LaTeX附录,这样,在我的PDF中,我可以点击证明中的一个定理名称,让我找到附录中的公式。我需要的是在你的文件中使用ASCII格式的公式。这是为了使PDF格式的校对完全独立于软件。我认为有更好的方法:在文本块中,您可以使用
@{thm myThmName}
反旋转打印定理。请看一下参考手册中的
文档准备
一章,特别是
文档反旋转
一节。@Lars,我在2011年试图使用Isabelle的乳胶,但我无法实现我想要的,那就是将所有Isar置于逐字逐句的环境中。因此,我选择了另一条创建LaTeX的道路,现在它在一个应用程序中包含了我自己的标记。这并不是说我的方式很好,而是我现在倾向于不想通过伊莎贝尔使用乳胶。我已经搜索并替换了我使用的所有符号,比如
\
,我有自己的LaTeX序言。我很高兴像你这样的专业人士能给我复杂的解决方案,但我有一些伊莎贝尔无法实现的想法,一个黑客就足够了。
\<lbrakk>P; Q\<rbrakk> \<Longrightarrow> P \<and> Q