wenzelm@5832: (* Title: Pure/Isar/isar_syn.ML wenzelm@5832: ID: $Id$ wenzelm@5832: Author: Markus Wenzel, TU Muenchen wenzelm@8807: License: GPL (GNU GENERAL PUBLIC LICENSE) wenzelm@5832: wenzelm@6353: Isar/Pure outer syntax. wenzelm@5832: *) wenzelm@5832: wenzelm@5832: signature ISAR_SYN = wenzelm@5832: sig wenzelm@5832: val keywords: string list wenzelm@5832: val parsers: OuterSyntax.parser list wenzelm@5832: end; wenzelm@5832: wenzelm@5832: structure IsarSyn: ISAR_SYN = wenzelm@5832: struct wenzelm@5832: wenzelm@6723: structure P = OuterParse and K = OuterSyntax.Keyword; wenzelm@5832: wenzelm@5832: wenzelm@5832: (** init and exit **) wenzelm@5832: wenzelm@5832: val theoryP = wenzelm@6723: OuterSyntax.command "theory" "begin theory" K.thy_begin wenzelm@6245: (OuterSyntax.theory_header >> (Toplevel.print oo IsarThy.theory)); wenzelm@5832: wenzelm@6687: val end_excursionP = wenzelm@6723: OuterSyntax.command "end" "end current excursion" K.thy_end wenzelm@6687: (Scan.succeed (Toplevel.print o Toplevel.exit)); wenzelm@6687: wenzelm@6245: val contextP = wenzelm@7102: OuterSyntax.improper_command "context" "switch theory context" K.thy_switch wenzelm@6723: (P.name >> (Toplevel.print oo IsarThy.context)); wenzelm@6245: wenzelm@5832: wenzelm@5832: wenzelm@7749: (** markup commands **) wenzelm@5832: wenzelm@7749: val headerP = OuterSyntax.markup_command "header" "theory header" K.diag wenzelm@7733: (P.comment >> IsarThy.add_header); wenzelm@6353: wenzelm@7749: val chapterP = OuterSyntax.markup_command "chapter" "chapter heading" K.thy_heading wenzelm@6723: (P.comment >> (Toplevel.theory o IsarThy.add_chapter)); wenzelm@5958: wenzelm@7749: val sectionP = OuterSyntax.markup_command "section" "section heading" K.thy_heading wenzelm@6723: (P.comment >> (Toplevel.theory o IsarThy.add_section)); wenzelm@5958: wenzelm@7749: val subsectionP = OuterSyntax.markup_command "subsection" "subsection heading" K.thy_heading wenzelm@6723: (P.comment >> (Toplevel.theory o IsarThy.add_subsection)); wenzelm@5958: wenzelm@7749: val subsubsectionP = wenzelm@7749: OuterSyntax.markup_command "subsubsection" "subsubsection heading" K.thy_heading wenzelm@7749: (P.comment >> (Toplevel.theory o IsarThy.add_subsubsection)); wenzelm@5832: wenzelm@8661: val textP = OuterSyntax.markup_env_command "text" "formal comment (theory)" K.thy_decl wenzelm@7172: (P.comment >> (Toplevel.theory o IsarThy.add_text)); wenzelm@7172: wenzelm@7862: val text_rawP = OuterSyntax.verbatim_command "text_raw" "raw document preparation text" wenzelm@7862: K.thy_decl (P.comment >> (Toplevel.theory o IsarThy.add_text_raw)); wenzelm@7775: wenzelm@7172: wenzelm@7749: val sectP = OuterSyntax.markup_command "sect" "formal comment (proof)" K.prf_decl wenzelm@7172: (P.comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.add_sect))); wenzelm@7172: wenzelm@7749: val subsectP = OuterSyntax.markup_command "subsect" "formal comment (proof)" K.prf_decl wenzelm@7172: (P.comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.add_subsect))); wenzelm@7172: wenzelm@7749: val subsubsectP = OuterSyntax.markup_command "subsubsect" "formal comment (proof)" K.prf_decl wenzelm@7172: (P.comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.add_subsubsect))); wenzelm@7172: wenzelm@8661: val txtP = OuterSyntax.markup_env_command "txt" "formal comment (proof)" K.prf_decl wenzelm@7172: (P.comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.add_txt))); wenzelm@7172: wenzelm@7862: val txt_rawP = OuterSyntax.verbatim_command "txt_raw" "raw document preparation text (proof)" wenzelm@7862: K.prf_decl (P.comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.add_txt_raw))); wenzelm@7775: wenzelm@5832: wenzelm@6886: wenzelm@6886: (** theory sections **) wenzelm@6886: wenzelm@5832: (* classes and sorts *) wenzelm@5832: wenzelm@5832: val classesP = wenzelm@6723: OuterSyntax.command "classes" "declare type classes" K.thy_decl wenzelm@6723: (Scan.repeat1 (P.name -- Scan.optional (P.$$$ "<" |-- P.!!! (P.list1 P.xname)) []) wenzelm@6727: -- P.marg_comment >> (Toplevel.theory o IsarThy.add_classes)); wenzelm@5832: wenzelm@5832: val classrelP = wenzelm@6723: OuterSyntax.command "classrel" "state inclusion of type classes (axiomatic!)" K.thy_decl wenzelm@6727: (P.xname -- (P.$$$ "<" |-- P.!!! P.xname) -- P.marg_comment wenzelm@6727: >> (Toplevel.theory o IsarThy.add_classrel)); wenzelm@5832: wenzelm@5832: val defaultsortP = wenzelm@6723: OuterSyntax.command "defaultsort" "declare default sort" K.thy_decl wenzelm@6727: (P.sort -- P.marg_comment >> (Toplevel.theory o IsarThy.add_defsort)); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* types *) wenzelm@5832: wenzelm@5832: val typedeclP = wenzelm@6723: OuterSyntax.command "typedecl" "Pure type declaration" K.thy_decl wenzelm@6727: (P.type_args -- P.name -- P.opt_infix -- P.marg_comment >> (fn (((args, a), mx), cmt) => wenzelm@6727: Toplevel.theory (IsarThy.add_typedecl ((a, args, mx), cmt)))); wenzelm@5832: wenzelm@5832: val typeabbrP = wenzelm@6723: OuterSyntax.command "types" "declare type abbreviations" K.thy_decl wenzelm@6727: (Scan.repeat1 wenzelm@6727: (P.type_args -- P.name -- (P.$$$ "=" |-- P.!!! (P.typ -- P.opt_infix)) -- P.marg_comment) wenzelm@6727: >> (Toplevel.theory o IsarThy.add_tyabbrs o wenzelm@6727: map (fn (((args, a), (T, mx)), cmt) => ((a, args, T, mx), cmt)))); wenzelm@5832: wenzelm@5832: val nontermP = wenzelm@6370: OuterSyntax.command "nonterminals" "declare types treated as grammar nonterminal symbols" wenzelm@6727: K.thy_decl (Scan.repeat1 (P.name -- P.marg_comment) wenzelm@6727: >> (Toplevel.theory o IsarThy.add_nonterminals)); wenzelm@5832: wenzelm@5832: val aritiesP = wenzelm@6723: OuterSyntax.command "arities" "state type arities (axiomatic!)" K.thy_decl wenzelm@6727: (Scan.repeat1 ((P.xname -- (P.$$$ "::" |-- P.!!! P.arity) >> P.triple2) -- P.marg_comment) wenzelm@6727: >> (Toplevel.theory o IsarThy.add_arities)); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* consts and syntax *) wenzelm@5832: wenzelm@8227: val judgmentP = wenzelm@8227: OuterSyntax.command "judgment" "declare object-logic judgment" K.thy_decl wenzelm@8227: (P.const -- P.marg_comment >> (Toplevel.theory o IsarThy.add_judgment)); wenzelm@8227: wenzelm@5832: val constsP = wenzelm@6723: OuterSyntax.command "consts" "declare constants" K.thy_decl wenzelm@6727: (Scan.repeat1 (P.const -- P.marg_comment) >> (Toplevel.theory o IsarThy.add_consts)); wenzelm@5832: wenzelm@5832: val opt_mode = wenzelm@5832: Scan.optional wenzelm@6723: (P.$$$ "(" |-- P.!!! (P.name -- Scan.optional (P.$$$ "output" >> K false) true --| P.$$$ ")")) wenzelm@5832: ("", true); wenzelm@5832: wenzelm@5832: val syntaxP = wenzelm@6723: OuterSyntax.command "syntax" "declare syntactic constants" K.thy_decl wenzelm@6727: (opt_mode -- Scan.repeat1 (P.const -- P.marg_comment) wenzelm@6727: >> (Toplevel.theory o uncurry IsarThy.add_modesyntax)); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* translations *) wenzelm@5832: wenzelm@5832: val trans_pat = wenzelm@6723: Scan.optional (P.$$$ "(" |-- P.!!! (P.xname --| P.$$$ ")")) "logic" -- P.string; wenzelm@5832: wenzelm@5832: fun trans_arrow toks = wenzelm@6723: (P.$$$ "=>" >> K Syntax.ParseRule || wenzelm@6723: P.$$$ "<=" >> K Syntax.PrintRule || wenzelm@6723: P.$$$ "==" >> K Syntax.ParsePrintRule) toks; wenzelm@5832: wenzelm@5832: val trans_line = wenzelm@6723: trans_pat -- P.!!! (trans_arrow -- trans_pat) wenzelm@5832: >> (fn (left, (arr, right)) => arr (left, right)); wenzelm@5832: wenzelm@5832: val translationsP = wenzelm@6723: OuterSyntax.command "translations" "declare syntax translation rules" K.thy_decl wenzelm@6727: (Scan.repeat1 (trans_line -- P.marg_comment) >> (Toplevel.theory o IsarThy.add_trrules)); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* axioms and definitions *) wenzelm@5832: wenzelm@5832: val axiomsP = wenzelm@6723: OuterSyntax.command "axioms" "state arbitrary propositions (axiomatic!)" K.thy_decl wenzelm@6727: (Scan.repeat1 (P.spec_name -- P.marg_comment) >> (Toplevel.theory o IsarThy.add_axioms)); wenzelm@5832: wenzelm@5832: val defsP = wenzelm@6723: OuterSyntax.command "defs" "define constants" K.thy_decl wenzelm@7603: (Scan.repeat1 (P.spec_name -- P.marg_comment) >> (Toplevel.theory o IsarThy.add_defs)); wenzelm@6370: wenzelm@6370: val constdefsP = wenzelm@6723: OuterSyntax.command "constdefs" "declare and define constants" K.thy_decl wenzelm@6727: (Scan.repeat1 ((P.const -- P.marg_comment) -- (P.term -- P.marg_comment)) wenzelm@6727: >> (Toplevel.theory o IsarThy.add_constdefs)); wenzelm@5832: wenzelm@5832: wenzelm@5914: (* theorems *) wenzelm@5914: wenzelm@6723: val facts = P.opt_thm_name "=" -- P.xthms1; wenzelm@5914: wenzelm@5914: val theoremsP = wenzelm@6723: OuterSyntax.command "theorems" "define theorems" K.thy_decl wenzelm@6727: (facts -- P.marg_comment >> (Toplevel.theory o IsarThy.have_theorems)); wenzelm@5914: wenzelm@5914: val lemmasP = wenzelm@6723: OuterSyntax.command "lemmas" "define lemmas" K.thy_decl wenzelm@6727: (facts -- P.marg_comment >> (Toplevel.theory o IsarThy.have_lemmas)); wenzelm@5914: wenzelm@5914: wenzelm@5832: (* name space entry path *) wenzelm@5832: wenzelm@5832: val globalP = wenzelm@6723: OuterSyntax.command "global" "disable prefixing of theory name" K.thy_decl wenzelm@8723: (P.marg_comment >> (Toplevel.theory o IsarThy.global_path)); wenzelm@5832: wenzelm@5832: val localP = wenzelm@6723: OuterSyntax.command "local" "enable prefixing of theory name" K.thy_decl wenzelm@8723: (P.marg_comment >> (Toplevel.theory o IsarThy.local_path)); wenzelm@8723: wenzelm@8723: val hideP = wenzelm@8723: OuterSyntax.command "hide" "hide names from given name space" K.thy_decl wenzelm@8723: (P.name -- Scan.repeat1 P.xname -- P.marg_comment >> (Toplevel.theory o IsarThy.hide_space)); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* use ML text *) wenzelm@5832: wenzelm@5832: val useP = wenzelm@6723: OuterSyntax.command "use" "eval ML text from file" K.diag wenzelm@6723: (P.name >> IsarCmd.use); wenzelm@5832: wenzelm@5832: val mlP = wenzelm@7616: OuterSyntax.command "ML" "eval ML text (diagnostic)" K.diag wenzelm@7891: (P.text >> IsarCmd.use_mltext true); wenzelm@7891: wenzelm@7891: val ml_commandP = wenzelm@7891: OuterSyntax.command "ML_command" "eval ML text" K.diag wenzelm@7891: (P.text >> IsarCmd.use_mltext false); wenzelm@7616: wenzelm@7616: val ml_setupP = wenzelm@7616: OuterSyntax.command "ML_setup" "eval ML text (may change theory)" K.thy_decl wenzelm@7616: (P.text >> IsarCmd.use_mltext_theory); wenzelm@5832: wenzelm@5832: val setupP = wenzelm@7616: OuterSyntax.command "setup" "apply ML theory setup" K.thy_decl wenzelm@8349: (P.text >> (Toplevel.theory o Context.use_setup)); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* translation functions *) wenzelm@5832: wenzelm@5832: val parse_ast_translationP = wenzelm@6723: OuterSyntax.command "parse_ast_translation" "install parse ast translation functions" K.thy_decl wenzelm@6723: (P.text >> (Toplevel.theory o IsarThy.parse_ast_translation)); wenzelm@5832: wenzelm@5832: val parse_translationP = wenzelm@6723: OuterSyntax.command "parse_translation" "install parse translation functions" K.thy_decl wenzelm@6723: (P.text >> (Toplevel.theory o IsarThy.parse_translation)); wenzelm@5832: wenzelm@5832: val print_translationP = wenzelm@6723: OuterSyntax.command "print_translation" "install print translation functions" K.thy_decl wenzelm@6723: (P.text >> (Toplevel.theory o IsarThy.print_translation)); wenzelm@5832: wenzelm@5832: val typed_print_translationP = wenzelm@6370: OuterSyntax.command "typed_print_translation" "install typed print translation functions" wenzelm@6723: K.thy_decl (P.text >> (Toplevel.theory o IsarThy.typed_print_translation)); wenzelm@5832: wenzelm@5832: val print_ast_translationP = wenzelm@6723: OuterSyntax.command "print_ast_translation" "install print ast translation functions" K.thy_decl wenzelm@6723: (P.text >> (Toplevel.theory o IsarThy.print_ast_translation)); wenzelm@5832: wenzelm@5832: val token_translationP = wenzelm@6723: OuterSyntax.command "token_translation" "install token translation functions" K.thy_decl wenzelm@6723: (P.text >> (Toplevel.theory o IsarThy.token_translation)); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* oracles *) wenzelm@5832: wenzelm@5832: val oracleP = wenzelm@6723: OuterSyntax.command "oracle" "install oracle" K.thy_decl wenzelm@7140: ((P.name --| P.$$$ "=") -- P.text -- P.marg_comment >> (Toplevel.theory o IsarThy.add_oracle)); wenzelm@5832: wenzelm@5832: wenzelm@5832: wenzelm@5832: (** proof commands **) wenzelm@5832: wenzelm@5832: (* statements *) wenzelm@5832: wenzelm@6936: fun statement f = (P.opt_thm_name ":" -- P.propp >> P.triple1) -- P.marg_comment >> f; wenzelm@5832: wenzelm@5832: val theoremP = wenzelm@6723: OuterSyntax.command "theorem" "state theorem" K.thy_goal wenzelm@5832: (statement IsarThy.theorem >> (fn f => Toplevel.print o Toplevel.theory_to_proof f)); wenzelm@5832: wenzelm@5832: val lemmaP = wenzelm@6723: OuterSyntax.command "lemma" "state lemma" K.thy_goal wenzelm@5832: (statement IsarThy.lemma >> (fn f => Toplevel.print o Toplevel.theory_to_proof f)); wenzelm@5832: wenzelm@5832: val showP = wenzelm@6723: OuterSyntax.command "show" "state local goal, solving current obligation" K.prf_goal wenzelm@5832: (statement IsarThy.show >> (fn f => Toplevel.print o Toplevel.proof f)); wenzelm@5832: wenzelm@5832: val haveP = wenzelm@6723: OuterSyntax.command "have" "state local goal" K.prf_goal wenzelm@5832: (statement IsarThy.have >> (fn f => Toplevel.print o Toplevel.proof f)); wenzelm@5832: wenzelm@6501: val thusP = wenzelm@6723: OuterSyntax.command "thus" "abbreviates \"then show\"" K.prf_goal wenzelm@6501: (statement IsarThy.thus >> (fn f => Toplevel.print o Toplevel.proof f)); wenzelm@6501: wenzelm@6501: val henceP = wenzelm@6723: OuterSyntax.command "hence" "abbreviates \"then have\"" K.prf_goal wenzelm@6501: (statement IsarThy.hence >> (fn f => Toplevel.print o Toplevel.proof f)); wenzelm@6501: wenzelm@5832: wenzelm@5914: (* facts *) wenzelm@5832: wenzelm@5832: val thenP = wenzelm@6723: OuterSyntax.command "then" "forward chaining" K.prf_chain wenzelm@6727: (P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.chain))); wenzelm@5832: wenzelm@5832: val fromP = wenzelm@6723: OuterSyntax.command "from" "forward chaining from given facts" K.prf_chain wenzelm@6727: (P.xthms1 -- P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.from_facts))); wenzelm@5914: wenzelm@6878: val withP = wenzelm@6878: OuterSyntax.command "with" "forward chaining from given and current facts" K.prf_chain wenzelm@6878: (P.xthms1 -- P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.with_facts))); wenzelm@6878: wenzelm@6773: val noteP = wenzelm@6723: OuterSyntax.command "note" "define facts" K.prf_decl wenzelm@6755: (facts -- P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.have_facts))); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* proof context *) wenzelm@5832: wenzelm@5832: val assumeP = wenzelm@6869: OuterSyntax.command "assume" "assume propositions" K.prf_asm wenzelm@7269: (P.and_list1 ((P.opt_thm_name ":" -- Scan.repeat1 P.propp >> P.triple1) -- P.marg_comment) wenzelm@6727: >> (Toplevel.print oo (Toplevel.proof o IsarThy.assume))); wenzelm@5832: wenzelm@6850: val presumeP = wenzelm@6869: OuterSyntax.command "presume" "assume propositions, to be established later" K.prf_asm wenzelm@7269: (P.and_list1 ((P.opt_thm_name ":" -- Scan.repeat1 P.propp >> P.triple1) -- P.marg_comment) wenzelm@6850: >> (Toplevel.print oo (Toplevel.proof o IsarThy.presume))); wenzelm@6850: wenzelm@6953: val defP = wenzelm@6953: OuterSyntax.command "def" "local definition" K.prf_asm wenzelm@6953: ((P.opt_thm_name ":" -- (P.name -- Scan.option (P.$$$ "::" |-- P.typ) -- wenzelm@6972: (P.$$$ "==" |-- P.termp)) >> P.triple1) -- P.marg_comment wenzelm@6953: >> (Toplevel.print oo (Toplevel.proof o IsarThy.local_def))); wenzelm@6953: wenzelm@5832: val fixP = wenzelm@6869: OuterSyntax.command "fix" "fix variables (Skolem constants)" K.prf_asm wenzelm@7415: (P.and_list1 (Scan.repeat1 P.name -- Scan.option (P.$$$ "::" |-- P.typ) -- P.marg_comment) wenzelm@6727: >> (Toplevel.print oo (Toplevel.proof o IsarThy.fix))); wenzelm@5832: wenzelm@5832: val letP = wenzelm@6723: OuterSyntax.command "let" "bind text variables" K.prf_decl wenzelm@8669: (P.and_list1 (P.enum1 "and" P.term -- (P.$$$ "=" |-- P.term) -- P.marg_comment) wenzelm@8615: >> (Toplevel.print oo (Toplevel.proof o IsarThy.let_bind))); wenzelm@5832: wenzelm@8370: val caseP = wenzelm@8370: OuterSyntax.command "case" "invoke local context" K.prf_asm wenzelm@8450: (P.xthm -- P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.invoke_case))); wenzelm@8370: wenzelm@5832: wenzelm@5832: (* proof structure *) wenzelm@5832: wenzelm@5832: val beginP = wenzelm@8896: OuterSyntax.command "{" "begin explicit proof block" K.prf_block wenzelm@5832: (Scan.succeed (Toplevel.print o Toplevel.proof IsarThy.begin_block)); wenzelm@5832: wenzelm@6687: val endP = wenzelm@8896: OuterSyntax.command "}" "end explicit proof block" K.prf_block wenzelm@6687: (Scan.succeed (Toplevel.print o Toplevel.proof IsarThy.end_block)); wenzelm@6687: wenzelm@5832: val nextP = wenzelm@6723: OuterSyntax.command "next" "enter next proof block" K.prf_block wenzelm@5832: (Scan.succeed (Toplevel.print o Toplevel.proof IsarThy.next_block)); wenzelm@5832: wenzelm@5832: wenzelm@5832: (* end proof *) wenzelm@5832: wenzelm@6404: val qedP = wenzelm@6735: OuterSyntax.command "qed" "conclude (sub-)proof" K.qed_block wenzelm@7002: (Scan.option (P.method -- P.interest) -- P.marg_comment >> IsarThy.qed); wenzelm@5832: wenzelm@6404: val terminal_proofP = wenzelm@6723: OuterSyntax.command "by" "terminal backward proof" K.qed wenzelm@7002: (P.method -- P.interest -- Scan.option (P.method -- P.interest) wenzelm@7002: -- P.marg_comment >> IsarThy.terminal_proof); wenzelm@6404: wenzelm@8966: val default_proofP = wenzelm@8966: OuterSyntax.command ".." "default proof" K.qed wenzelm@8966: (P.marg_comment >> IsarThy.default_proof); wenzelm@8966: wenzelm@6404: val immediate_proofP = wenzelm@6723: OuterSyntax.command "." "immediate proof" K.qed wenzelm@7002: (P.marg_comment >> IsarThy.immediate_proof); wenzelm@6404: wenzelm@8966: val done_proofP = wenzelm@8966: OuterSyntax.command "done" "done proof" K.qed wenzelm@8966: (P.marg_comment >> IsarThy.done_proof); wenzelm@5832: wenzelm@6888: val skip_proofP = wenzelm@7172: OuterSyntax.improper_command "sorry" "skip proof (quick-and-dirty mode only!)" K.qed wenzelm@7002: (P.marg_comment >> IsarThy.skip_proof); wenzelm@6888: wenzelm@8210: val forget_proofP = wenzelm@8521: OuterSyntax.command "oops" "forget proof" K.qed_global wenzelm@8210: (P.marg_comment >> IsarThy.forget_proof); wenzelm@8210: wenzelm@8210: wenzelm@5832: wenzelm@5832: (* proof steps *) wenzelm@5832: wenzelm@8165: val deferP = wenzelm@8681: OuterSyntax.command "defer" "shuffle internal proof state" K.prf_script wenzelm@8681: (Scan.option P.nat -- P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.defer))); wenzelm@8165: wenzelm@8165: val preferP = wenzelm@8681: OuterSyntax.command "prefer" "shuffle internal proof state" K.prf_script wenzelm@8681: (P.nat -- P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.prefer))); wenzelm@8165: wenzelm@6850: val applyP = wenzelm@8681: OuterSyntax.command "apply" "initial refinement step (unstructured)" K.prf_script wenzelm@8681: (P.method -- P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.apply))); wenzelm@5832: wenzelm@8235: val apply_endP = wenzelm@8681: OuterSyntax.command "apply_end" "terminal refinement (unstructured)" K.prf_script wenzelm@8681: (P.method -- P.marg_comment >> (Toplevel.print oo (Toplevel.proof o IsarThy.apply_end))); wenzelm@5832: wenzelm@6404: val proofP = wenzelm@6723: OuterSyntax.command "proof" "backward proof" K.prf_block wenzelm@7002: (P.interest -- Scan.option (P.method -- P.interest) -- P.marg_comment wenzelm@6727: >> (Toplevel.print oo (Toplevel.proof o IsarThy.proof))); wenzelm@5832: wenzelm@5832: wenzelm@6773: (* calculational proof commands *) wenzelm@6773: wenzelm@6878: val calc_args = wenzelm@6878: Scan.option (P.$$$ "(" |-- P.!!! ((P.xthms1 --| P.$$$ ")") -- P.interest)); wenzelm@6878: wenzelm@6773: val alsoP = wenzelm@8562: OuterSyntax.command "also" "combine calculation and current facts" K.prf_decl wenzelm@6878: (calc_args -- P.marg_comment >> IsarThy.also); wenzelm@6773: wenzelm@6773: val finallyP = wenzelm@8562: OuterSyntax.command "finally" "combine calculation and current facts, exhibit result" K.prf_chain wenzelm@6878: (calc_args -- P.marg_comment >> IsarThy.finally); wenzelm@6773: wenzelm@8562: val moreoverP = wenzelm@8562: OuterSyntax.command "moreover" "augment calculation by current facts" K.prf_decl wenzelm@8562: (P.marg_comment >> IsarThy.moreover); wenzelm@8562: wenzelm@8588: val ultimatelyP = wenzelm@8588: OuterSyntax.command "ultimately" "augment calculation by current facts, exhibit result" wenzelm@8588: K.prf_chain (P.marg_comment >> IsarThy.ultimately); wenzelm@8588: wenzelm@6773: wenzelm@6742: (* proof navigation *) wenzelm@5944: wenzelm@5832: val backP = wenzelm@8235: OuterSyntax.command "back" "backtracking of proof command" K.prf_script wenzelm@7368: (Scan.optional (P.$$$ "!" >> K true) false >> wenzelm@7368: (Toplevel.print oo (Toplevel.proof o ProofHistory.back))); wenzelm@5832: wenzelm@5832: wenzelm@6742: (* history *) wenzelm@6742: wenzelm@6742: val cannot_undoP = wenzelm@6742: OuterSyntax.improper_command "cannot_undo" "report 'cannot undo' error message" K.control wenzelm@7269: (P.name >> IsarCmd.cannot_undo); wenzelm@6742: wenzelm@7733: val clear_undosP = wenzelm@7733: OuterSyntax.improper_command "clear_undos" "clear theory-level undo information" K.control wenzelm@7733: (P.nat >> IsarCmd.clear_undos_theory); wenzelm@6742: wenzelm@6742: val redoP = wenzelm@6742: OuterSyntax.improper_command "redo" "redo last command" K.control wenzelm@6742: (Scan.succeed (Toplevel.print o IsarCmd.redo)); wenzelm@6742: wenzelm@6742: val undos_proofP = wenzelm@6742: OuterSyntax.improper_command "undos_proof" "undo last proof commands" K.control wenzelm@6742: (P.nat >> (Toplevel.print oo IsarCmd.undos_proof)); wenzelm@6742: wenzelm@6742: val undoP = wenzelm@6742: OuterSyntax.improper_command "undo" "undo last command" K.control wenzelm@8454: (Scan.succeed (Toplevel.print o IsarCmd.undo)); wenzelm@6742: wenzelm@8500: val killP = wenzelm@8500: OuterSyntax.improper_command "kill" "kill current history node" K.control wenzelm@8500: (Scan.succeed (Toplevel.print o IsarCmd.kill)); wenzelm@8500: wenzelm@6742: wenzelm@5832: wenzelm@5832: (** diagnostic commands (for interactive mode only) **) wenzelm@5832: wenzelm@8464: val opt_modes = Scan.optional (P.$$$ "(" |-- P.!!! (Scan.repeat1 P.xname --| P.$$$ ")")) []; wenzelm@8464: wenzelm@8464: wenzelm@7124: val pretty_setmarginP = wenzelm@7124: OuterSyntax.improper_command "pretty_setmargin" "change default margin for pretty printing" wenzelm@7124: K.diag (P.nat >> IsarCmd.pretty_setmargin); wenzelm@7124: wenzelm@5832: val print_commandsP = wenzelm@6723: OuterSyntax.improper_command "help" "print outer syntax (global)" K.diag wenzelm@7368: (Scan.succeed OuterSyntax.print_help); wenzelm@5832: wenzelm@7308: val print_contextP = wenzelm@7308: OuterSyntax.improper_command "print_context" "print theory context name" K.diag wenzelm@7308: (Scan.succeed IsarCmd.print_context); wenzelm@7308: wenzelm@5832: val print_theoryP = wenzelm@6723: OuterSyntax.improper_command "print_theory" "print logical theory contents (verbose!)" K.diag wenzelm@5832: (Scan.succeed IsarCmd.print_theory); wenzelm@5832: wenzelm@5832: val print_syntaxP = wenzelm@6723: OuterSyntax.improper_command "print_syntax" "print inner syntax of theory (verbose!)" K.diag wenzelm@5832: (Scan.succeed IsarCmd.print_syntax); wenzelm@5832: wenzelm@5881: val print_theoremsP = wenzelm@6723: OuterSyntax.improper_command "print_theorems" "print theorems known in this theory" K.diag wenzelm@5881: (Scan.succeed IsarCmd.print_theorems); wenzelm@5881: wenzelm@5832: val print_attributesP = wenzelm@6723: OuterSyntax.improper_command "print_attributes" "print attributes known in this theory" K.diag wenzelm@5832: (Scan.succeed IsarCmd.print_attributes); wenzelm@5832: wenzelm@5832: val print_methodsP = wenzelm@6723: OuterSyntax.improper_command "print_methods" "print methods known in this theory" K.diag wenzelm@5832: (Scan.succeed IsarCmd.print_methods); wenzelm@5832: wenzelm@7616: val thms_containingP = wenzelm@7616: OuterSyntax.improper_command "thms_containing" "print theorems containing all given constants" wenzelm@7616: K.diag (Scan.repeat P.xname >> IsarCmd.print_thms_containing); wenzelm@7616: wenzelm@5832: val print_bindsP = wenzelm@6723: OuterSyntax.improper_command "print_binds" "print term bindings of proof context" K.diag wenzelm@5832: (Scan.succeed IsarCmd.print_binds); wenzelm@5832: wenzelm@5832: val print_lthmsP = wenzelm@8370: OuterSyntax.improper_command "print_facts" "print facts of proof context" K.diag wenzelm@5832: (Scan.succeed IsarCmd.print_lthms); wenzelm@5832: wenzelm@8370: val print_casesP = wenzelm@8370: OuterSyntax.improper_command "print_cases" "print cases of proof context" K.diag wenzelm@8370: (Scan.succeed IsarCmd.print_cases); wenzelm@8370: wenzelm@5896: val print_thmsP = wenzelm@8464: OuterSyntax.improper_command "thm" "print theorems" K.diag wenzelm@8464: (opt_modes -- P.xthms1 >> IsarCmd.print_thms); wenzelm@5832: wenzelm@5832: val print_propP = wenzelm@6723: OuterSyntax.improper_command "prop" "read and print proposition" K.diag wenzelm@8464: (opt_modes -- P.term >> IsarCmd.print_prop); wenzelm@5832: wenzelm@5832: val print_termP = wenzelm@6723: OuterSyntax.improper_command "term" "read and print term" K.diag wenzelm@8464: (opt_modes -- P.term >> IsarCmd.print_term); wenzelm@5832: wenzelm@5832: val print_typeP = wenzelm@6723: OuterSyntax.improper_command "typ" "read and print type" K.diag wenzelm@8464: (opt_modes -- P.typ >> IsarCmd.print_type); wenzelm@5832: wenzelm@5832: wenzelm@5832: wenzelm@5832: (** system commands (for interactive mode only) **) wenzelm@5832: wenzelm@5832: val cdP = wenzelm@8650: OuterSyntax.improper_command "cd" "change current working directory" K.diag wenzelm@6723: (P.name >> IsarCmd.cd); wenzelm@5832: wenzelm@5832: val pwdP = wenzelm@6723: OuterSyntax.improper_command "pwd" "print current working directory" K.diag wenzelm@5832: (Scan.succeed IsarCmd.pwd); wenzelm@5832: wenzelm@5832: val use_thyP = wenzelm@6723: OuterSyntax.improper_command "use_thy" "use theory file" K.diag wenzelm@6723: (P.name >> IsarCmd.use_thy); wenzelm@5832: wenzelm@6694: val use_thy_onlyP = wenzelm@7102: OuterSyntax.improper_command "use_thy_only" "use theory file only, ignoring associated ML" wenzelm@7102: K.diag (P.name >> IsarCmd.use_thy_only); wenzelm@6694: wenzelm@6196: val update_thyP = wenzelm@6723: OuterSyntax.improper_command "update_thy" "update theory file" K.diag wenzelm@6723: (P.name >> IsarCmd.update_thy); wenzelm@5832: wenzelm@7102: val update_thy_onlyP = wenzelm@7102: OuterSyntax.improper_command "update_thy_only" "update theory file, ignoring associated ML" wenzelm@7885: K.diag (P.name >> IsarCmd.update_thy_only); wenzelm@7102: wenzelm@7102: val touch_thyP = wenzelm@7102: OuterSyntax.improper_command "touch_thy" "outdate theory, including descendants" K.diag wenzelm@7102: (P.name >> IsarCmd.touch_thy); wenzelm@7102: wenzelm@7102: val touch_all_thysP = wenzelm@7102: OuterSyntax.improper_command "touch_all_thys" "outdate all non-finished theories" K.diag wenzelm@7102: (Scan.succeed IsarCmd.touch_all_thys); wenzelm@7102: wenzelm@7908: val touch_child_thysP = wenzelm@7908: OuterSyntax.improper_command "touch_child_thys" "outdate child theories" K.diag wenzelm@7908: (P.name >> IsarCmd.touch_child_thys); wenzelm@7908: wenzelm@7102: val remove_thyP = wenzelm@7102: OuterSyntax.improper_command "remove_thy" "remove theory from loader database" K.diag wenzelm@7102: (P.name >> IsarCmd.remove_thy); wenzelm@7102: wenzelm@7931: val kill_thyP = wenzelm@7931: OuterSyntax.improper_command "kill_thy" "kill theory -- try to remove from loader database" wenzelm@7931: K.diag (P.name >> IsarCmd.kill_thy); wenzelm@7931: wenzelm@5832: val prP = wenzelm@8886: OuterSyntax.improper_command "pr" "print current proof state (if present)" K.diag wenzelm@8464: (opt_modes -- Scan.option P.nat >> IsarCmd.pr); wenzelm@7199: wenzelm@7222: val disable_prP = wenzelm@7222: OuterSyntax.improper_command "disable_pr" "disable printing of toplevel state" K.diag wenzelm@8454: (Scan.succeed IsarCmd.disable_pr); wenzelm@5832: wenzelm@7222: val enable_prP = wenzelm@7222: OuterSyntax.improper_command "enable_pr" "enable printing of toplevel state" K.diag wenzelm@8454: (Scan.succeed IsarCmd.enable_pr); wenzelm@7222: wenzelm@5832: val commitP = wenzelm@6723: OuterSyntax.improper_command "commit" "commit current session to ML database" K.diag wenzelm@7931: (P.opt_unit >> (K IsarCmd.use_commit)); wenzelm@5832: wenzelm@5832: val quitP = wenzelm@6723: OuterSyntax.improper_command "quit" "quit Isabelle" K.control wenzelm@7931: (P.opt_unit >> (K IsarCmd.quit)); wenzelm@5832: wenzelm@5832: val exitP = wenzelm@6723: OuterSyntax.improper_command "exit" "exit Isar loop" K.control wenzelm@5832: (Scan.succeed IsarCmd.exit); wenzelm@5832: wenzelm@7102: val init_toplevelP = wenzelm@7102: OuterSyntax.improper_command "init_toplevel" "restart Isar toplevel loop" K.control wenzelm@7102: (Scan.succeed IsarCmd.init_toplevel); wenzelm@5991: wenzelm@7462: val welcomeP = wenzelm@8678: OuterSyntax.improper_command "welcome" "print welcome message" K.diag wenzelm@7462: (Scan.succeed IsarCmd.welcome); wenzelm@7462: wenzelm@5832: wenzelm@5832: wenzelm@5832: (** the Pure outer syntax **) wenzelm@5832: wenzelm@5832: (*keep keywords consistent with the parsers, including those in wenzelm@5832: outer_parse.ML, otherwise be prepared for unexpected errors*) wenzelm@5832: wenzelm@5832: val keywords = wenzelm@7415: ["!", "!!", "%", "%%", "(", ")", "+", ",", "--", ":", "::", ";", "<", wenzelm@8669: "<=", "=", "==", "=>", "?", "[", "]", "and", "binder", "concl", wenzelm@8896: "files", "in", "infixl", "infixr", "is", "output", "|"]; wenzelm@5832: wenzelm@5832: val parsers = [ wenzelm@5832: (*theory structure*) wenzelm@8500: theoryP, end_excursionP, contextP, wenzelm@7775: (*markup commands*) wenzelm@7733: headerP, chapterP, sectionP, subsectionP, subsubsectionP, textP, wenzelm@7862: text_rawP, sectP, subsectP, subsubsectP, txtP, txt_rawP, wenzelm@5832: (*theory sections*) wenzelm@7172: classesP, classrelP, defaultsortP, typedeclP, typeabbrP, nontermP, wenzelm@8227: aritiesP, judgmentP, constsP, syntaxP, translationsP, axiomsP, wenzelm@8723: defsP, constdefsP, theoremsP, lemmasP, globalP, localP, hideP, useP, wenzelm@8723: mlP, ml_commandP, ml_setupP, setupP, parse_ast_translationP, wenzelm@7891: parse_translationP, print_translationP, typed_print_translationP, wenzelm@7616: print_ast_translationP, token_translationP, oracleP, wenzelm@5832: (*proof commands*) wenzelm@6850: theoremP, lemmaP, showP, haveP, thusP, henceP, assumeP, presumeP, wenzelm@8464: defP, fixP, letP, caseP, thenP, fromP, withP, noteP, beginP, endP, wenzelm@8966: nextP, qedP, terminal_proofP, default_proofP, immediate_proofP, wenzelm@8966: done_proofP, skip_proofP, forget_proofP, deferP, preferP, applyP, wenzelm@8966: apply_endP, proofP, alsoP, finallyP, moreoverP, ultimatelyP, backP, wenzelm@8588: cannot_undoP, clear_undosP, redoP, undos_proofP, undoP, killP, wenzelm@5832: (*diagnostic commands*) wenzelm@7308: pretty_setmarginP, print_commandsP, print_contextP, print_theoryP, wenzelm@7616: print_syntaxP, print_theoremsP, print_attributesP, print_methodsP, wenzelm@8370: thms_containingP, print_bindsP, print_lthmsP, print_casesP, wenzelm@8370: print_thmsP, print_propP, print_termP, print_typeP, wenzelm@5832: (*system commands*) wenzelm@7102: cdP, pwdP, use_thyP, use_thy_onlyP, update_thyP, update_thy_onlyP, wenzelm@7931: touch_thyP, touch_all_thysP, touch_child_thysP, remove_thyP, wenzelm@7931: kill_thyP, prP, disable_prP, enable_prP, commitP, quitP, exitP, wenzelm@7931: init_toplevelP, welcomeP]; wenzelm@5832: wenzelm@5832: wenzelm@5832: end; wenzelm@5832: wenzelm@5832: wenzelm@6196: (*install the Pure outer syntax*) wenzelm@5832: OuterSyntax.add_keywords IsarSyn.keywords; wenzelm@5832: OuterSyntax.add_parsers IsarSyn.parsers;