Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/Pure/   (Beweissystem Isabelle Version 2025-1©)  Datei vom 16.11.2025 mit Größe 61 kB image not shown  

Quellcode-Bibliothek Pure.thy

  Sprache: Isabelle
 

(*  Title:      Pure/Pure.thy
    Author:     Makarius

The Pure theory, with definitions of Isar commands and some lemmas.
*)


theory Pure
keywords
    "!!" "!" "+" ":" ";" "<" "<=" "==" "=>" "?" "[" "―" "" "" "" ""
    "" "]" "binder" "by" "congproc" "identifier" "in" "infix" "infixl" "infixr" "is" "open"
    "output" "overloaded" "passive" "pervasive" "premises" "structure" "unchecked" "weak_congproc"
  and "private" "qualified" :: before_command
  and "assumes" "constrains" "defines" "fixes" "for" "if" "includes" "notes" "rewrites"
    "obtains" "shows" "when" "where" "|" :: quasi_command
  and "text" "txt" :: document_body
  and "text_raw" :: document_raw
  and "default_sort" :: thy_decl
  and "typedecl" "nonterminal" "judgment" "consts" "syntax" "no_syntax" "syntax_consts"
    "syntax_types" "translations" "no_translations" "type_notation" "no_type_notation" "notation"
    "no_notation" "alias" "type_alias" "declare" "hide_class" "hide_type" "hide_const"
    "hide_fact" :: thy_decl
  and "type_synonym" "definition" "abbreviation" "lemmas" :: thy_defn
  and "axiomatization" :: thy_stmt
  and "external_file" "bibtex_file" "ROOTS_file" :: thy_load
  and "generate_file" :: thy_decl
  and "export_generated_files" :: diag
  and "scala_build_generated_files" :: diag
  and "compile_generated_files" :: diag and "external_files" "export_files" "export_prefix"
  and "export_classpath"
  and "ML_file" "ML_file_debug" "ML_file_no_debug" :: thy_load % "ML"
  and "SML_file" "SML_file_debug" "SML_file_no_debug" :: thy_load % "ML"
  and "SML_import" "SML_export" "ML_export" :: thy_decl % "ML"
  and "ML_prf" :: prf_decl % "proof"  (* FIXME % "ML" ?? *)
  and "ML_val" "ML_command" :: diag % "ML"
  and "simproc_setup" :: thy_decl % "ML"
  and "setup" "local_setup" "attribute_setup" "method_setup"
    "declaration" "syntax_declaration"
    "parse_ast_translation" "parse_translation" "print_translation"
    "typed_print_translation" "print_ast_translation" "oracle" :: thy_decl % "ML"
  and "bundle" "open_bundle" :: thy_decl_block
  and "unbundle" :: thy_decl
  and "include" "including" :: prf_decl
  and "print_bundles" :: diag
  and "context" "locale" "experiment" :: thy_decl_block
  and "interpret" :: prf_goal % "proof"
  and "interpretation" "global_interpretation" "sublocale" :: thy_goal
  and "class" :: thy_decl_block
  and "subclass" :: thy_goal
  and "instantiation" :: thy_decl_block
  and "instance" :: thy_goal
  and "overloading" :: thy_decl_block
  and "opening" :: quasi_command
  and "code_datatype" :: thy_decl
  and "theorem" "lemma" "corollary" "proposition" :: thy_goal_stmt
  and "schematic_goal" :: thy_goal_stmt
  and "notepad" :: thy_decl_block
  and "have" :: prf_goal % "proof"
  and "hence" :: prf_goal % "proof"
  and "show" :: prf_asm_goal % "proof"
  and "thus" :: prf_asm_goal % "proof"
  and "then" "from" "with" :: prf_chain % "proof"
  and "note" :: prf_decl % "proof"
  and "supply" :: prf_script % "proof"
  and "using" "unfolding" :: prf_decl % "proof"
  and "fix" "assume" "presume" "define" :: prf_asm % "proof"
  and "consider" :: prf_goal % "proof"
  and "obtain" :: prf_asm_goal % "proof"
  and "let" "write" :: prf_decl % "proof"
  and "case" :: prf_asm % "proof"
  and "{" :: prf_open % "proof"
  and "}" :: prf_close % "proof"
  and "next" :: next_block % "proof"
  and "qed" :: qed_block % "proof"
  and "by" ".." "." "sorry" "🍋" :: "qed" % "proof"
  and "done" :: "qed_script" % "proof"
  and "oops" :: qed_global % "proof"
  and "defer" "prefer" "apply" :: prf_script % "proof"
  and "apply_end" :: prf_script % "proof"
  and "subgoal" :: prf_script_goal % "proof"
  and "proof" :: prf_block % "proof"
  and "also" "moreover" :: prf_decl % "proof"
  and "finally" "ultimately" :: prf_chain % "proof"
  and "back" :: prf_script % "proof"
  and "help" "print_commands" "print_options" "print_context" "print_theory"
    "print_definitions" "print_syntax" "print_abbrevs" "print_defn_rules"
    "print_theorems" "print_locales" "print_classes" "print_locale"
    "print_interps" "print_attributes"
    "print_simpset" "print_rules" "print_trans_rules" "print_methods"
    "print_antiquotations" "print_ML_antiquotations" "thy_deps"
    "locale_deps" "class_deps" "thm_deps" "thm_oracles" "print_term_bindings"
    "print_facts" "print_cases" "print_statement" "thm" "prf" "full_prf"
    "prop" "term" "typ" "print_codesetup" "print_context_tracing" "unused_thms" :: diag
  and "print_state" :: diag
  and "welcome" :: diag
  and "end" :: thy_end
  and "realizers" :: thy_decl
  and "realizability" :: thy_decl
  and "extract_type" "extract" :: thy_decl
  and "adhoc_overloading" "no_adhoc_overloading" :: thy_decl
  and "find_theorems" "find_consts" :: diag
  and "named_theorems" :: thy_decl
abbrevs "\\tag" = "tag "
  and "===>" = "===>" (*prevent replacement of very long arrows*)
  and "--->" = "←-"
  and "hence" "thus" "default_sort" "simproc_setup" "apply_end" "realizers" "realizability" = ""
  and "hence" = "then have"
  and "thus" = "then show"
begin

section Isar commands

subsection Other files

