src/HOL/ex/Cartouche_Examples.thy
author haftmann
Tue, 13 Oct 2015 09:21:15 +0200
changeset 61424 c3658c18b7bc
parent 60754 02924903a6fd
child 61457 3e21699bb83b
permissions -rw-r--r--
prod_case as canonical name for product type eliminator
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59089
da2fef2faa83 tuned header;
wenzelm
parents: 59068
diff changeset
     1
(*  Title:      HOL/ex/Cartouche_Examples.thy
da2fef2faa83 tuned header;
wenzelm
parents: 59068
diff changeset
     2
    Author:     Makarius
da2fef2faa83 tuned header;
wenzelm
parents: 59068
diff changeset
     3
*)
da2fef2faa83 tuned header;
wenzelm
parents: 59068
diff changeset
     4
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
     5
section \<open>Some examples with text cartouches\<close>
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     6
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     7
theory Cartouche_Examples
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     8
imports Main
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
     9
keywords
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    10
  "cartouche" "term_cartouche" :: diag and
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    11
  "text_cartouche" :: thy_decl
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    12
begin
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    13
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    14
subsection \<open>Regular outer syntax\<close>
56499
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    15
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    16
text \<open>Text cartouches may be used in the outer syntax category "text",
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    17
  as alternative to the traditional "verbatim" tokens.  An example is
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    18
  this text block.\<close>  -- \<open>The same works for small side-comments.\<close>
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    19
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    20
notepad
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    21
begin
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    22
  txt \<open>Moreover, cartouches work as additional syntax in the
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    23
    "altstring" category, for literal fact references.  For example:\<close>
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    24
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    25
  fix x y :: 'a
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    26
  assume "x = y"
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    27
  note \<open>x = y\<close>
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    28
  have "x = y" by (rule \<open>x = y\<close>)
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    29
  from \<open>x = y\<close> have "x = y" .
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    30
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    31
  txt \<open>Of course, this can be nested inside formal comments and
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    32
    antiquotations, e.g. like this @{thm \<open>x = y\<close>} or this @{thm sym
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    33
    [OF \<open>x = y\<close>]}.\<close>
56500
90f17a04567d proper Args.name vs. Args.text as documented (in contrast to adhoc union in 75aaee32893d, which had to cope with more limited Args.T);
wenzelm
parents: 56499
diff changeset
    34
90f17a04567d proper Args.name vs. Args.text as documented (in contrast to adhoc union in 75aaee32893d, which had to cope with more limited Args.T);
wenzelm
parents: 56499
diff changeset
    35
  have "x = y"
60754
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
    36
    by (tactic \<open>resolve_tac @{context} @{thms \<open>x = y\<close>} 1\<close>)  -- \<open>more cartouches involving ML\<close>
56499
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    37
end
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    38
7e0178c84994 allow text cartouches in regular outer syntax categories "text" and "altstring";
wenzelm
parents: 56304
diff changeset
    39
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    40
subsection \<open>Outer syntax: cartouche within command syntax\<close>
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    41
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    42
ML \<open>
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59809
diff changeset
    43
  Outer_Syntax.command @{command_keyword cartouche} ""
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    44
    (Parse.cartouche >> (fn s =>
60189
0d3a62127057 tuned signature;
wenzelm
parents: 59936
diff changeset
    45
      Toplevel.keep (fn _ => writeln s)))
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    46
\<close>
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    47
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    48
cartouche \<open>abc\<close>
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    49
cartouche \<open>abc \<open>\<alpha>\<beta>\<gamma>\<close> xzy\<close>
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    50
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    51
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    52
subsection \<open>Inner syntax: string literals via cartouche\<close>
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    53
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    54
ML \<open>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    55
  local
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    56
    val mk_nib =
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    57
      Syntax.const o Lexicon.mark_const o
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    58
        fst o Term.dest_Const o HOLogic.mk_nibble;
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    59
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    60
    fun mk_char (s, pos) =
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    61
      let
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    62
        val c =
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    63
          if Symbol.is_ascii s then ord s
