src/HOL/Main.thy
author berghofe
Fri, 19 Apr 2002 14:51:33 +0200
changeset 13093 ab0335307905
parent 12554 671b4d632c34
child 13367 ad307f0d80db
permissions -rw-r--r--
code generator: wfrec combinator is now implemented by ML function wf_rec.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10519
ade64af4c57c hide many names from Datatype_Universe.
nipkow
parents: 10386
diff changeset
     1
(*  Title:      HOL/Main.thy
ade64af4c57c hide many names from Datatype_Universe.
nipkow
parents: 10386
diff changeset
     2
    ID:         $Id$
12024
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
     3
    Author:     Stefan Berghofer, Tobias Nipkow and Markus Wenzel, TU Muenchen
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
10519
ade64af4c57c hide many names from Datatype_Universe.
nipkow
parents: 10386
diff changeset
     5
*)
9619
6125cc9efc18 fixed deps;
wenzelm
parents: 9447
diff changeset
     6
12024
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
     7
header {* Main HOL *}
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
     8
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
     9
theory Main = Map + Hilbert_Choice:
9650
6f0b89f2a1f9 Main now new-style theory; added Main.ML for compatibility;
wenzelm
parents: 9619
diff changeset
    10
12024
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    11
text {*
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    12
  Theory @{text Main} includes everything.  Note that theory @{text
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    13
  PreList} already includes most HOL theories.
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    14
*}
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    15
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    16
text {* Belongs to theory List. *}
10261
bb2f1e859177 tuned declarations;
wenzelm
parents: 9876
diff changeset
    17
declare lists_mono [mono]
bb2f1e859177 tuned declarations;
wenzelm
parents: 9876
diff changeset
    18
declare map_cong [recdef_cong]
10386
581a5a143994 provide case names for rev_induct, rev_cases;
wenzelm
parents: 10261
diff changeset
    19
lemmas rev_induct [case_names Nil snoc] = rev_induct
581a5a143994 provide case names for rev_induct, rev_cases;
wenzelm
parents: 10261
diff changeset
    20
  and rev_cases [case_names Nil snoc] = rev_exhaust
9768
a589b1d75b7b lemmas [mono] = lists_mono;
wenzelm
parents: 9650
diff changeset
    21
12024
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    22
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    23
subsection {* Characters and strings *}
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    24
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    25
datatype nibble =
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    26
    Nibble0 | Nibble1 | Nibble2 | Nibble3 | Nibble4 | Nibble5 | Nibble6 | Nibble7
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    27
  | Nibble8 | Nibble9 | NibbleA | NibbleB | NibbleC | NibbleD | NibbleE | NibbleF
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    28
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    29
datatype char = Char nibble nibble
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    30
  -- "Note: canonical order of character encoding coincides with standard term ordering"
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    31
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    32
types string = "char list"
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    33
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    34
syntax
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    35
  "_Char" :: "xstr => char"    ("CHR _")
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    36
  "_String" :: "xstr => string"    ("_")
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    37
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    38
parse_ast_translation {*
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    39
  let
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    40
    val constants = Syntax.Appl o map Syntax.Constant;
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    41
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    42
    fun mk_nib n = "Nibble" ^ chr (n + (if n <= 9 then ord "0" else ord "A" - 10));
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    43
    fun mk_char c =
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    44
      if Symbol.is_ascii c andalso Symbol.is_printable c then
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    45
        constants ["Char", mk_nib (ord c div 16), mk_nib (ord c mod 16)]
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    46
      else error ("Printable ASCII character expected: " ^ quote c);
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    47
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    48
    fun mk_string [] = Syntax.Constant "Nil"
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    49
      | mk_string (c :: cs) = Syntax.Appl [Syntax.Constant "Cons", mk_char c, mk_string cs];
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    50
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    51
    fun char_ast_tr [Syntax.Variable xstr] =
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    52
        (case Syntax.explode_xstr xstr of
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    53
          [c] => mk_char c
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    54
        | _ => error ("Single character expected: " ^ xstr))
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    55
      | char_ast_tr asts = raise AST ("char_ast_tr", asts);
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    56
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    57
    fun string_ast_tr [Syntax.Variable xstr] =
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    58
        (case Syntax.explode_xstr xstr of
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    59
          [] => constants [Syntax.constrainC, "Nil", "string"]
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    60
        | cs => mk_string cs)
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    61
      | string_ast_tr asts = raise AST ("string_tr", asts);
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    62
  in [("_Char", char_ast_tr), ("_String", string_ast_tr)] end;
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    63
*}
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    64
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    65
print_ast_translation {*
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    66
  let
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    67
    fun dest_nib (Syntax.Constant c) =
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    68
        (case explode c of
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    69
          ["N", "i", "b", "b", "l", "e", h] =>
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    70
            if "0" <= h andalso h <= "9" then ord h - ord "0"
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    71
            else if "A" <= h andalso h <= "F" then ord h - ord "A" + 10
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    72
            else raise Match
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    73
        | _ => raise Match)
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    74
      | dest_nib _ = raise Match;
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    75
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    76
    fun dest_chr c1 c2 =
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    77
      let val c = chr (dest_nib c1 * 16 + dest_nib c2)
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    78
      in if Symbol.is_printable c then c else raise Match end;
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    79
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    80
    fun dest_char (Syntax.Appl [Syntax.Constant "Char", c1, c2]) = dest_chr c1 c2
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    81
      | dest_char _ = raise Match;
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    82
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    83
    fun xstr cs = Syntax.Appl [Syntax.Constant "_xstr", Syntax.Variable (Syntax.implode_xstr cs)];
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    84
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    85
    fun char_ast_tr' [c1, c2] = Syntax.Appl [Syntax.Constant "_Char", xstr [dest_chr c1 c2]]
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    86
      | char_ast_tr' _ = raise Match;
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    87
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    88
    fun list_ast_tr' [args] = Syntax.Appl [Syntax.Constant "_String",
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    89
            xstr (map dest_char (Syntax.unfold_ast "_args" args))]
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    90
      | list_ast_tr' ts = raise Match;
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    91
  in [("Char", char_ast_tr'), ("@list", list_ast_tr')] end;
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    92
*}
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    93
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    94
b3661262541e moved String into Main;
wenzelm
parents: 11533
diff changeset
    95
