src/HOL/ex/Commands.thy
author wenzelm
Mon, 27 Nov 2017 11:45:20 +0100
changeset 67096 e77f13a6a501
parent 59936 b8ffc3dc9e24
child 69597 ff784d5a5bfb
permissions -rw-r--r--
proper context (as in 'term' command);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59090
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/ex/Commands.thy
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     3
*)
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     4
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     5
section \<open>Some Isar command definitions\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     6
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     7
theory Commands
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     8
imports Main
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
     9
keywords
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    10
  "print_test" :: diag and
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    11
  "global_test" :: thy_decl and
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    12
  "local_test" :: thy_decl
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    13
begin
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    14
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    15
subsection \<open>Diagnostic command: no state change\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    16
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    17
ML \<open>
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59090
diff changeset
    18
  Outer_Syntax.command @{command_keyword print_test} "print term test"
59090
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    19
    (Parse.term >> (fn s => Toplevel.keep (fn st =>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    20
      let
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    21
        val ctxt = Toplevel.context_of st;
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    22
        val t = Syntax.read_term ctxt s;
67096
e77f13a6a501 proper context (as in 'term' command);
wenzelm
parents: 59936
diff changeset
    23
        val ctxt' = Variable.auto_fixes t ctxt;
e77f13a6a501 proper context (as in 'term' command);
wenzelm
parents: 59936
diff changeset
    24
      in Pretty.writeln (Syntax.pretty_term ctxt' t) end)));
59090
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    25
\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    26
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    27
print_test x
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    28
print_test "\<lambda>x. x = a"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    29
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    30
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    31
subsection \<open>Old-style global theory declaration\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    32
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    33
ML \<open>
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59090
diff changeset
    34
  Outer_Syntax.command @{command_keyword global_test} "test constant declaration"
59090
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    35
    (Parse.binding >> (fn b => Toplevel.theory (fn thy =>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    36
      let
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    37
        val thy' = Sign.add_consts [(b, @{typ 'a}, NoSyn)] thy;
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    38
      in thy' end)));
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    39
\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    40
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    41
global_test a
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    42
global_test b
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    43
print_test a
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    44
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    45
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    46
subsection \<open>Local theory specification\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    47
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    48
ML \<open>
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59090
diff changeset
    49
  Outer_Syntax.local_theory @{command_keyword local_test} "test local definition"
59090
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    50
    (Parse.binding -- (@{keyword "="} |-- Parse.term) >> (fn (b, s) => fn lthy =>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    51
      let
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    52
        val t = Syntax.read_term lthy s;
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    53
        val (def, lthy') = Local_Theory.define ((b, NoSyn), ((Thm.def_binding b, []), t)) lthy;
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    54
      in lthy' end));
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    55
\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    56
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    57
local_test true = True
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    58
print_test true
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    59
thm true_def
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    60
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    61
local_test identity = "\<lambda>x. x"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    62
print_test "identity x"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    63
thm identity_def
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    64
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    65
context fixes x y :: nat
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    66
begin
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    67
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    68
local_test test = "x + y"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    69
print_test test
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    70
thm test_def
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    71
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    72
end
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    73
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    74
print_test "test 0 1"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    75
thm test_def
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    76
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    77
end