src/HOL/ex/ML.thy
author wenzelm
Mon, 09 Dec 2013 12:22:23 +0100
changeset 54703 499f92dc6e45
parent 53948 2a4c156e6d36
child 55837 154855d9a564
permissions -rw-r--r--
more antiquotations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/ex/ML.thy
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     3
*)
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     4
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     5
header {* Isabelle/ML basics *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     6
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     7
theory "ML"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     8
imports Main
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
     9
begin
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    10
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    11
section {* ML expressions *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    12
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    13
text {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    14
  The Isabelle command 'ML' allows to embed Isabelle/ML source into the formal
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    15
  text. It is type-checked, compiled, and run within that environment.
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    16
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    17
  Note that side-effects should be avoided, unless the intention is to change
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    18
  global parameters of the run-time environment (rare).
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    19
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    20
  ML top-level bindings are managed within the theory context.
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    21
*}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    22
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    23
ML {* 1 + 1 *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    24
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    25
ML {* val a = 1 *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    26
ML {* val b = 1 *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    27
ML {* val c = a + b *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    28
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    29
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    30
section {* Antiquotations *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    31
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    32
text {* There are some language extensions (via antiquotations), as explained in
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    33
  the "Isabelle/Isar implementation manual", chapter 0. *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    34
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    35
ML {* length [] *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    36
ML {* @{assert} (length [] = 0) *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    37
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    38
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    39
text {* Formal entities from the surrounding context may be referenced as
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    40
  follows: *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    41
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    42
term "1 + 1"   -- "term within theory source"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    43
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    44
ML {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    45
  @{term "1 + 1"}   (* term as symbolic ML datatype value *)
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    46
*}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    47
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    48
ML {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    49
  @{term "1 + (1::int)"}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    50
*}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    51
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    52
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    53
section {* IDE support *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    54
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    55
text {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    56
  ML embedded into the Isabelle environment is connected to the Prover IDE.
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    57
  Poly/ML provides:
53948
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    58
  \begin{itemize}
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    59
    \item precise positions for warnings / errors
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    60
    \item markup for defining positions of identifiers
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    61
    \item markup for inferred types of sub-expressions
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    62
  \end{itemize}
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    63
*}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    64
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    65
ML {* fn i => fn list => length list + i *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    66
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    67
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    68
section {* Example: factorial and ackermann function in Isabelle/ML *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    69
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    70
ML {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    71
  fun factorial 0 = 1
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    72
    | factorial n = n * factorial (n - 1)
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    73
*}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    74
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    75
ML "factorial 42"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    76
ML "factorial 10000 div factorial 9999"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    77
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    78
text {*
54703
499f92dc6e45 more antiquotations;
wenzelm
parents: 53948
diff changeset
    79
  See @{url "http://mathworld.wolfram.com/AckermannFunction.html"}
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    80
*}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    81
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    82
ML {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    83
  fun ackermann 0 n = n + 1
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    84
    | ackermann m 0 = ackermann (m - 1) 1
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    85
    | ackermann m n = ackermann (m - 1) (ackermann m (n - 1))
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    86
*}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    87
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    88
ML {* timeit (fn () => ackermann 3 10) *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    89
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    90
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    91
section {* Parallel Isabelle/ML *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    92
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    93
text {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    94
  Future.fork/join/cancel manage parallel evaluation.
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    95
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    96
  Note that within Isabelle theory documents, the top-level command boundary may
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    97
  not be transgressed without special precautions. This is normally managed by
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    98
  the system when performing parallel proof checking. *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    99
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   100
ML {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   101
  val x = Future.fork (fn () => ackermann 3 10);
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   102
  val y = Future.fork (fn () => ackermann 3 10);
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   103
  val z = Future.join x + Future.join y
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   104
*}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   105
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   106
text {*
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   107
  The @{ML_struct Par_List} module provides high-level combinators for
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   108
  parallel list operations. *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   109
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   110
ML {* timeit (fn () => map (fn n => ackermann 3 n) (1 upto 10)) *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   111
ML {* timeit (fn () => Par_List.map (fn n => ackermann 3 n) (1 upto 10)) *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   112
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   113
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   114
section {* Function specifications in Isabelle/HOL *}
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   115
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   116
fun factorial :: "nat \<Rightarrow> nat"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   117
where
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   118
  "factorial 0 = 1"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   119
| "factorial (Suc n) = Suc n * factorial n"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   120
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   121
term "factorial 4"  -- "symbolic term"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   122
value "factorial 4"  -- "evaluation via ML code generation in the background"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   123
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   124
declare [[ML_trace]]
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   125
ML {* @{term "factorial 4"} *}  -- "symbolic term in ML"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   126
ML {* @{code "factorial"} *}  -- "ML code from function specification"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   127
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   128
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   129
fun ackermann :: "nat \<Rightarrow> nat \<Rightarrow> nat"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   130
where
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   131
  "ackermann 0 n = n + 1"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   132
| "ackermann (Suc m) 0 = ackermann m 1"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   133
| "ackermann (Suc m) (Suc n) = ackermann m (ackermann (Suc m) n)"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   134
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   135
value "ackermann 3 5"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   136
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   137
end
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   138