src/HOL/ex/Commands.thy
author wenzelm
Mon, 06 Apr 2015 17:06:48 +0200
changeset 59936 b8ffc3dc9e24
parent 59090 a0a05a4edb36
child 67096 e77f13a6a501
permissions -rw-r--r--
@{command_spec} is superseded by @{command_keyword};
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;
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    23
      in Pretty.writeln (Syntax.pretty_term ctxt t) end)));
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    24
\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    25
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    26
print_test x
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    27
print_test "\<lambda>x. x = a"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    28
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    29
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    30
subsection \<open>Old-style global theory declaration\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    31
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    32
ML \<open>
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59090
diff changeset
    33
  Outer_Syntax.command @{command_keyword global_test} "test constant declaration"
59090
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    34
    (Parse.binding >> (fn b => Toplevel.theory (fn thy =>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    35
      let
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    36
        val thy' = Sign.add_consts [(b, @{typ 'a}, NoSyn)] thy;
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    37
      in thy' end)));
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    38
\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    39
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    40
global_test a
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    41
global_test b
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    42
print_test a
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    43
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    44
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    45
subsection \<open>Local theory specification\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    46
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    47
ML \<open>
59936
b8ffc3dc9e24 @{command_spec} is superseded by @{command_keyword};
wenzelm
parents: 59090
diff changeset
    48
  Outer_Syntax.local_theory @{command_keyword local_test} "test local definition"
59090
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    49
    (Parse.binding -- (@{keyword "="} |-- Parse.term) >> (fn (b, s) => fn lthy =>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    50
      let
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    51
        val t = Syntax.read_term lthy s;
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    52
        val (def, lthy') = Local_Theory.define ((b, NoSyn), ((Thm.def_binding b, []), t)) lthy;
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    53
      in lthy' end));
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    54
\<close>
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    55
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    56
local_test true = True
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    57
print_test true
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    58
thm true_def
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    59
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    60
local_test identity = "\<lambda>x. x"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    61
print_test "identity x"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    62
thm identity_def
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    63
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    64
context fixes x y :: nat
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    65
begin
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    66
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    67
local_test test = "x + y"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    68
print_test test
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    69
thm test_def
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    70
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    71
end
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    72
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    73
print_test "test 0 1"
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    74
thm test_def
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    75
a0a05a4edb36 more examples;
wenzelm
parents:
diff changeset
    76
end