55036
87797f8f3152 proper \<newline>;
wenzelm
parents: 55033
diff changeset
    64
          else if s = "\<newline>" then 10
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    65
          else error ("String literal contains illegal symbol: " ^ quote s ^ Position.here pos);
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    66
      in Syntax.const @{const_syntax Char} $ mk_nib (c div 16) $ mk_nib (c mod 16) end;
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    67
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    68
    fun mk_string [] = Const (@{const_syntax Nil}, @{typ string})
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    69
      | mk_string (s :: ss) =
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    70
          Syntax.const @{const_syntax Cons} $ mk_char s $ mk_string ss;
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    71
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    72
  in
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    73
    fun string_tr content args =
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    74
      let fun err () = raise TERM ("string_tr", args) in
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    75
        (case args of
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    76
          [(c as Const (@{syntax_const "_constrain"}, _)) $ Free (s, _) $ p] =>
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    77
            (case Term_Position.decode_position p of
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    78
              SOME (pos, _) => c $ mk_string (content (s, pos)) $ p
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    79
            | NONE => err ())
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    80
        | _ => err ())
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    81
      end;
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    82
  end;
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    83
\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    84
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    85
syntax "_cartouche_string" :: "cartouche_position \<Rightarrow> string"  ("_")
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    86
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    87
parse_translation \<open>
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    88
  [(@{syntax_const "_cartouche_string"},
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    89
    K (string_tr (Symbol_Pos.cartouche_content o Symbol_Pos.explode)))]
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    90
\<close>
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    91
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    92
term "\<open>\<close>"
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    93
term "\<open>abc\<close>"
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    94
term "\<open>abc\<close> @ \<open>xyz\<close>"
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    95
term "\<open>\<newline>\<close>"
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    96
term "\<open>\001\010\100\<close>"
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    97
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    98
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
    99
subsection \<open>Alternate outer and inner syntax: string literals\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   100
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   101
subsubsection \<open>Nested quotes\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   102
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   103
syntax "_string_string" :: "string_position \<Rightarrow> string"  ("_")
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   104
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   105
parse_translation \<open>
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   106
  [(@{syntax_const "_string_string"}, K (string_tr Lexicon.explode_string))]
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   107
\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   108
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   109
term "\"\""
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   110
term "\"abc\""
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   111
term "\"abc\" @ \"xyz\""
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   112
term "\"\<newline>\""
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   113
term "\"\001\010\100\""
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   114
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   115
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   116
subsubsection \<open>Term cartouche and regular quotes\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   117
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   118
ML \<open>
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59809
diff changeset
   119
  Outer_Syntax.command @{command_keyword term_cartouche} ""
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   120
    (Parse.inner_syntax Parse.cartouche >> (fn s =>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   121
      Toplevel.keep (fn state =>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   122
        let
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   123
          val ctxt = Toplevel.context_of state;
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   124
          val t = Syntax.read_term ctxt s;
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   125
        in writeln (Syntax.string_of_term ctxt t) end)))
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   126
\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   127
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   128
term_cartouche \<open>""\<close>
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   129
term_cartouche \<open>"abc"\<close>
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   130
term_cartouche \<open>"abc" @ "xyz"\<close>
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   131
term_cartouche \<open>"\<newline>"\<close>
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   132
term_cartouche \<open>"\001\010\100"\<close>
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
   133
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   134
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   135
subsubsection \<open>Further nesting: antiquotations\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   136
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   137
setup -- "ML antiquotation"
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   138
\<open>
56072
31e427387ab5 tuned signature -- clarified module name;
wenzelm
parents: 55828
diff changeset
   139
  ML_Antiquotation.inline @{binding term_cartouche}
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   140
    (Args.context -- Scan.lift (Parse.inner_syntax Parse.cartouche) >>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   141
      (fn (ctxt, s) => ML_Syntax.atomic (ML_Syntax.print_term (Syntax.read_term ctxt s))))
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   142
\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   143
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   144
setup -- "document antiquotation"
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   145
\<open>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   146
  Thy_Output.antiquotation @{binding ML_cartouche}
