试图定义自定义'声明' &安培; '使用'命令

时间:2015-03-13 00:36:37

标签: isabelle

我弄清楚如何修改一些Isar和ML,但在这里我不知道如何得到我想要的东西。

我使用declareusing打开和关闭信息,就像这些(和其他更长的组合)一样:

declare[[simp_trace_new mode=full]]
declare[[show_sorts=false]]
using[[simp_trace_new mode=full]]
using[[show_sorts=false]]

我已经创建了jEdit宏来临时插入大的declareusing命令,但有一个问题是我忘记删除它们。

我想要做的是定义不带参数的declareusing命令。此外,这些命令将使用Output.warning,以便我知道删除它们。

例如,我会定义如下的关键字,它们对应于上面的4个命令:

keywords 
  "simpD" "~sortsD" :: thy_decl
and
  "simpU" "~sortsU" :: prf_decl % "proof"

src/Pure/Isar/isar_syn.ML#l229src/Pure/Isar/isar_syn.ML#l588,我找到declareusing命令:

val _ = Outer_Syntax.local_theory' @{command_spec "declare"} "declare theorems"
  (Parse.and_list1 Parse_Spec.xthms1 -- Parse.for_fixes
    >> (fn (facts, fixes) =>
        #2 oo Specification.theorems_cmd "" [(Attrib.empty_binding, flat facts)] fixes));

val _ = Outer_Syntax.command @{command_spec "using"} "augment goal facts"
  (facts >> (Toplevel.proof o Proof.using_cmd));

下面,我将介绍一个简短的理论来说明如何使用这些命令。我使用伪命令定义simpDsimpU的外部语法,部分显示我想要的内容。虚拟命令需要参数,但我不希望这样。我想要一个像help这样的命令,它不带任何参数。

感谢。

theory i150312a__custom_declare_and_using_syntax
imports Complex_Main
keywords 
  "simpD" "~sortsD" :: thy_decl
and
  "simpU" "~sortsU" :: prf_decl % "proof"
begin
(*Want outer syntax for fixed 'declare' (and 'using') commands like these.*)
declare[[simp_trace_new mode=full]]
declare[[show_sorts=false]]

(*EXE: declare[[simp_trace_new mode=full]] with a warning. Please modify as needed.*)
ML{*Outer_Syntax.improper_command @{command_spec "simpD"} ""
  (Parse.text >> (fn _ => Toplevel.keep (fn _ => 
  let
    val _ = Output.warning "DECLARE: declare[[simp_trace_new mode=full]]"
  in () end)))*}

simpD"" (* But here, I don't want to have to use the double quotes.*)

(*EXE: using[[simp_trace_new mode=full]] with a warning. Please modify as needed.*)
ML{*Outer_Syntax.improper_command @{command_spec "simpU"} ""
  (Parse.text >> (fn _ => Toplevel.keep (fn _ => 
  let
    val _ = Output.warning "USING: using[[simp_trace_new mode=full]]"
  in () end)))*}

lemma "True"
  simpU"" (* But here, I don't want to have to use the double quotes.*)
by(simp)

(* FROM src/Pure/Isar/isar_syn.ML
val _ = Outer_Syntax.local_theory' @{command_spec "declare"} "declare theorems"
  (Parse.and_list1 Parse_Spec.xthms1 -- Parse.for_fixes
    >> (fn (facts, fixes) =>
        #2 oo Specification.theorems_cmd 
        "" [(Attrib.empty_binding, flat facts)] fixes));

val _ = Outer_Syntax.command @{command_spec "using"} "augment goal facts"
  (facts >> (Toplevel.proof o Proof.using_cmd));
*)
end

1 个答案:

答案 0 :(得分:0)

警告我自己是最重要的事情。这是我的WARN和跟踪命令的样子,插入了jEdit宏和键序列:

lemma "True"
  WARN"trace"using[[simp_trace_new mode=full]]
  WARN"trace"using[[linarith_trace,rule_trace,blast_trace,blast_stats]]
by(blast)

我实际上使用\<open>\<close>代替双引号,但是一个漩涡花饰并不总能在浏览器中正确显示。

设置默认值,忘记更改时会感到困惑

我主要是让我的THY清楚警告,所以我应该注意右侧排水沟里的琥珀警告颜色。

我在导入i0.thy中设置了我的工作首选项,如下所示,其中一些更改了默认值,并且都明确告诉我应该看到或不看到的内容:

declare[[show_sorts=true]]
declare[[show_types=false]]
declare[[show_brackets=false]]
declare[[names_unique=true]]
declare[[show_question_marks=true]]
declare[[show_consts=true]]
...(and more)

我绝不会改变,但show_sortsshow_typesshow_brackets我需要经常改变,有时向我展示细节,有时还要消除混乱。

我一直保持输出面板打开,show_consts是查看类型推断方式的主要帮助,因为在尝试为类型实例化类型类时这非常重要,并且很重要总的来说。

为了防止不必要的来源被处理,我必须在{I}工作的地方插入declare

好吧,问题是当我插入一个show命令,然后忘记它时,我最终会感到困惑。我查看了我在i0.thy中设置的内容,然后无法弄清楚为什么我没有看到某些细节,或者看不到某些细节。

关于THY的一点解释

下面,我包含一个具有WARN命令的理论。我还包含了我的 .isabelle / Isabelle2014 / jEdit / macros 文件夹中的jEdit宏。在jEdit 全局选项/快捷方式中,我为宏分配了一个键序列。

一些细节:

  • diag中的keywords允许WARN关键字用于证明。
  • 此处仅需blast_traceblast_stats因为我会在使用simp_trace_new时显示我打开的曲目。
  • blast_traceblast_stats的来源来自M. Wenzel on the isabelle-users mailing list
  • WARN的来源是L. Noschinski in another SO question提供的来源调整。
  • 我打开其他跟踪的一个原因是因为auto有时会调用其他方法,例如blast,甚至simp可能会调用其他方法。
  • 我有时想确切知道正在使用的simp规则,并使用apply(simp only: thm1, thm2, ...)apply(auto simp only: thm1, thm2, ...)之类的命令。我过去看到的是blast或线性算术方法可以自动调用。
  • 如果您想在证明之外使用declare,而不是在证明中使用using,请为declare创建一个jEdit宏。

简短的部分是jEdit宏:

//isar__ust....using_simp_trace.bsh

textArea.setSelectedText("WARN\<open>trace\<close>using[[simp_trace_new mode=full]]");
textArea.insertEnterAndIndent();
textArea.setSelectedText("WARN\<open>trace\<close>using[[linarith_trace,rule_trace,blast_trace,blast_stats]]");

我无法记住我的密钥序列,因此我将它们放在文件名中。我使用4个字母的序列ALT-i u s t

我使用Q-Dir来查看包含我的jEdit宏文件的4个不同文件夹。

THY

这是THY:

theory i150312b__my_WARN
imports Main
keywords "WARN" :: diag
begin
ML{*Outer_Syntax.improper_command @{command_spec "WARN"} 
  "Print a warning message"
  (Parse.text >> (fn s => Toplevel.keep (fn _ => 
    let val _ = Output.warning ("WARNING: " ^ s) in () end)))*}

attribute_setup blast_trace = {*
  Scan.lift
   (Parse.$$$ "=" -- Args.$$$ "true" >> K true ||
    Parse.$$$ "=" -- Args.$$$ "false" >> K false ||
    Scan.succeed true) >>
  (fn b => Thm.declaration_attribute (K (Config.put_generic Blast.trace b)))
*}

attribute_setup blast_stats = {*
  Scan.lift
   (Parse.$$$ "=" -- Args.$$$ "true" >> K true ||
    Parse.$$$ "=" -- Args.$$$ "false" >> K false ||
    Scan.succeed true) >>
  (fn b => Thm.declaration_attribute (K (Config.put_generic Blast.stats b)))
*} 

lemma "True"
  WARN"trace"using[[simp_trace_new mode=full]]
  WARN"trace"using[[linarith_trace,rule_trace,blast_trace,blast_stats]]
by(blast)
end

由Christian Urban撰写的Isabelle Cookbook,贡献

我需要花时间研究Isabelle Cookbook,以便能够调整并创建Isar外语法命令。人们不想免费工作,或者我烧桥。该页面为www.inf.kcl.ac.uk/staff/urbanc/Cookbook

PDF也在TUM repository page的tar.gz文件中,其中包含源代码。点击gz link