ML
local
  val _ =
    Outer_Syntax.command 🍋external_file "formal dependency on external file"
      (Resources.provide_parse_file >> (fn get_file => Toplevel.theory (#2 o get_file)));

  val _ =
    Outer_Syntax.command 🍋bibtex_file "check bibtex database file in Prover IDE"
      (Resources.provide_parse_file >> (fn get_file =>
        Toplevel.theory (fn thy =>
          let
            val ({lines, pos, ...}, thy') = get_file thy;
            val _ = Bibtex.check_database_output pos (cat_lines lines);
          in thy' end)));

  val _ =
    Outer_Syntax.command 🍋ROOTS_file "session ROOTS file"
      (Resources.provide_parse_file >> (fn get_file =>
        Toplevel.theory (fn thy =>
          let
            val ({src_path, lines, pos = pos0, ...}, thy') = get_file thy;
            val ctxt = Proof_Context.init_global thy';
            val dir = Path.dir (Path.expand (Resources.master_directory thy' + src_path));
            val _ =
              (lines, pos0) |-> fold (fn line => fn pos1 =>
                let
                  val pos2 = Position.symbol_explode line pos1;
                  val range = Position.range (pos1, pos2);
                  val source = Input.source true line range;
                  val _ =
                    if line = "  then ()
 else if String.isPrefix "#" line then
 Context_Position.report ctxt (#1 range) Markup.comment
 else
 (ignore (Resources.check_session_dir ctxt (SOME dir) source)
 handle ERROR msg => Output.error_message msg);
 in pos2 |> Position.symbol "\n" end);
 in thy' end)));

 val _ =
 Outer_Syntax.local_theory 🍋generate_file
 "generate source file, with antiquotations"
 (Parse.path_binding -- (🍋= |-- Parse.embedded_input)
 >> Generated_Files.generate_file_cmd);


 val files_in_theory =
 (Parse.underscore >> K [] || Scan.repeat1 Parse.path_binding) --
 Scan.option (🍋( |-- Parse.!!! (🍋in |-- Parse.theory_name --| 🍋)));

 val _ =
 Outer_Syntax.command 🍋export_generated_files
 "export generated files from given theories"
 (Parse.and_list1 files_in_theory >> (fn args =>
 Toplevel.keep (fn st =>
 Generated_Files.export_generated_files_cmd (Toplevel.context_of st) args)));


 val base_dir =
 Scan.optional (🍋( |--
 Parse.!!! (🍋in |-- Parse.path_input --| 🍋))) (Input.string "");

 val external_files = Scan.repeat1 Parse.path_input -- base_dir;

 val exe = Parse.reserved "exe" >> K true || Parse.reserved "executable" >> K false;
 val executable = 🍋( |-- Parse.!!! (exe --| 🍋)) >> SOME || Scan.succeed NONE;

 val export_files = Scan.repeat1 Parse.path_binding -- executable;

 val _ =
 Outer_Syntax.command 🍋compile_generated_files
 "compile generated files and export results"
 (Parse.and_list files_in_theory --
 Scan.optional (🍋external_files |-- Parse.!!! (Parse.and_list1 external_files)) [] --
 Scan.optional (🍋export_files |-- Parse.!!! (Parse.and_list1 export_files)) [] --
 Scan.optional (🍋export_prefix |-- Parse.path_binding) ("", Position.none) --
 (Parse.where_ |-- Parse.!!! Parse.ML_source)
 >> (fn ((((args, external), export), export_prefix), source) =>
 Toplevel.keep (fn st =>
 Generated_Files.compile_generated_files_cmd
 (Toplevel.context_of st) args external export export_prefix source)));

 val _ =
 Outer_Syntax.command 🍋scala_build_generated_files
 "build and export Isabelle/Scala/Java module"
 (Parse.and_list files_in_theory --
 Scan.optional (🍋external_files |-- Parse.!!! (Parse.and_list1 external_files)) []
 >> (fn (args, external) =>
 Toplevel.keep (fn st =>
 Generated_Files.scala_build_generated_files_cmd
 (Toplevel.context_of st) args external)));
  end

external_file ROOT0.ML
external_file ROOT.ML


subsection Embedded ML text

ML 
 

  semi = Scan.option 🍋;;

  _ =
 Outer_Syntax.command 🍋ML_file "read and evaluate Isabelle/ML file"
 (Resources.parse_file --| semi >> ML_File.ML NONE);

  _ =
 Outer_Syntax.command 🍋ML_file_debug
 "read and evaluate Isabelle/ML file (with debugger information)"
 (Resources.parse_file --| semi >> ML_File.ML (SOME true));

  _ =
 Outer_Syntax.command 🍋ML_file_no_debug
 "read and evaluate Isabelle/ML file (no debugger information)"
 (Resources.parse_file --| semi >> ML_File.ML (SOME false));

  _ =
 Outer_Syntax.command 🍋SML_file "read and evaluate Standard ML file"
 (Resources.parse_file --| semi >> ML_File.SML NONE);

  _ =
 Outer_Syntax.command 🍋SML_file_debug
 "read and evaluate Standard ML file (with debugger information)"
 (Resources.parse_file --| semi >> ML_File.SML (SOME true));

  _ =
 Outer_Syntax.command 🍋SML_file_no_debug
 "read and evaluate Standard ML file (no debugger information)"
 (Resources.parse_file --| semi >> ML_File.SML (SOME false));

  _ =
 Outer_Syntax.command 🍋SML_export "evaluate SML within Isabelle/ML environment"
 (Parse.ML_source >> (fn source =>
 let
 val flags: ML_Compiler.flags =
 {environment = ML_Env.SML_export, redirect = false, verbose = true, catch_all = true,
 debug = NONE, writeln = writeln, warning = warning};
 in
 Toplevel.theory
 (Context.theory_map (ML_Context.exec (fn () => ML_Context.eval_source flags source)))
 end));

  _ =
 Outer_Syntax.command 🍋SML_import "evaluate Isabelle/ML within SML environment"
 (Parse.ML_source >> (fn source =>
 let
 val flags: ML_Compiler.flags =
 {environment = ML_Env.SML_import, redirect = false, verbose = true, catch_all = true,
 debug = NONE, writeln = writeln, warning = warning};
 in
 Toplevel.generic_theory
 (ML_Context.exec (fn () => ML_Context.eval_source flags source) #>
 Local_Theory.propagate_ml_env)
 end));

  _ =
 Outer_Syntax.command ("ML_export", 🍋)
 "ML text within theory or local theory, and export to bootstrap environment"
 (Parse.ML_source >> (fn source =>
 Toplevel.generic_theory (fn context =>
 context
 |> Config.put_generic ML_Env.ML_environment ML_Env.Isabelle
 |> Config.put_generic ML_Env.ML_write_global true
 |> ML_Context.exec (fn () =>
 ML_Context.eval_source (ML_Compiler.verbose true ML_Compiler.flags) source)
 |> Config.restore_generic ML_Env.ML_write_global context
 |> Config.restore_generic ML_Env.ML_environment context
 |> Local_Theory.propagate_ml_env)));

  _ =
 Outer_Syntax.command 🍋ML_prf "ML text within proof"
 (Parse.ML_source >> (fn source =>
 Toplevel.proof (Proof.map_context (Context.proof_map
 (ML_Context.exec (fn () =>
 ML_Context.eval_source (ML_Compiler.verbose true ML_Compiler.flags) source))) #>
 Proof.propagate_ml_env)));

  _ =
 Outer_Syntax.command 🍋ML_val "diagnostic ML text"
 (Parse.ML_source >> Isar_Cmd.ml_diag true);

  _ =
 Outer_Syntax.command 🍋ML_command "diagnostic ML text (silent)"
 (Parse.ML_source >> Isar_Cmd.ml_diag false);

  _ =
 Outer_Syntax.command 🍋setup "ML setup for global theory"
 (Parse.ML_source >> (Toplevel.theory o Isar_Cmd.setup));

  _ =
 Outer_Syntax.local_theory 🍋local_setup "ML setup for local theory"
 (Parse.ML_source >> Isar_Cmd.local_setup);

  _ =
 Outer_Syntax.command 🍋oracle "declare oracle"
 (Parse.range Parse.name -- Parse.!!! (🍋= |-- Parse.ML_source) >>
 (fn (x, y) => Toplevel.theory (Isar_Cmd.oracle x y)));

  _ =
 Outer_Syntax.local_theory 🍋attribute_setup "define attribute in ML"
 (Parse.name_position --
 Parse.!!! (🍋= |-- Parse.ML_source -- Scan.optional Parse.embedded "")
 >> (fn (name, (txt, cmt)) => Attrib.attribute_setup name txt cmt));

  _ =
 Outer_Syntax.local_theory 🍋method_setup "define proof method in ML"
 (Parse.name_position --
 Parse.!!! (🍋= |-- Parse.ML_source -- Scan.optional Parse.embedded "")
 >> (fn (name, (txt, cmt)) => Method.method_setup name txt cmt));

  _ =
 Outer_Syntax.local_theory 🍋declaration "generic ML declaration"
 (Parse.opt_keyword "pervasive" -- Parse.ML_source
 >> (fn (pervasive, txt) => Isar_Cmd.declaration {syntax = false, pervasive = pervasive} txt));

  _ =
 Outer_Syntax.local_theory 🍋syntax_declaration "generic ML syntax declaration"
 (Parse.opt_keyword "pervasive" -- Parse.ML_source
 >> (fn (pervasive, txt) => Isar_Cmd.declaration {syntax = true, pervasive = pervasive} txt));

  _ =
 Outer_Syntax.local_theory 🍋simproc_setup "define simproc in ML"
 Simplifier.simproc_setup_command;

  end



subsection Theory commands

subsubsection Sorts and types

ML 
 

  _ =
 Outer_Syntax.local_theory 🍋default_sort
 "declare default sort for explicit type variables"
 (Parse.sort >> (fn s => fn lthy => Local_Theory.set_defsort (Syntax.read_sort lthy s) lthy));

  _ =
 Outer_Syntax.local_theory 🍋typedecl "type declaration"
 (Parse.type_args -- Parse.binding -- Parse.opt_mixfix
 >> (fn ((args, a), mx) =>
 Typedecl.typedecl {final = true} (a, map (rpair dummyS) args, mx) #> snd));

  _ =
 Outer_Syntax.local_theory 🍋type_synonym "declare type abbreviation"
 (Parse.type_args -- Parse.binding --
 (🍋= |-- Parse.!!! (Parse.typ -- Parse.opt_mixfix'))
 >> (fn ((args, a), (rhs, mx)) => snd o Typedecl.abbrev_cmd (a, args, mx) rhs));

  end



subsubsection Consts

ML 
 

  _ =
 Outer_Syntax.command 🍋judgment "declare object-logic judgment"
 (Parse.const_binding >> (Toplevel.theory o Object_Logic.add_judgment_cmd));

  _ =
 Outer_Syntax.command 🍋consts "declare constants"
 (Scan.repeat1 Parse.const_binding >> (Toplevel.theory o Sign.add_consts_cmd));

  end



subsubsection Syntax and translations

ML 
 

  _ =
 Outer_Syntax.command 🍋nonterminal
 "declare syntactic type constructors (grammar nonterminal symbols)"
 (Parse.and_list1 Parse.binding >> (Toplevel.theory o Sign.add_nonterminals_global));

  _ =
 Outer_Syntax.local_theory 🍋syntax "add raw syntax clauses"
 (Parse.syntax_mode -- Scan.repeat1 Parse.const_decl
 >> uncurry (Local_Theory.syntax_cmd true));

  _ =
 Outer_Syntax.local_theory 🍋no_syntax "delete raw syntax clauses"
 (Parse.syntax_mode -- Scan.repeat1 Parse.const_decl
 >> uncurry (Local_Theory.syntax_cmd false));

  syntax_consts =
 Parse.and_list1
 ((Scan.repeat1 Parse.name_position --| (🍋 || 🍋==)) --
 Parse.!!! (Scan.repeat1 Parse.name_position));

  _ =
 Outer_Syntax.local_theory 🍋syntax_consts "declare syntax const dependencies"
 (syntax_consts >> Isar_Cmd.syntax_consts);

  _ =
 Outer_Syntax.local_theory 🍋syntax_types "declare syntax const dependencies (type names)"
 (syntax_consts >> Isar_Cmd.syntax_types);

  trans_pat =
 Scan.optional
 (🍋( |-- Parse.!!! (Parse.inner_syntax Parse.name --| 🍋))) "logic"
 -- Parse.inner_syntax Parse.string;

  trans_arrow toks =
 ((🍋 || 🍋=>) >> K Syntax.Parse_Rule ||
 (🍋 || 🍋<=\) >> K Syntax.Print_Rule ||
 (🍋 || 🍋==) >> K Syntax.Parse_Print_Rule) toks;

  trans_line =
 trans_pat -- Parse.!!! (trans_arrow -- trans_pat)
 >> (fn (left, (arr, right)) => arr (left, right));

  _ =
 Outer_Syntax.local_theory 🍋translations "add syntax translation rules"
 (Scan.repeat1 trans_line >> Local_Theory.translations_cmd true);

  _ =
 Outer_Syntax.local_theory 🍋no_translations "delete syntax translation rules"
 (Scan.repeat1 trans_line >> Local_Theory.translations_cmd false);

  end



subsubsection Translation functions

ML 
 

  _ =
 Outer_Syntax.command 🍋parse_ast_translation
 "install parse ast translation functions"
 (Parse.ML_source >> (Toplevel.theory o Isar_Cmd.parse_ast_translation));

  _ =
 Outer_Syntax.command 🍋parse_translation
 "install parse translation functions"
 (Parse.ML_source >> (Toplevel.theory o Isar_Cmd.parse_translation));

  _ =
 Outer_Syntax.command 🍋print_translation
 "install print translation functions"
 (Parse.ML_source >> (Toplevel.theory o Isar_Cmd.print_translation));

  _ =
 Outer_Syntax.command 🍋typed_print_translation
 "install typed print translation functions"
 (Parse.ML_source >> (Toplevel.theory o Isar_Cmd.typed_print_translation));

  _ =
 Outer_Syntax.command 🍋print_ast_translation
 "install print ast translation functions"
 (Parse.ML_source >> (Toplevel.theory o Isar_Cmd.print_ast_translation));

  end



subsubsection Specifications

ML 
 

  _ =
 Outer_Syntax.local_theory' 🍋definition "constant definition"
 (Scan.option Parse_Spec.constdecl -- (Parse_Spec.opt_thm_name ":" -- Parse.prop) --
 Parse_Spec.if_assumes -- Parse.for_fixes >> (fn (((decl, spec), prems), params) =>
 #2 oo Specification.definition_cmd decl params prems spec));

  _ =
 Outer_Syntax.local_theory' 🍋abbreviation "constant abbreviation"
 (Parse.syntax_mode -- Scan.option Parse_Spec.constdecl -- Parse.prop -- Parse.for_fixes
 >> (fn (((mode, decl), spec), params) => Specification.abbreviation_cmd mode decl params spec));

  axiomatization =
 Parse.and_list1 (Parse_Spec.thm_name ":" -- Parse.prop) --
 Parse_Spec.if_assumes -- Parse.for_fixes >> (fn ((a, b), c) => (c, b, a));

  _ =
 Outer_Syntax.command 🍋axiomatization "axiomatic constant specification"
 (Scan.optional Parse.vars [] --
 Scan.optional (Parse.where_ |-- Parse.!!! axiomatization) ([], [], [])
 >> (fn (a, (b, c, d)) => Toplevel.theory (#2 o Specification.axiomatization_cmd a b c d)));

  _ =
 Outer_Syntax.local_theory 🍋alias "name-space alias for constant"
 (Parse.binding -- (Parse.!!! 🍋= |-- Parse.name_position)
 >> Specification.alias_cmd);

  _ =
 Outer_Syntax.local_theory 🍋type_alias "name-space alias for type constructor"
 (Parse.binding -- (Parse.!!! 🍋= |-- Parse.name_position)
 >> Specification.type_alias_cmd);

  end



subsubsection Notation

ML 
 

  _ =
 Outer_Syntax.local_theory 🍋type_notation
 "add concrete syntax for type constructors"
 (Parse.syntax_mode -- Parse.and_list1 (Parse.type_const -- Parse.mixfix)
 >> (fn (mode, args) => Local_Theory.type_notation_cmd true mode args));

  _ =
 Outer_Syntax.local_theory 🍋no_type_notation
 "delete concrete syntax for type constructors"
 (Parse.syntax_mode -- Parse.and_list1 (Parse.type_const -- Parse.mixfix)
 >> (fn (mode, args) => Local_Theory.type_notation_cmd false mode args));

  _ =
 Outer_Syntax.local_theory 🍋notation
 "add concrete syntax for constants / fixed variables"
 (Parse.syntax_mode -- Parse.and_list1 (Parse.const -- Parse.mixfix)
 >> (fn (mode, args) => Local_Theory.notation_cmd true mode args));

  _ =
 Outer_Syntax.local_theory 🍋no_notation
 "delete concrete syntax for constants / fixed variables"
 (Parse.syntax_mode -- Parse.and_list1 (Parse.const -- Parse.mixfix)
 >> (fn (mode, args) => Local_Theory.notation_cmd false mode args));

  end



subsubsection Theorems

ML 
 

  long_keyword =
 Parse_Spec.includes >> K "" ||
 Parse_Spec.long_statement_keyword;

  long_statement =
 Scan.optional (Parse_Spec.opt_thm_name ":" --| Scan.ahead long_keyword) Binding.empty_atts --
 Scan.optional Parse_Spec.includes [] -- Parse_Spec.long_statement
 >> (fn ((binding, includes), (elems, concl)) => (true, binding, includes, elems, concl));

  short_statement =
 Parse_Spec.statement -- Parse_Spec.if_statement -- Parse.for_fixes
 >> (fn ((shows, assumes), fixes) =>
 (false, Binding.empty_atts, [], [Element.Fixes fixes, Element.Assumes assumes],
 Element.Shows shows));

  theorem spec schematic descr =
 Outer_Syntax.local_theory_to_proof' spec ("state " ^ descr)
 ((long_statement || short_statement) >> (fn (long, binding, includes, elems, concl) =>
 ((if schematic then Specification.schematic_theorem_cmd else Specification.theorem_cmd)
 long Thm.theoremK NONE (K I) binding includes elems concl)));

  _ = theorem 🍋theorem false "theorem";
  _ = theorem 🍋lemma false "lemma";
  _ = theorem 🍋corollary false "corollary";
  _ = theorem 🍋proposition false "proposition";
  _ = theorem 🍋schematic_goal true "schematic goal";

  end


ML 
 

  _ =
 Outer_Syntax.local_theory' 🍋lemmas "define theorems"
 (Parse_Spec.name_facts -- Parse.for_fixes >>
 (fn (facts, fixes) => #2 oo Specification.theorems_cmd Thm.theoremK facts fixes));

  _ =
 Outer_Syntax.local_theory' 🍋declare "declare theorems"
 (Parse.and_list1 Parse.thms1 -- Parse.for_fixes
 >> (fn (facts, fixes) =>
 #2 oo Specification.theorems_cmd "" [(Binding.empty_atts, flat facts)] fixes));

  _ =
 Outer_Syntax.local_theory 🍋named_theorems
 "declare named collection of theorems"
 (Parse.and_list1 (Parse.binding -- Scan.optional Parse.embedded "") >>
 fold (fn (b, descr) => snd o Named_Theorems.declare b descr));

  end



subsubsection Hide names

ML 
 

  hide_names command_keyword what hide parse prep =
 Outer_Syntax.command command_keyword ("hide " ^ what ^ " from name space")
 ((Parse.opt_keyword "open" >> not) -- Scan.repeat1 parse >> (fn (fully, args) =>
 (Toplevel.theory (fn thy =>
 let val ctxt = Proof_Context.init_global thy
 in fold (hide fully o prep ctxt) args thy end))));

  _ =
 hide_names 🍋hide_class "classes" Sign.hide_class Parse.class
 Proof_Context.read_class;

  _ =
 hide_names 🍋hide_type "types" Sign.hide_type Parse.type_const
 (dest_Type_name oo Proof_Context.read_type_name {proper = true, strict = false});

  _ =
 hide_names 🍋hide_const "consts" Sign.hide_const Parse.const
 (dest_Const_name oo Proof_Context.read_const {proper = true, strict = false});

  _ =
 hide_names 🍋hide_fact "facts" Global_Theory.hide_fact
 Parse.name_position (Global_Theory.check_fact o Proof_Context.theory_of);

  end



subsection Bundled declarations

ML 
 

  bundle_cmd open_bundle =
 (Parse.binding --| 🍋=) -- Parse.thms1 -- Parse.for_fixes
 >> (uncurry (Bundle.bundle_cmd {open_bundle = open_bundle}));

  bundle_begin open_bundle =
 Parse.binding --| Parse.begin >> Bundle.init {open_bundle = open_bundle};

  _ =
 Outer_Syntax.maybe_begin_local_theory 🍋bundle
 "define bundle of declarations" (bundle_cmd false) (bundle_begin false);

  _ =
 Outer_Syntax.maybe_begin_local_theory 🍋open_bundle
 "define and open bundle of declarations" (bundle_cmd true) (bundle_begin true);

  _ =
 Outer_Syntax.local_theory 🍋unbundle
 "open bundle in local theory" (Parse_Spec.bundles >> Bundle.unbundle_cmd);

  _ =
 Outer_Syntax.command 🍋include
 "open bundle in proof body" (Parse_Spec.bundles >> (Toplevel.proof o Bundle.include_cmd));

  _ =
 Outer_Syntax.command 🍋including
 "open bundle in goal refinement" (Parse_Spec.bundles >> (Toplevel.proof o Bundle.including_cmd));

  _ =
 Outer_Syntax.command 🍋print_bundles
 "print bundles of declarations"
 (Parse.opt_bang >> (fn b => Toplevel.keep (Bundle.print_bundles b o Toplevel.context_of)));

  end



subsection Local theory specifications

subsubsection Specification context

ML 
 

  _ =
 Outer_Syntax.command 🍋context "begin local theory context"
 (((Parse.name_position -- Scan.optional Parse_Spec.opening [])
 >> (fn (name, incls) => Toplevel.begin_main_target true (Target_Context.context_begin_named_cmd incls name)) ||
 Scan.optional Parse_Spec.includes [] -- Scan.repeat Parse_Spec.context_element
 >> (fn (incls, elems) => Toplevel.begin_nested_target (Target_Context.context_begin_nested_cmd incls elems)))
 --| Parse.begin);

  _ =
 Outer_Syntax.command 🍋end "end context"
 (Scan.succeed
 (Toplevel.exit o Toplevel.end_main_target o Toplevel.end_nested_target o
 Toplevel.end_proof (K Proof.end_notepad)));

  end



subsubsection Locales and interpretation

ML 
 

  locale_context_elements =
 Scan.repeat1 Parse_Spec.context_element;

  locale_val =
 ((Parse_Spec.locale_expression -- Scan.optional Parse_Spec.opening [])
 || Parse_Spec.opening >> pair ([], []))
 -- Scan.optional (🍋+ |-- Parse.!!! locale_context_elements) []
 || locale_context_elements >> pair (([], []), []);

  _ =
 Outer_Syntax.command 🍋locale "define named specification context"
 (Parse.binding --
 Scan.optional (🍋= |-- Parse.!!! locale_val) ((([], []), []), []) -- Parse.opt_begin
 >> (fn ((name, ((expr, includes), elems)), begin) =>
 Toplevel.begin_main_target begin
 (Expression.add_locale_cmd name Binding.empty includes expr elems #> snd)));

  _ =
 Outer_Syntax.command 🍋experiment "open private specification context"
 (Scan.repeat Parse_Spec.context_element --| Parse.begin
 >> (fn elems =>
 Toplevel.begin_main_target true (Experiment.experiment_cmd elems #> snd)));

  _ =
 Outer_Syntax.command 🍋interpret
 "prove interpretation of locale expression in proof context"
 (Parse.!!! Parse_Spec.locale_expression >> (fn expr =>
 Toplevel.proof (Interpretation.interpret_cmd expr)));

  interpretation_args_with_defs =
 Parse.!!! Parse_Spec.locale_expression --
 (Scan.optional (🍋defines |-- Parse.and_list1 (Parse_Spec.opt_thm_name ":"
 -- ((Parse.binding -- Parse.opt_mixfix') --| 🍋= -- Parse.term))) ([]));

  _ =
 Outer_Syntax.local_theory_to_proof 🍋global_interpretation
 "prove interpretation of locale expression into global theory"
 (interpretation_args_with_defs >> (fn (expr, defs) =>
 Interpretation.global_interpretation_cmd expr defs));

  _ =
 Outer_Syntax.command 🍋sublocale
 "prove sublocale relation between a locale and a locale expression"
 ((Parse.name_position --| (🍋 || 🍋<\<close>) --
 interpretation_args_with_defs >> (fn (loc, (expr, defs)) =>
 Toplevel.theory_to_proof (Interpretation.global_sublocale_cmd loc expr defs)))
 || interpretation_args_with_defs >> (fn (expr, defs) =>
 Toplevel.local_theory_to_proof NONE NONE (Interpretation.sublocale_cmd expr defs)));

  _ =
 Outer_Syntax.command 🍋interpretation
 "prove interpretation of locale expression in local theory or into global theory"
 (Parse.!!! Parse_Spec.locale_expression >> (fn expr =>
 Toplevel.local_theory_to_proof NONE NONE
 (Interpretation.isar_interpretation_cmd expr)));

  end



  Type classes

 
 

  class_context_elements =
 Scan.repeat1 Parse_Spec.context_element;

  class_val =
 ((Parse_Spec.class_expression -- Scan.optional Parse_Spec.opening [])
 || Parse_Spec.opening >> pair [])
 -- Scan.optional (🍋+ |-- Parse.!!! class_context_elements) [] ||
 class_context_elements >> pair ([], []);

  _ =
 Outer_Syntax.command 🍋class "define type class"
 (Parse.binding -- Scan.optional (🍋= |-- class_val) (([], []), []) -- Parse.opt_begin
 >> (fn ((name, ((supclasses, includes), elems)), begin) =>
 Toplevel.begin_main_target begin
 (Class_Declaration.class_cmd name includes supclasses elems #> snd)));

  _ =
 Outer_Syntax.local_theory_to_proof 🍋subclass "prove a subclass relation"
 (Parse.class >> Class_Declaration.subclass_cmd);

  _ =
 Outer_Syntax.command 🍋instantiation "instantiate and prove type arity"
 (Parse.multi_arity --| Parse.begin
 >> (fn arities => Toplevel.begin_main_target true (Class.instantiation_cmd arities)));

  _ =
 Outer_Syntax.command 🍋instance "prove type arity or subclass relation"
 ((Parse.class --
 ((🍋 || 🍋<\<close>) |-- Parse.!!! Parse.class) >> Class.classrel_cmd ||
 Parse.multi_arity >> Class.instance_arity_cmd) >> Toplevel.theory_to_proof ||
 Scan.succeed (Toplevel.local_theory_to_proof NONE NONE (Class.instantiation_instance I)));

  end



  Arbitrary overloading

 
 

  _ =
 Outer_Syntax.command 🍋overloading "overloaded definitions"
 (Scan.repeat1 (Parse.name --| (🍋== || 🍋) -- Parse.term --
 Scan.optional (🍋( |-- (🍋unchecked >> K false) --| 🍋)) true
 >> Scan.triple1) --| Parse.begin
 >> (fn operations => Toplevel.begin_main_target true (Overloading.overloading_cmd operations)));

  end



  Proof commands

 
 

  _ =
 Outer_Syntax.local_theory_to_proof 🍋notepad "begin proof context"
 (Parse.begin >> K Proof.begin_notepad);

  end



  Statements

 
 

  structured_statement =
 Parse_Spec.statement -- Parse_Spec.cond_statement -- Parse.for_fixes
 >> (fn ((shows, (strict, assumes)), fixes) => (strict, fixes, assumes, shows));

  _ =
 Outer_Syntax.command 🍋have "state local goal"
 (structured_statement >> (fn (a, b, c, d) =>
 Toplevel.proof' (fn int => Proof.have_cmd a NONE (K I) b c d int #> #2)));

  _ =
 Outer_Syntax.command 🍋show "state local goal, to refine pending subgoals"
 (structured_statement >> (fn (a, b, c, d) =>
 Toplevel.proof' (fn int => Proof.show_cmd a NONE (K I) b c d int #> #2)));

  _ =
 Outer_Syntax.command 🍋hence "old-style alias of \"then have\""
 (structured_statement >> (fn (a, b, c, d) =>
 Toplevel.proof' (fn int => Proof.chain #> Proof.have_cmd a NONE (K I) b c d int #> #2)));

  _ =
 Outer_Syntax.command 🍋thus "old-style alias of \"then show\""
 (structured_statement >> (fn (a, b, c, d) =>
 Toplevel.proof' (fn int => Proof.chain #> Proof.show_cmd a NONE (K I) b c d int #> #2)));

  end



  Local facts

 
 

  facts = Parse.and_list1 Parse.thms1;

  _ =
 Outer_Syntax.command 🍋then "forward chaining"
 (Scan.succeed (Toplevel.proof Proof.chain));

  _ =
 Outer_Syntax.command 🍋from "forward chaining from given facts"
 (facts >> (Toplevel.proof o Proof.from_thmss_cmd));

  _ =
 Outer_Syntax.command 🍋with "forward chaining from given and current facts"
 (facts >> (Toplevel.proof o Proof.with_thmss_cmd));

  _ =
 Outer_Syntax.command 🍋note "define facts"
 (Parse_Spec.name_facts >> (Toplevel.proof o Proof.note_thmss_cmd));

  _ =
 Outer_Syntax.command 🍋supply "define facts during goal refinement (unstructured)"
 (Parse_Spec.name_facts >> (Toplevel.proof o Proof.supply_cmd));

  _ =
 Outer_Syntax.command 🍋using "augment goal facts"
 (facts >> (Toplevel.proof o Proof.using_cmd));

  _ =
 Outer_Syntax.command 🍋unfolding "unfold definitions in goal and facts"
 (facts >> (Toplevel.proof o Proof.unfolding_cmd));

  end



  Proof context

 
 

  structured_statement =
 Parse_Spec.statement -- Parse_Spec.if_statement' -- Parse.for_fixes
 >> (fn ((shows, assumes), fixes) => (fixes, assumes, shows));

  _ =
 Outer_Syntax.command 🍋fix "fix local variables (Skolem constants)"
 (Parse.vars >> (Toplevel.proof o Proof.fix_cmd));

  _ =
 Outer_Syntax.command 🍋assume "assume propositions"
 (structured_statement >> (fn (a, b, c) => Toplevel.proof (Proof.assume_cmd a b c)));

  _ =
 Outer_Syntax.command 🍋presume "assume propositions, to be established later"
 (structured_statement >> (fn (a, b, c) => Toplevel.proof (Proof.presume_cmd a b c)));

  _ =
 Outer_Syntax.command 🍋define "local definition (non-polymorphic)"
 ((Parse.vars --| Parse.where_) -- Parse_Spec.statement -- Parse.for_fixes
 >> (fn ((a, b), c) => Toplevel.proof (Proof.define_cmd a c b)));

  _ =
 Outer_Syntax.command 🍋consider "state cases rule"
 (Parse_Spec.obtains >> (Toplevel.proof' o Obtain.consider_cmd));

  _ =
 Outer_Syntax.command 🍋obtain "generalized elimination"
 (Parse.parbinding -- Scan.optional (Parse.vars --| Parse.where_) [] -- structured_statement
 >> (fn ((a, b), (c, d, e)) => Toplevel.proof' (Obtain.obtain_cmd a b c d e)));

  _ =
 Outer_Syntax.command 🍋let "bind text variables"
 (Parse.and_list1 (Parse.and_list1 Parse.term -- (🍋= |-- Parse.term))
 >> (Toplevel.proof o Proof.let_bind_cmd));

  _ =
 Outer_Syntax.command 🍋write "add concrete syntax for constants / fixed variables"
 (Parse.syntax_mode -- Parse.and_list1 (Parse.const -- Parse.mixfix)
 >> (fn (mode, args) => Toplevel.proof (Proof.write_cmd mode args)));

  _ =
 Outer_Syntax.command 🍋case "invoke local context"
 (Parse_Spec.opt_thm_name ":" --
 (🍋( |-- Parse.!!! (Parse.name_position -- Scan.repeat (Parse.maybe Parse.binding)
 --| 🍋)) ||
 Parse.name_position >> rpair []) >> (Toplevel.proof o Proof.case_cmd));

  end



  Proof structure

 
 

  _ =
 Outer_Syntax.command 🍋{ "begin explicit proof block"
 (Scan.succeed (Toplevel.proof Proof.begin_block));

  _ =
 Outer_Syntax.command 🍋} "end explicit proof block"
 (Scan.succeed (Toplevel.proof Proof.end_block));

  _ =
 Outer_Syntax.command 🍋next "enter next proof block"
 (Scan.succeed (Toplevel.proof Proof.next_block));

  end



  End proof

 
 

  _ =
 Outer_Syntax.command 🍋qed "conclude proof"
 (Scan.option Method.parse >> (fn m =>
 (Option.map Method.report m;
 Isar_Cmd.qed m)));

  _ =
 Outer_Syntax.command 🍋by "terminal backward proof"
 (Method.parse -- Scan.option Method.parse >> (fn (m1, m2) =>
 (Method.report m1;
 Option.map Method.report m2;
 Isar_Cmd.terminal_proof (m1, m2))));

  _ =
 Outer_Syntax.command 🍋.. "default proof"
 (Scan.succeed Isar_Cmd.default_proof);

  _ =
 Outer_Syntax.command 🍋. "immediate proof"
 (Scan.succeed Isar_Cmd.immediate_proof);

  _ =
 Outer_Syntax.command 🍋done "done proof"
 (Scan.succeed Isar_Cmd.done_proof);

  _ =
 Outer_Syntax.command 🍋sorry "skip proof (quick-and-dirty mode only!)"
 (Scan.succeed Isar_Cmd.skip_proof);

  _ =
 Outer_Syntax.command 🍋🍋 "dummy proof (quick-and-dirty mode only!)"
 (Scan.succeed Isar_Cmd.skip_proof);

  _ =
 Outer_Syntax.command 🍋oops "forget proof"
 (Scan.succeed Toplevel.forget_proof);

  end



  Proof steps

 
 

  _ =
 Outer_Syntax.command 🍋defer "shuffle internal proof state"
 (Scan.optional Parse.nat 1 >> (Toplevel.proof o Proof.defer));

  _ =
 Outer_Syntax.command 🍋prefer "shuffle internal proof state"
 (Parse.nat >> (Toplevel.proof o Proof.prefer));

  _ =
 Outer_Syntax.command 🍋apply "initial goal refinement step (unstructured)"
 (Method.parse >> (fn m => (Method.report m; Toplevel.proofs (Proof.apply m))));

  _ =
 Outer_Syntax.command 🍋apply_end "terminal goal refinement step (unstructured)"
 (Method.parse >> (fn m => (Method.report m; Toplevel.proofs (Proof.apply_end m))));

  _ =
 Outer_Syntax.command 🍋proof "backward proof step"
 (Scan.option Method.parse >> (fn m =>
 (Option.map Method.report m;
 Toplevel.proof (fn state =>
 let
 val state' = state |> Proof.proof m |> Seq.the_result "";
 val _ =
 Output.information
 (Proof_Context.print_cases_proof (Proof.context_of state) (Proof.context_of state'));
 in state' end))))

  end



  Subgoal focus

 
 

  opt_fact_binding =
 Scan.optional (Parse.binding -- Parse.opt_attribs || Parse.attribs >> pair Binding.empty)
 Binding.empty_atts;

  for_params =
 Scan.optional
 (🍋for |--
 Parse.!!! ((Scan.option Parse.dots >> is_some) --
 (Scan.repeat1 (Parse.maybe_position Parse.name_position))))
 (false, []);

  _ =
 Outer_Syntax.command 🍋subgoal
 "focus on first subgoal within backward refinement"
 (opt_fact_binding -- (Scan.option (🍋premises |-- Parse.!!! opt_fact_binding)) --
 for_params >> (fn ((a, b), c) =>
 Toplevel.proofs (Seq.make_results o Seq.single o #2 o Subgoal.subgoal_cmd a b c)));

  end



  Calculation

 
 

  calculation_args =
 Scan.option (🍋( |-- Parse.!!! ((Parse.thms1 --| 🍋))));

  _ =
 Outer_Syntax.command 🍋also "combine calculation and current facts"
 (calculation_args >> (Toplevel.proofs' o Calculation.also_cmd));

  _ =
 Outer_Syntax.command 🍋finally
 "combine calculation and current facts, exhibit result"
 (calculation_args >> (Toplevel.proofs' o Calculation.finally_cmd));

  _ =
 Outer_Syntax.command 🍋moreover "augment calculation by current facts"
 (Scan.succeed (Toplevel.proof' Calculation.moreover));

  _ =
 Outer_Syntax.command 🍋ultimately
 "augment calculation by current facts, exhibit result"
 (Scan.succeed (Toplevel.proof' Calculation.ultimately));

  _ =
 Outer_Syntax.command 🍋print_trans_rules "print transitivity rules"
 (Scan.succeed (Toplevel.keep (Calculation.print_rules o Toplevel.context_of)));

  end



  Proof navigation

 
 

  report_back () =
 Output.report [Markup.markup (Markup.bad ()) "Explicit backtracking"];

  _ =
 Outer_Syntax.command 🍋back "explicit backtracking of proof command"
 (Scan.succeed
 (Toplevel.actual_proof (fn prf => (report_back (); Proof_Node.back prf)) o
 Toplevel.skip_proof report_back));

  end



  Diagnostic commands (for interactive mode only)

 
 

  opt_modes =
 Scan.optional (🍋( |-- Parse.!!! (Scan.repeat1 Parse.name --| 🍋))) [];

  _ =
 Outer_Syntax.command 🍋help
 "retrieve outer syntax commands according to name patterns"
 (Scan.repeat Parse.name >>
 (fn pats => Toplevel.keep (fn st => Outer_Syntax.help (Toplevel.theory_of st) pats)));

  _ =
 Outer_Syntax.command 🍋print_commands "print outer syntax commands"
 (Scan.succeed (Toplevel.keep (Outer_Syntax.print_commands o Toplevel.theory_of)));

  _ =
 Outer_Syntax.command 🍋print_options "print configuration options"
 (Parse.opt_bang >> (fn b => Toplevel.keep (Attrib.print_options b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_context
 "print context of local theory target"
 (Scan.succeed (Toplevel.keep (Pretty.writeln o Pretty.chunks o Toplevel.pretty_context)));

  _ =
 Outer_Syntax.command 🍋print_theory
 "print logical theory contents"
 (Parse.opt_bang >> (fn b =>
 Toplevel.keep (Pretty.writeln o Proof_Display.pretty_theory b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_definitions
 "print dependencies of definitional theory content"
 (Parse.opt_bang >> (fn b =>
 Toplevel.keep (Pretty.writeln o Proof_Display.pretty_definitions b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_syntax
 "print inner syntax of context"
 (Scan.succeed (Toplevel.keep (Proof_Context.print_syntax o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_defn_rules
 "print definitional rewrite rules of context"
 (Scan.succeed (Toplevel.keep (Local_Defs.print_rules o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_abbrevs
 "print constant abbreviations of context"
 (Parse.opt_bang >> (fn b =>
 Toplevel.keep (Proof_Context.print_abbrevs b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_theorems
 "print theorems of local theory or proof context"
 (Parse.opt_bang >> (fn b =>
 Toplevel.keep (Pretty.writeln o Pretty.chunks o Isar_Cmd.pretty_theorems b)));

  _ =
 Outer_Syntax.command 🍋print_locales
 "print locales of this theory"
 (Parse.opt_bang >> (fn verbose =>
 Toplevel.keep (fn state =>
 let val thy = Toplevel.theory_of state
 in Pretty.writeln (Locale.pretty_locales thy verbose) end)));

  _ =
 Outer_Syntax.command 🍋print_classes
 "print classes of this theory"
 (Scan.succeed (Toplevel.keep (Class.print_classes o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_locale
 "print locale of this theory"
 (Parse.opt_bang -- Parse.name_position >> (fn (show_facts, raw_name) =>
 Toplevel.keep (fn state =>
 let
 val thy = Toplevel.theory_of state;
 val ctxt = Toplevel.context_of state;
 val name = Locale.check ctxt raw_name;
 in Pretty.writeln (Locale.pretty_locale thy show_facts name) end)));

  _ =
 Outer_Syntax.command 🍋print_interps
 "print interpretations of locale for this theory or proof context"
 (Parse.name_position >> (fn raw_name =>
 Toplevel.keep (fn state =>
 let
 val thy = Toplevel.theory_of state;
 val ctxt = Toplevel.context_of state;
 val name = Locale.check ctxt raw_name;
 in Pretty.writeln (Locale.pretty_registrations ctxt name) end)));

  _ =
 Outer_Syntax.command 🍋print_attributes
 "print attributes of this theory"
 (Parse.opt_bang >> (fn b => Toplevel.keep (Attrib.print_attributes b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_simpset
 "print context of Simplifier"
 (Parse.opt_bang >> (fn b =>
 Toplevel.keep (Pretty.writeln o Simplifier.pretty_simpset b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_rules "print intro/elim rules"
 (Scan.succeed (Toplevel.keep (Context_Rules.print_rules o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_methods "print methods of this theory"
 (Parse.opt_bang >> (fn b => Toplevel.keep (Method.print_methods b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_antiquotations
 "print document antiquotations"
 (Parse.opt_bang >> (fn b =>
 Toplevel.keep (Document_Antiquotation.print_antiquotations b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_ML_antiquotations
 "print ML antiquotations"
 (Parse.opt_bang >> (fn b =>
 Toplevel.keep (ML_Context.print_antiquotations b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋locale_deps "visualize locale dependencies"
 (Scan.succeed (Toplevel.keep (fn state =>
 let
 val thy = Toplevel.theory_of state;
 val ctxt = Toplevel.context_of state;
 in
 Locale.pretty_locale_deps thy
 |> map (fn {name, parents, body} =>
 ((name, Graph_Display.content_node (Locale.extern ctxt name) [body]), parents))
 |> Graph_Display.display_graph_old
 end)));

  _ =
 Outer_Syntax.command 🍋print_term_bindings
 "print term bindings of proof context"
 (Scan.succeed
 (Toplevel.keep
 (Pretty.writeln o Pretty.chunks o Proof_Context.pretty_term_bindings o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_facts "print facts of proof context"
 (Parse.opt_bang >> (fn b =>
 Toplevel.keep (Proof_Context.print_local_facts b o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_cases "print cases of proof context"
 (Scan.succeed
 (Toplevel.keep
 (Pretty.writeln o Pretty.chunks o Proof_Context.pretty_cases o Toplevel.context_of)));

  _ =
 Outer_Syntax.command 🍋print_statement
 "print theorems as long statements"
 (opt_modes -- Parse.thms1 >> Isar_Cmd.print_stmts);

  _ =
 Outer_Syntax.command 🍋thm "print theorems"
 (opt_modes -- Parse.thms1 >> Isar_Cmd.print_thms);

  _ =
 Outer_Syntax.command 🍋prf "print proof terms of theorems"
 (opt_modes -- Scan.option Parse.thms1 >> Isar_Cmd.print_prfs false);

  _ =
 Outer_Syntax.command 🍋full_prf "print full proof terms of theorems"
 (opt_modes -- Scan.option Parse.thms1 >> Isar_Cmd.print_prfs true);

  _ =
 Outer_Syntax.command 🍋prop "read and print proposition"
 (opt_modes -- Parse.term >> Isar_Cmd.print_prop);

  _ =
 Outer_Syntax.command 🍋term "read and print term"
 (opt_modes -- Parse.term >> Isar_Cmd.print_term);

  _ =
 Outer_Syntax.command 🍋typ "read and print type"
 (opt_modes -- (Parse.typ -- Scan.option (🍋:: |-- Parse.!!! Parse.sort))
 >> Isar_Cmd.print_type);

  _ =
 Outer_Syntax.command 🍋print_codesetup "print code generator setup"
 (Scan.succeed (Toplevel.keep (Code.print_codesetup o Toplevel.theory_of)));

  _ =
 Outer_Syntax.command 🍋print_context_tracing
 "print result of context tracing from ML heap"
 (Scan.repeat Parse.name_position >> (fn raw_names => Toplevel.keep (fn st =>
 let
 val pred =
 if null raw_names then K true
 else
 let
 val ctxt = Toplevel.context_of st;
 val insert = Symset.insert o Context.theory_long_name o Thy_Info.check_theory ctxt;
 val names = Symset.build (fold insert raw_names);
 in Symset.member names o Context.theory_long_name o Context.theory_of end;
 in Session.print_context_tracing pred end)));

  _ =
 Outer_Syntax.command 🍋print_state
 "print current proof state (if present)"
 (opt_modes >> (fn modes =>
 Toplevel.keep
 (Print_Mode.with_modes modes
 (Output.writelns o Pretty.strings_of o Pretty.chunks o Toplevel.pretty_state))));

  _ =
 Outer_Syntax.command 🍋welcome "print welcome message"
 (Scan.succeed (Toplevel.keep (fn _ => writeln (Session.welcome ()))));

  end



  Dependencies

 
 

  theory_bounds =
 Parse.theory_name >> single ||
 (🍋( |-- Parse.enum "|" Parse.theory_name --| 🍋));

  _ =
 Outer_Syntax.command 🍋thy_deps "visualize theory dependencies"
 (Scan.option theory_bounds -- Scan.option theory_bounds >>
 (fn args => Toplevel.keep (fn st => Thy_Deps.thy_deps_cmd (Toplevel.context_of st) args)));


  class_bounds =
 Parse.sort >> single ||
 (🍋( |-- Parse.enum "|" Parse.sort --| 🍋));

  _ =
 Outer_Syntax.command 🍋class_deps "visualize class dependencies"
 (Scan.option class_bounds -- Scan.option class_bounds >> (fn args =>
 Toplevel.keep (fn st => Class_Deps.class_deps_cmd (Toplevel.context_of st) args)));


  _ =
 Outer_Syntax.command 🍋thm_deps
 "print theorem dependencies (immediate non-transitive)"
 (Parse.thms1 >> (fn args =>
 Toplevel.keep (fn st =>
 let val ctxt = Toplevel.context_of st
 in Pretty.writeln (Thm_Deps.pretty_thm_deps ctxt (Attrib.eval_thms ctxt args)) end)));

  _ =
 Outer_Syntax.command 🍋thm_oracles
 "print all oracles used in theorems (full graph of transitive dependencies)"
 (Parse.thms1 >> (fn args =>
 Toplevel.keep (fn st =>
 let
 val ctxt = Toplevel.context_of st;
 val thms = Attrib.eval_thms ctxt args;
 in Pretty.writeln (Thm_Deps.pretty_thm_oracles ctxt thms) end)));

  thy_names = Scan.repeat1 (Scan.unless Parse.minus Parse.theory_name);

  _ =
 Outer_Syntax.command 🍋unused_thms "find unused theorems"
 (Scan.option ((thy_names --| Parse.minus) -- Scan.option thy_names) >> (fn opt_range =>
 Toplevel.keep (fn st =>
 let
 val thy = Toplevel.theory_of st;
 val ctxt = Toplevel.context_of st;
 fun pretty_thm (a, th) =
 Pretty.block [Pretty.quote (Proof_Context.pretty_thm_name ctxt a),
 Pretty.str ":", Pretty.brk 1, Thm.pretty_thm ctxt th];
 val check = Theory.check {long = false} ctxt;
 in
 Thm_Deps.unused_thms_cmd
 (case opt_range of
 NONE => (Theory.parents_of thy, [thy])
 | SOME (xs, NONE) => (map check xs, [thy])
 | SOME (xs, SOME ys) => (map check xs, map check ys))
 |> map pretty_thm |> Pretty.chunks |> Pretty.writeln
 end)));

  end



  Adhoc overloading

 
 

  adhoc_overloading_args =
 Parse.and_list1
 ((Parse.const --| (🍋 || 🍋==)) -- Parse.!!! (Scan.repeat1 Parse.term));

  _ =
 Outer_Syntax.local_theory 🍋adhoc_overloading
 "add adhoc overloading for constants / fixed variables"
 (adhoc_overloading_args
 >> Adhoc_Overloading.adhoc_overloading_cmd true);

  _ =
 Outer_Syntax.local_theory 🍋no_adhoc_overloading
 "delete adhoc overloading for constants / fixed variables"
 (adhoc_overloading_args
 >> Adhoc_Overloading.adhoc_overloading_cmd false);

  end
 



  Find consts and theorems

 
 

  _ =
 Outer_Syntax.command 🍋find_consts
 "find constants by name / type patterns"
 (Find_Consts.query_parser >> (fn spec =>
 Toplevel.keep (fn st =>
 Pretty.writeln (Find_Consts.pretty_consts (Toplevel.context_of st) spec))));

  options =
 Scan.optional
 (Parse.$$$ "(" |--
 Parse.!!! (Scan.option Parse.nat --
 Scan.optional (Parse.reserved "with_dups" >> K false) true --| Parse.$$$ ")"))
 (NONE, true);

  _ =
 Outer_Syntax.command 🍋find_theorems
 "find theorems meeting specified criteria"
 (options -- Find_Theorems.query_parser >> (fn ((opt_lim, rem_dups), spec) =>
 Toplevel.keep (fn st =>
 Pretty.writeln
 (Find_Theorems.pretty_theorems (Find_Theorems.proof_state st) opt_lim rem_dups spec))));

  end



  Code generation

 
 

  _ =
 Outer_Syntax.command 🍋code_datatype
 "define set of code datatype constructors"
 (Scan.repeat1 Parse.term >> (Toplevel.theory o Code.declare_datatype_cmd));

  end



  Extraction of programs from proofs

 
 

  parse_vars = Scan.optional (Parse.$$$ "(" |-- Parse.list1 Parse.name --| Parse.$$$ ")") [];

  _ =
 Outer_Syntax.command 🍋realizers
 "specify realizers for primitive axioms / theorems, together with correctness proof"
 (Scan.repeat1 (Parse.name -- parse_vars --| Parse.$$$ ":" -- Parse.string -- Parse.string) >>
 (fn xs => Toplevel.theory (fn thy => Extraction.add_realizers
 (map (fn (((a, vs), s1), s2) => (Global_Theory.get_thm thy a, (vs, s1, s2))) xs) thy)));

  _ =
 Outer_Syntax.command 🍋realizability
 "add equations characterizing realizability"
 (Scan.repeat1 Parse.string >> (Toplevel.theory o Extraction.add_realizes_eqns));

  _ =
 Outer_Syntax.command 🍋extract_type
 "add equations characterizing type of extracted program"
 (Scan.repeat1 Parse.string >> (Toplevel.theory o Extraction.add_typeof_eqns));

  _ =
 Outer_Syntax.command 🍋extract "extract terms from proofs"
 (Scan.repeat1 (Parse.name -- parse_vars) >> (fn xs => Toplevel.theory (fn thy =>
 Extraction.extract (map (apfst (Global_Theory.get_thm thy)) xs) thy)));

  end



  Auxiliary lemmas

  Meta-level connectives in assumptions

  meta_mp:
 assumes "PROP P ==> PROP Q" and "PROP P"
 shows "PROP Q"
 by (rule PROP P ==> PROP Q [OF PROP P])

  meta_impE = meta_mp [elim_format]

  meta_spec:
 assumes "x. PROP P x"
 shows "PROP P x"
 by (rule x. PROP P x)

  meta_allE = meta_spec [elim_format]

  swap_params:
 "(x y. PROP P x y) (y x. PROP P x y)" ..

  equal_allI:
 (x. PROP P x) (x. PROP Q x) if x. PROP P x PROP Q x
 by (simp only: that)


  Meta-level conjunction

  all_conjunction:
 "(x. PROP A x &&& PROP B x) ((x. PROP A x) &&& (x. PROP B x))"
 
 assume conj: "x. PROP A x &&& PROP B x"
 show "(x. PROP A x) &&& (x. PROP B x)"
 proof -
 fix x
 from conj show "PROP A x" by (rule conjunctionD1)
 from conj show "PROP B x" by (rule conjunctionD2)
 qed
 
 assume conj: "(x. PROP A x) &&& (x. PROP B x)"
 fix x
 show "PROP A x &&& PROP B x"
 proof -
 show "PROP A x" by (rule conj [THEN conjunctionD1, rule_format])
 show "PROP B x" by (rule conj [THEN conjunctionD2, rule_format])
 qed
 

  imp_conjunction:
 "(PROP A ==> PROP B &&& PROP C) ((PROP A ==> PROP B) &&& (PROP A yle='font-size: 18px;'>==> PROP C))"
 
 assume conj: "PROP A ==> PROP B &&& PROP C"
 show "(PROP A ==> PROP B) &&& (PROP A ==> PROP C)"
 proof -
 assume "PROP A"
 from conj [OF PROP A] show "PROP B" by (rule conjunctionD1)
 from conj [OF PROP A] show "PROP C" by (rule conjunctionD2)
 qed
 
 assume conj: "(PROP A ==> PROP B) &&& (PROP A ==> PROP C)"
 assume "PROP A"
 show "PROP B &&& PROP C"
 proof -
 from PROP A show "PROP B" by (rule conj [THEN conjunctionD1])
 from PROP A show "PROP C" by (rule conj [THEN conjunctionD2])
 qed
 

  conjunction_imp:
 "(PROP A &&& PROP B ==> PROP C) (PROP A ==> PROP B ==> PROP C)"
 
 assume r: "PROP A &&& PROP B ==> PROP C"
 assume ab: "PROP A" "PROP B"
 show "PROP C"
 proof (rule r)
 from ab show "PROP A &&& PROP B" .
 qed
 
 assume r: "PROP A ==> PROP B ==> PROP C"
 assume conj: "PROP A &&& PROP B"
 show "PROP C"
 proof (rule r)
 from conj show "PROP A" by (rule conjunctionD1)
 from conj show "PROP B" by (rule conjunctionD2)
 qed
 


  Misc

  constrain_space_syntax ― type constraints with spacing
 
  (output)
 "_constrain" :: "logic ==> type ==> logic" (_::_ [4, 0] 3)
 "_constrain" :: "prop' ==> type ==> prop'" (_::_ [4, 0] 3)
  (output)
 "_constrain" :: "logic ==> type ==> logic" (_ :: _ [4, 0] 3)
 "_constrain" :: "prop' ==> type ==> prop'" (_ :: _ [4, 0] 3)
 


  [[ML_write_global = false]]

  🍋 (not (can ML_command () handle _ => ()))
  🍋 (not (can ML_command () handle Interrupt => ()))

 

Messung V0.5 in Prozent
C=13 H=-377 G=266

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.210Bemerkung:  (vorverarbeitet am  2026-06-09) ¤

*Bot Zugriff






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.