59809
87641097d0f3 tuned signature;
wenzelm
parents: 59184
diff changeset
   147
    (Scan.lift Args.cartouche_input) (fn {context, ...} => fn source =>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   148
      let
59067
dd8ec9138112 tuned signature;
wenzelm
parents: 59064
diff changeset
   149
        val toks = ML_Lex.read "fn _ => (" @ ML_Lex.read_source false source @ ML_Lex.read ");";
59064
a8bcb5a446c8 more abstract type Input.source;
wenzelm
parents: 58999
diff changeset
   150
        val _ = ML_Context.eval_in (SOME context) ML_Compiler.flags (Input.pos_of source) toks;
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   151
      in "" end);
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   152
\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   153
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   154
ML \<open>
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   155
  @{term_cartouche \<open>""\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   156
  @{term_cartouche \<open>"abc"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   157
  @{term_cartouche \<open>"abc" @ "xyz"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   158
  @{term_cartouche \<open>"\<newline>"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   159
  @{term_cartouche \<open>"\001\010\100"\<close>};
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   160
\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   161
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   162
text \<open>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   163
  @{ML_cartouche
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   164
    \<open>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   165
      (
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   166
        @{term_cartouche \<open>""\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   167
        @{term_cartouche \<open>"abc"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   168
        @{term_cartouche \<open>"abc" @ "xyz"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   169
        @{term_cartouche \<open>"\<newline>"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   170
        @{term_cartouche \<open>"\001\010\100"\<close>}
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   171
      )
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   172
    \<close>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   173
  }
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   174
\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   175
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   176
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   177
subsubsection \<open>Uniform nesting of sub-languages: document source, ML, term, string literals\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   178
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   179
ML \<open>
55110
917e799f19da avoid breakdown of document preparation, which does not understand cartouche tokens yet;
wenzelm
parents: 55109
diff changeset
   180
  Outer_Syntax.command
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59809
diff changeset
   181
    @{command_keyword text_cartouche} ""
59809
87641097d0f3 tuned signature;
wenzelm
parents: 59184
diff changeset
   182
    (Parse.opt_target -- Parse.input Parse.cartouche >> Thy_Output.document_command)
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   183
\<close>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   184
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   185
text_cartouche
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   186
\<open>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   187
  @{ML_cartouche
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   188
    \<open>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   189
      (
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   190
        @{term_cartouche \<open>""\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   191
        @{term_cartouche \<open>"abc"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   192
        @{term_cartouche \<open>"abc" @ "xyz"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   193
        @{term_cartouche \<open>"\<newline>"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   194
        @{term_cartouche \<open>"\001\010\100"\<close>}
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   195
      )
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   196
    \<close>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   197
  }
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   198
\<close>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   199
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   200
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   201
subsection \<open>Proof method syntax: ML tactic expression\<close>
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   202
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   203
ML \<open>
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   204
structure ML_Tactic:
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   205
sig
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   206
  val set: (Proof.context -> tactic) -> Proof.context -> Proof.context
59064
a8bcb5a446c8 more abstract type Input.source;
wenzelm
parents: 58999
diff changeset
   207
  val ml_tactic: Input.source -> Proof.context -> tactic
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   208
end =
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   209
struct
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   210
  structure Data = Proof_Data(type T = Proof.context -> tactic fun init _ = K no_tac);
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   211
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   212
  val set = Data.put;
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   213
55828
42ac3cfb89f6 clarified language markup: added "delimited" property;
wenzelm
parents: 55133
diff changeset
   214
  fun ml_tactic source ctxt =
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   215
    let
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   216
      val ctxt' = ctxt |> Context.proof_map
59064
a8bcb5a446c8 more abstract type Input.source;
wenzelm
parents: 58999
diff changeset
   217
        (ML_Context.expression (Input.range_of source) "tactic" "Proof.context -> tactic"
58991
92b6f4e68c5a more careful ML source positions, for improved PIDE markup;
wenzelm
parents: 58978
diff changeset
   218
          "Context.map_proof (ML_Tactic.set tactic)"
59067
dd8ec9138112 tuned signature;
wenzelm
parents: 59064
diff changeset
   219
          (ML_Lex.read "fn ctxt: Proof.context =>" @ ML_Lex.read_source false source));
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   220
    in Data.get ctxt' ctxt end;
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   221
end;
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   222
\<close>
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   223
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   224
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   225
subsubsection \<open>Explicit version: method with cartouche argument\<close>
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   226
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   227
method_setup ml_tactic = \<open>
59809
87641097d0f3 tuned signature;
wenzelm
parents: 59184
diff changeset
   228
  Scan.lift Args.cartouche_input
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   229
    >> (fn arg => fn ctxt => SIMPLE_METHOD (ML_Tactic.ml_tactic arg ctxt))
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   230
\<close>
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   231
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   232
lemma "A \<and> B \<longrightarrow> B \<and> A"
60754
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   233
  apply (ml_tactic \<open>resolve_tac @{context} @{thms impI} 1\<close>)
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   234
  apply (ml_tactic \<open>eresolve_tac @{context} @{thms conjE} 1\<close>)
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   235
  apply (ml_tactic \<open>resolve_tac @{context} @{thms conjI} 1\<close>)
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   236
  apply (ml_tactic \<open>ALLGOALS (assume_tac @{context})\<close>)
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   237
  done
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   238
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   239
lemma "A \<and> B \<longrightarrow> B \<and> A" by (ml_tactic \<open>blast_tac ctxt 1\<close>)
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   240
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   241
ML \<open>@{lemma "A \<and> B \<longrightarrow> B \<and> A" by (ml_tactic \<open>blast_tac ctxt 1\<close>)}\<close>
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   242
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   243
text \<open>@{ML "@{lemma \"A \<and> B \<longrightarrow> B \<and> A\" by (ml_tactic \<open>blast_tac ctxt 1\<close>)}"}\<close>
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   244
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   245
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   246
subsubsection \<open>Implicit version: method with special name "cartouche" (dynamic!)\<close>
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   247
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   248
method_setup "cartouche" = \<open>
59809
87641097d0f3 tuned signature;
wenzelm
parents: 59184
diff changeset
   249
  Scan.lift Args.cartouche_input
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   250
    >> (fn arg => fn ctxt => SIMPLE_METHOD (ML_Tactic.ml_tactic arg ctxt))
59068
8606f2ee11b1 update_cartouches;
wenzelm
parents: 59067
diff changeset
   251
\<close>
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   252
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   253
lemma "A \<and> B \<longrightarrow> B \<and> A"
60754
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   254
  apply \<open>resolve_tac @{context} @{thms impI} 1\<close>
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   255
  apply \<open>eresolve_tac @{context} @{thms conjE} 1\<close>
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   256
  apply \<open>resolve_tac @{context} @{thms conjI} 1\<close>
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   257
  apply \<open>ALLGOALS (assume_tac @{context})\<close>
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   258
  done
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   259
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   260
lemma "A \<and> B \<longrightarrow> B \<and> A"
60754
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   261
  by (\<open>resolve_tac @{context} @{thms impI} 1\<close>,
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   262
    \<open>eresolve_tac @{context} @{thms conjE} 1\<close>,
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   263
    \<open>resolve_tac @{context} @{thms conjI} 1\<close>,
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60189
diff changeset
   264
    \<open>assume_tac @{context} 1\<close>+)
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   265
59112
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59089
diff changeset
   266
59128
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   267
subsection \<open>ML syntax\<close>
59112
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59089
diff changeset
   268
59128
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   269
text \<open>Input source with position information:\<close>
59112
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59089
diff changeset
   270
ML \<open>
59135
wenzelm
parents: 59128
diff changeset
   271
  val s: Input.source = \<open>abc123def456\<close>;
59184
830bb7ddb3ab explicit message channels for "state", "information";
wenzelm
parents: 59135
diff changeset
   272
  Output.information ("Look here!" ^ Position.here (Input.pos_of s));
59112
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59089
diff changeset
   273
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59089
diff changeset
   274
  \<open>abc123def456\<close> |> Input.source_explode |> List.app (fn (s, pos) =>
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59089
diff changeset
   275
    if Symbol.is_digit s then Position.report pos Markup.ML_numeral else ());
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59089
diff changeset
   276
\<close>
e670969f34df expand ML cartouches to Input.source;
wenzelm
parents: 59089
diff changeset
   277
59128
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   278
text \<open>Nested ML evaluation:\<close>
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   279
ML \<open>
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   280
  val ML = ML_Context.eval_source ML_Compiler.flags;
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   281
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   282
  ML \<open>ML \<open>val a = @{thm refl}\<close>\<close>;
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   283
  ML \<open>val b = @{thm sym}\<close>;
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   284
  val c = @{thm trans}
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   285
  val thms = [a, b, c];
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   286
\<close>
7b1931111e37 more examples;
wenzelm
parents: 59112
diff changeset
   287
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
   288
end