我弄清楚如何修改一些Isar和ML,但在这里我不知道如何得到我想要的东西。
我使用declare
和using
打开和关闭信息,就像这些(和其他更长的组合)一样:
declare[[simp_trace_new mode=full]]
declare[[show_sorts=false]]
using[[simp_trace_new mode=full]]
using[[show_sorts=false]]
我已经创建了jEdit宏来临时插入大的declare
和using
命令,但有一个问题是我忘记删除它们。
我想要做的是定义不带参数的declare
和using
命令。此外,这些命令将使用Output.warning
,以便我知道删除它们。
例如,我会定义如下的关键字,它们对应于上面的4个命令:
keywords
"simpD" "~sortsD" :: thy_decl
and
"simpU" "~sortsU" :: prf_decl % "proof"
从src/Pure/Isar/isar_syn.ML#l229和src/Pure/Isar/isar_syn.ML#l588,我找到declare
和using
命令:
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));
下面,我将介绍一个简短的理论来说明如何使用这些命令。我使用伪命令定义simpD
和simpU
的外部语法,部分显示我想要的内容。虚拟命令需要参数,但我不希望这样。我想要一个像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
答案 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_sorts
,show_types
和show_brackets
我需要经常改变,有时向我展示细节,有时还要消除混乱。
我一直保持输出面板打开,show_consts
是查看类型推断方式的主要帮助,因为在尝试为类型实例化类型类时这非常重要,并且很重要总的来说。
为了防止不必要的来源被处理,我必须在{I}工作的地方插入declare
。
好吧,问题是当我插入一个show命令,然后忘记它时,我最终会感到困惑。我查看了我在i0.thy
中设置的内容,然后无法弄清楚为什么我没有看到某些细节,或者看不到某些细节。
下面,我包含一个具有WARN
命令的理论。我还包含了我的 .isabelle / Isabelle2014 / jEdit / macros 文件夹中的jEdit宏。在jEdit 全局选项/快捷方式中,我为宏分配了一个键序列。
一些细节:
diag
中的keywords
允许WARN
关键字用于证明。blast_trace
和blast_stats
因为我会在使用simp_trace_new
时显示我打开的曲目。blast_trace
和blast_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:
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
我需要花时间研究Isabelle Cookbook,以便能够调整并创建Isar外语法命令。人们不想免费工作,或者我烧桥。该页面为www.inf.kcl.ac.uk/staff/urbanc/Cookbook。
PDF也在TUM repository page的tar.gz文件中,其中包含源代码。点击gz link。