src/HOL/Library/MLString.thy
author wenzelm
Fri, 13 Apr 2007 21:26:35 +0200
changeset 22665 cf152ff55d16
parent 22552 70f5cf8a0fad
child 22799 ed7d53db2170
permissions -rw-r--r--
tuned document (headers, sections, spacing);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     1
(*  ID:         $Id$
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     3
*)
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     4
22665
cf152ff55d16 tuned document (headers, sections, spacing);
wenzelm
parents: 22552
diff changeset
     5
header {* Monolithic strings for ML *}
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     6
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     7
theory MLString
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
     8
imports List
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     9
begin
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    10
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    11
subsection {* Motivation *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    12
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    13
text {*
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    14
  Strings are represented in HOL as list of characters.
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    15
  For code generation to Haskell, this is no problem
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    16
  since in Haskell "abc" is equivalent to ['a', 'b', 'c'].
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    17
  On the other hand, in ML all strings have to
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    18
  be represented as list of characters which
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    19
  is awkward to read. This theory provides a distinguished
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    20
  datatype for strings which then by convention
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    21
  are serialized as monolithic ML strings. Note
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    22
  that in Haskell these strings are identified
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    23
  with Haskell strings.
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    24
*}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    25
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    26
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    27
subsection {* Datatype of monolithic strings *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    28
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    29
datatype ml_string = STR string
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    30
22520
haftmann
parents: 22016
diff changeset
    31
fun
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    32
  explode :: "ml_string \<Rightarrow> string"
22520
haftmann
parents: 22016
diff changeset
    33
where
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    34
  "explode (STR s) = s"
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    35
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    36
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    37
subsection {* ML interface *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    38
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    39
ML {*
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    40
structure MLString =
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    41
struct
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    42
22520
haftmann
parents: 22016
diff changeset
    43
fun mk s = @{term STR} $ HOLogic.mk_string s;
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    44
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    45
end;
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    46
*}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    47
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    48
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    49
subsection {* Code serialization *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    50
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    51
code_type ml_string
21113
5b76e541cc0a adapted to new serializer syntax
haftmann
parents: 21079
diff changeset
    52
  (SML "string")
5b76e541cc0a adapted to new serializer syntax
haftmann
parents: 21079
diff changeset
    53
  (Haskell "String")
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    54
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    55
code_const STR
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    56
  (Haskell "_")
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    57
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    58
setup {*
21756
09f62e99859e ML_Syntax.print_XXX;
wenzelm
parents: 21455
diff changeset
    59
  CodegenSerializer.add_pretty_ml_string "SML"
22520
haftmann
parents: 22016
diff changeset
    60
    @{const_name Nil} @{const_name Cons} @{const_name STR}
21756
09f62e99859e ML_Syntax.print_XXX;
wenzelm
parents: 21455
diff changeset
    61
    ML_Syntax.print_char ML_Syntax.print_string "String.implode"
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    62
*}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    63
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    64
code_const explode
21113
5b76e541cc0a adapted to new serializer syntax
haftmann
parents: 21079
diff changeset
    65
  (SML "String.explode")
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    66
  (Haskell "_")
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    67
21079
747d716e98d0 added reserved words for Haskell
haftmann
parents: 20699
diff changeset
    68
code_reserved SML string explode
747d716e98d0 added reserved words for Haskell
haftmann
parents: 20699
diff changeset
    69
22552
70f5cf8a0fad equality on strings
haftmann
parents: 22520
diff changeset
    70
code_const "op = \<Colon> ml_string \<Rightarrow> ml_string \<Rightarrow> bool"
70f5cf8a0fad equality on strings
haftmann
parents: 22520
diff changeset
    71
  (SML "!((_ : string) = _)")
70f5cf8a0fad equality on strings
haftmann
parents: 22520
diff changeset
    72
  (Haskell infixl 4 "==")
70f5cf8a0fad equality on strings
haftmann
parents: 22520
diff changeset
    73
70f5cf8a0fad equality on strings
haftmann
parents: 22520
diff changeset
    74
code_instance ml_string :: eq (Haskell -)
70f5cf8a0fad equality on strings
haftmann
parents: 22520
diff changeset
    75
22016
e086b4e846b8 dealing with ml_string combinators
haftmann
parents: 21910
diff changeset
    76
text {* disable something ugly *}
e086b4e846b8 dealing with ml_string combinators
haftmann
parents: 21910
diff changeset
    77
e086b4e846b8 dealing with ml_string combinators
haftmann
parents: 21910
diff changeset
    78
code_const "ml_string_rec" and "ml_string_case" and "size \<Colon> ml_string \<Rightarrow> nat"
e086b4e846b8 dealing with ml_string combinators
haftmann
parents: 21910
diff changeset
    79
  (SML "!((_); (_); raise Fail \"ml'_string'_rec\")"
e086b4e846b8 dealing with ml_string combinators
haftmann
parents: 21910
diff changeset
    80
    and "!((_); (_); raise Fail \"ml'_string'_case\")"
e086b4e846b8 dealing with ml_string combinators
haftmann
parents: 21910
diff changeset
    81
    and "!((_); raise Fail \"size'_ml'_string\")")
e086b4e846b8 dealing with ml_string combinators
haftmann
parents: 21910
diff changeset
    82
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    83
end