src/HOL/ex/Cartouche_Examples.thy
author wenzelm
Wed, 12 Mar 2014 22:57:50 +0100
changeset 56072 31e427387ab5
parent 55828 42ac3cfb89f6
child 56275 600f432ab556
permissions -rw-r--r--
tuned signature -- clarified module name;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     1
header {* Some examples with text cartouches *}
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     2
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     3
theory Cartouche_Examples
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     4
imports Main
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
     5
keywords
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
     6
  "cartouche" "term_cartouche" :: diag and
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
     7
  "text_cartouche" :: thy_decl
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     8
begin
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
     9
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    10
subsection {* Outer syntax: cartouche within command syntax *}
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    11
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    12
ML {*
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    13
  Outer_Syntax.improper_command @{command_spec "cartouche"} ""
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    14
    (Parse.cartouche >> (fn s =>
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    15
      Toplevel.imperative (fn () => writeln s)))
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    16
*}
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    17
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    18
cartouche \<open>abc\<close>
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    19
cartouche \<open>abc \<open>\<alpha>\<beta>\<gamma>\<close> xzy\<close>
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    20
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    21
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    22
subsection {* Inner syntax: string literals via cartouche *}
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    23
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    24
ML {*
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    25
  local
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    26
    val mk_nib =
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    27
      Syntax.const o Lexicon.mark_const o
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    28
        fst o Term.dest_Const o HOLogic.mk_nibble;
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    29
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    30
    fun mk_char (s, pos) =
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    31
      let
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    32
        val c =
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    33
          if Symbol.is_ascii s then ord s
55036
87797f8f3152 proper \<newline>;
wenzelm
parents: 55033
diff changeset
    34
          else if s = "\<newline>" then 10
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    35
          else error ("String literal contains illegal symbol: " ^ quote s ^ Position.here pos);
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    36
      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
    37
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    38
    fun mk_string [] = Const (@{const_syntax Nil}, @{typ string})
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    39
      | mk_string (s :: ss) =
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    40
          Syntax.const @{const_syntax Cons} $ mk_char s $ mk_string ss;
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    41
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    42
  in
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    43
    fun string_tr content args =
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    44
      let fun err () = raise TERM ("string_tr", args) in
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    45
        (case args of
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    46
          [(c as Const (@{syntax_const "_constrain"}, _)) $ Free (s, _) $ p] =>
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    47
            (case Term_Position.decode_position p of
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    48
              SOME (pos, _) => c $ mk_string (content (s, pos)) $ p
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    49
            | NONE => err ())
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    50
        | _ => err ())
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    51
      end;
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    52
  end;
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    53
*}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    54
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    55
syntax "_cartouche_string" :: "cartouche_position \<Rightarrow> string"  ("_")
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    56
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    57
parse_translation {*
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    58
  [(@{syntax_const "_cartouche_string"},
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    59
    K (string_tr (Symbol_Pos.cartouche_content o Symbol_Pos.explode)))]
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    60
*}
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
    61
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    62
term "\<open>\<close>"
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    63
term "\<open>abc\<close>"
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    64
term "\<open>abc\<close> @ \<open>xyz\<close>"
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    65
term "\<open>\<newline>\<close>"
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    66
term "\<open>\001\010\100\<close>"
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    67
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    68
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    69
subsection {* Alternate outer and inner syntax: string literals *}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    70
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    71
subsubsection {* Nested quotes *}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    72
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    73
syntax "_string_string" :: "string_position \<Rightarrow> string"  ("_")
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    74
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    75
parse_translation {*
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    76
  [(@{syntax_const "_string_string"}, K (string_tr Lexicon.explode_string))]
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    77
*}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    78
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    79
term "\"\""
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    80
term "\"abc\""
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    81
term "\"abc\" @ \"xyz\""
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    82
term "\"\<newline>\""
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    83
term "\"\001\010\100\""
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    84
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    85
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    86
subsubsection {* Term cartouche and regular quotes *}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    87
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    88
ML {*
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    89
  Outer_Syntax.improper_command @{command_spec "term_cartouche"} ""
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    90
    (Parse.inner_syntax Parse.cartouche >> (fn s =>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    91
      Toplevel.keep (fn state =>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    92
        let
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    93
          val ctxt = Toplevel.context_of state;
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    94
          val t = Syntax.read_term ctxt s;
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    95
        in writeln (Syntax.string_of_term ctxt t) end)))
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    96
*}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
    97
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    98
term_cartouche \<open>""\<close>
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
    99
