src/HOL/ex/ML.thy
author wenzelm
Sun, 02 Nov 2014 18:21:45 +0100
changeset 58889 5b7a9633cfa8
parent 58616 4257a7f2bf39
child 61757 0d399131008f
permissions -rw-r--r--
modernized header uniformly as section;
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
58889
5b7a9633cfa8 modernized header uniformly as section;
wenzelm
parents: 58616
diff changeset
     5
section \<open>Isabelle/ML basics\<close>
53935
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
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    11
section \<open>ML expressions\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    12
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    13
text \<open>
53935
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.
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    21
\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    22
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    23
ML \<open>1 + 1\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    24
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    25
ML \<open>val a = 1\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    26
ML \<open>val b = 1\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    27
ML \<open>val c = a + b\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    28
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    29
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    30
section \<open>Antiquotations\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    31
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    32
text \<open>There are some language extensions (via antiquotations), as explained in
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    33
  the ``Isabelle/Isar implementation manual'', chapter 0.\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    34
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    35
ML \<open>length []\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    36
ML \<open>@{assert} (length [] = 0)\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    37
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    38
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    39
text \<open>Formal entities from the surrounding context may be referenced as
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    40
  follows:\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    41
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    42
term "1 + 1"   -- \<open>term within theory source\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    43
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    44
ML \<open>@{term "1 + 1"}   (* term as symbolic ML datatype value *)\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    45
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    46
ML \<open>@{term "1 + (1::int)"}\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    47
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    48
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    49
section \<open>IDE support\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    50
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    51
text \<open>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    52
  ML embedded into the Isabelle environment is connected to the Prover IDE.
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    53
  Poly/ML provides:
53948
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    54
  \begin{itemize}
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    55
    \item precise positions for warnings / errors
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    56
    \item markup for defining positions of identifiers
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    57
    \item markup for inferred types of sub-expressions
2a4c156e6d36 proper latex;
wenzelm
parents: 53935
diff changeset
    58
  \end{itemize}
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    59
\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    60
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    61
ML \<open>fn i => fn list => length list + i\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    62
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    63
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    64
section \<open>Example: factorial and ackermann function in Isabelle/ML\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    65
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    66
ML \<open>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    67
  fun factorial 0 = 1
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    68
    | factorial n = n * factorial (n - 1)
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    69
\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    70
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    71
ML \<open>factorial 42\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    72
ML \<open>factorial 10000 div factorial 9999\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    73
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    74
text \<open>See @{url "http://mathworld.wolfram.com/AckermannFunction.html"}\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    75
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    76
ML \<open>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    77
  fun ackermann 0 n = n + 1
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    78
    | ackermann m 0 = ackermann (m - 1) 1
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    79
    | ackermann m n = ackermann (m - 1) (ackermann m (n - 1))
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    80
\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    81
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    82
ML \<open>timeit (fn () => ackermann 3 10)\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    83
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    84
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    85
section \<open>Parallel Isabelle/ML\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    86
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    87
text \<open>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    88
  Future.fork/join/cancel manage parallel evaluation.
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    89
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    90
  Note that within Isabelle theory documents, the top-level command boundary may
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    91
  not be transgressed without special precautions. This is normally managed by
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    92
  the system when performing parallel proof checking.\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    93
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    94
ML \<open>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    95
  val x = Future.fork (fn () => ackermann 3 10);
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    96
  val y = Future.fork (fn () => ackermann 3 10);
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    97
  val z = Future.join x + Future.join y
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
    98
\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
    99
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   100
text \<open>The @{ML_structure Par_List} module provides high-level combinators
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   101
  for parallel list operations.\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   102
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   103
ML \<open>timeit (fn () => map (fn n => ackermann 3 n) (1 upto 10))\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   104
ML \<open>timeit (fn () => Par_List.map (fn n => ackermann 3 n) (1 upto 10))\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   105
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   106
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   107
section \<open>Function specifications in Isabelle/HOL\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   108
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   109
fun factorial :: "nat \<Rightarrow> nat"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   110
where
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   111
  "factorial 0 = 1"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   112
| "factorial (Suc n) = Suc n * factorial n"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   113
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   114
term "factorial 4"  -- \<open>symbolic term\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   115
value "factorial 4"  -- \<open>evaluation via ML code generation in the background\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   116
56279
b4d874f6c6be clarified options ML_source_trace and ML_exception_trace (NB: the latter needs to be a system option, since the context is sometimes not available, e.g. for 'theory' command);
wenzelm
parents: 55837
diff changeset
   117
declare [[ML_source_trace]]
58616
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   118
ML \<open>@{term "factorial 4"}\<close>  -- \<open>symbolic term in ML\<close>
4257a7f2bf39 more cartouches;
wenzelm
parents: 56279
diff changeset
   119
ML \<open>@{code "factorial"}\<close>  -- \<open>ML code from function specification\<close>
53935
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   120
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   121
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   122
fun ackermann :: "nat \<Rightarrow> nat \<Rightarrow> nat"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   123
where
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   124
  "ackermann 0 n = n + 1"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   125
| "ackermann (Suc m) 0 = ackermann m 1"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   126
| "ackermann (Suc m) (Suc n) = ackermann m (ackermann (Suc m) n)"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   127
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   128
value "ackermann 3 5"
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   129
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   130
end
59c6dbdf0a38 added Isabelle/ML example;
wenzelm
parents:
diff changeset
   131