subsection {* Configuration of the code generator *}
11533
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
    96
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
    97
types_code
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
    98
  "bool"  ("bool")
12439
e90a4f5a27f0 Tuned code generator setup.
berghofe
parents: 12024
diff changeset
    99
  "*"     ("(_ */ _)")
e90a4f5a27f0 Tuned code generator setup.
berghofe
parents: 12024
diff changeset
   100
  "list"  ("_ list")
11533
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   101
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   102
consts_code
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   103
  "op ="    ("(_ =/ _)")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   104
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   105
  "True"    ("true")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   106
  "False"   ("false")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   107
  "Not"     ("not")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   108
  "op |"    ("(_ orelse/ _)")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   109
  "op &"    ("(_ andalso/ _)")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   110
  "If"      ("(if _/ then _/ else _)")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   111
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   112
  "Pair"    ("(_,/ _)")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   113
  "fst"     ("fst")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   114
  "snd"     ("snd")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   115
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   116
  "Nil"     ("[]")
0c0d2332e8f0 Added code generator setup.
berghofe
parents: 11483
diff changeset
   117
  "Cons"    ("(_ ::/ _)")
12439
e90a4f5a27f0 Tuned code generator setup.
berghofe
parents: 12024
diff changeset
   118
13093
ab0335307905 code generator: wfrec combinator is now implemented by ML function wf_rec.
berghofe
parents: 12554
diff changeset
   119
  "wfrec"   ("wf'_rec?")
ab0335307905 code generator: wfrec combinator is now implemented by ML function wf_rec.
berghofe
parents: 12554
diff changeset
   120
ab0335307905 code generator: wfrec combinator is now implemented by ML function wf_rec.
berghofe
parents: 12554
diff changeset
   121
ML {* fun wf_rec f x = f (wf_rec f) x; *}
ab0335307905 code generator: wfrec combinator is now implemented by ML function wf_rec.
berghofe
parents: 12554
diff changeset
   122
12554
671b4d632c34 Declared characteristic equations for < on nat for code generation.
berghofe
parents: 12439
diff changeset
   123
lemma [code]: "((n::nat) < 0) = False" by simp
671b4d632c34 Declared characteristic equations for < on nat for code generation.
berghofe
parents: 12439
diff changeset
   124
declare less_Suc_eq [code]
671b4d632c34 Declared characteristic equations for < on nat for code generation.
berghofe
parents: 12439
diff changeset
   125
9650
6f0b89f2a1f9 Main now new-style theory; added Main.ML for compatibility;
wenzelm
parents: 9619
diff changeset
   126
end