term_cartouche \<open>"abc"\<close>
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   100
term_cartouche \<open>"abc" @ "xyz"\<close>
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   101
term_cartouche \<open>"\<newline>"\<close>
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   102
term_cartouche \<open>"\001\010\100"\<close>
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
   103
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   104
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   105
subsubsection {* Further nesting: antiquotations *}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   106
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   107
setup -- "ML antiquotation"
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   108
{*
56072
31e427387ab5 tuned signature -- clarified module name;
wenzelm
parents: 55828
diff changeset
   109
  ML_Antiquotation.inline @{binding term_cartouche}
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   110
    (Args.context -- Scan.lift (Parse.inner_syntax Parse.cartouche) >>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   111
      (fn (ctxt, s) => ML_Syntax.atomic (ML_Syntax.print_term (Syntax.read_term ctxt s))))
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   112
*}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   113
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   114
setup -- "document antiquotation"
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   115
{*
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   116
  Thy_Output.antiquotation @{binding ML_cartouche}
55828
42ac3cfb89f6 clarified language markup: added "delimited" property;
wenzelm
parents: 55133
diff changeset
   117
    (Scan.lift Args.cartouche_source_position) (fn {context, ...} => fn source =>
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   118
      let
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   119
        val toks =
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   120
          ML_Lex.read Position.none "fn _ => (" @
55828
42ac3cfb89f6 clarified language markup: added "delimited" property;
wenzelm
parents: 55133
diff changeset
   121
          ML_Lex.read_source source @
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   122
          ML_Lex.read Position.none ");";
55828
42ac3cfb89f6 clarified language markup: added "delimited" property;
wenzelm
parents: 55133
diff changeset
   123
        val _ = ML_Context.eval_in (SOME context) false (#pos source) toks;
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   124
      in "" end);
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   125
*}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   126
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   127
ML {*
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>};
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   133
*}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   134
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   135
text {*
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   136
  @{ML_cartouche
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   137
    \<open>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   138
      (
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   139
        @{term_cartouche \<open>""\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   140
        @{term_cartouche \<open>"abc"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   141
        @{term_cartouche \<open>"abc" @ "xyz"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   142
        @{term_cartouche \<open>"\<newline>"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   143
        @{term_cartouche \<open>"\001\010\100"\<close>}
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   144
      )
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   145
    \<close>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   146
  }
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   147
*}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   148
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   149
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   150
subsubsection {* Uniform nesting of sub-languages: document source, ML, term, string literals *}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   151
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   152
ML {*
55110
917e799f19da avoid breakdown of document preparation, which does not understand cartouche tokens yet;
wenzelm
parents: 55109
diff changeset
   153
  Outer_Syntax.command
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   154
    @{command_spec "text_cartouche"} ""
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   155
    (Parse.opt_target -- Parse.source_position Parse.cartouche >> Isar_Cmd.local_theory_markup)
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   156
*}
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   157
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   158
text_cartouche
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   159
\<open>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   160
  @{ML_cartouche
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   161
    \<open>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   162
      (
55133
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   163
        @{term_cartouche \<open>""\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   164
        @{term_cartouche \<open>"abc"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   165
        @{term_cartouche \<open>"abc" @ "xyz"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   166
        @{term_cartouche \<open>"\<newline>"\<close>};
687656233ad8 simplified inner syntax;
wenzelm
parents: 55110
diff changeset
   167
        @{term_cartouche \<open>"\001\010\100"\<close>}
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   168
      )
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   169
    \<close>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   170
  }
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   171
\<close>
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   172
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   173
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   174
subsection {* Proof method syntax: ML tactic expression *}
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   175
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   176
ML {*
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   177
structure ML_Tactic:
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   178
sig
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   179
  val set: (Proof.context -> tactic) -> Proof.context -> Proof.context
55828
42ac3cfb89f6 clarified language markup: added "delimited" property;
wenzelm
parents: 55133
diff changeset
   180
  val ml_tactic: Symbol_Pos.source -> Proof.context -> tactic
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   181
end =
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   182
struct
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   183
  structure Data = Proof_Data(type T = Proof.context -> tactic fun init _ = K no_tac);
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   184
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   185
  val set = Data.put;
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   186
55828
42ac3cfb89f6 clarified language markup: added "delimited" property;
wenzelm
parents: 55133
diff changeset
   187
  fun ml_tactic source ctxt =
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   188
    let
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   189
      val ctxt' = ctxt |> Context.proof_map
55828
42ac3cfb89f6 clarified language markup: added "delimited" property;
wenzelm
parents: 55133
diff changeset
   190
        (ML_Context.expression (#pos source)
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   191
          "fun tactic (ctxt : Proof.context) : tactic"
55828
42ac3cfb89f6 clarified language markup: added "delimited" property;
wenzelm
parents: 55133
diff changeset
   192
          "Context.map_proof (ML_Tactic.set tactic)" (ML_Lex.read_source source));
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   193
    in Data.get ctxt' ctxt end;
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   194
end;
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   195
*}
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   196
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   197
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   198
subsubsection {* Explicit version: method with cartouche argument *}
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   199
55047
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   200
method_setup ml_tactic = {*
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   201
  Scan.lift Args.cartouche_source_position
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   202
    >> (fn arg => fn ctxt => SIMPLE_METHOD (ML_Tactic.ml_tactic arg ctxt))
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   203
*}
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   204
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   205
lemma "A \<and> B \<longrightarrow> B \<and> A"
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   206
  apply (ml_tactic \<open>rtac @{thm impI} 1\<close>)
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   207
  apply (ml_tactic \<open>etac @{thm conjE} 1\<close>)
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   208
  apply (ml_tactic \<open>rtac @{thm conjI} 1\<close>)
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   209
  apply (ml_tactic \<open>ALLGOALS atac\<close>)
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   210
  done
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   211
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   212
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
   213
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   214
ML {* @{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
   215
660398f1d806 more examples;
wenzelm
parents: 55036
diff changeset
   216
text {* @{ML "@{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
   217
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   218
55109
ecff9e26360c more cartouche examples, including uniform nesting of sub-languages;
wenzelm
parents: 55048
diff changeset
   219
subsubsection {* Implicit version: method with special name "cartouche" (dynamic!) *}
55048
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   220
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   221
method_setup "cartouche" = {*
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   222
  Scan.lift Args.cartouche_source_position
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   223
    >> (fn arg => fn ctxt => SIMPLE_METHOD (ML_Tactic.ml_tactic arg ctxt))
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   224
*}
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   225
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   226
lemma "A \<and> B \<longrightarrow> B \<and> A"
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   227
  apply \<open>rtac @{thm impI} 1\<close>
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   228
  apply \<open>etac @{thm conjE} 1\<close>
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   229
  apply \<open>rtac @{thm conjI} 1\<close>
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   230
  apply \<open>ALLGOALS atac\<close>
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   231
  done
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   232
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   233
lemma "A \<and> B \<longrightarrow> B \<and> A"
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   234
  by (\<open>rtac @{thm impI} 1\<close>, \<open>etac @{thm conjE} 1\<close>, \<open>rtac @{thm conjI} 1\<close>, \<open>atac 1\<close>+)
ce34a2934386 implicit "cartouche" method (experimental, undocumented);
wenzelm
parents: 55047
diff changeset
   235
55033
8e8243975860 support for nested text cartouches;
wenzelm
parents:
diff changeset
   236
end