diff --git a/src/HOL/Examples/ML.thy b/src/HOL/Examples/ML.thy --- a/src/HOL/Examples/ML.thy +++ b/src/HOL/Examples/ML.thy @@ -1,157 +1,157 @@ (* Title: HOL/Examples/ML.thy Author: Makarius *) section \Isabelle/ML basics\ theory "ML" -imports Main + imports Main begin subsection \ML expressions\ text \ The Isabelle command \<^theory_text>\ML\ allows to embed Isabelle/ML source into the formal text. It is type-checked, compiled, and run within that environment. Note that side-effects should be avoided, unless the intention is to change global parameters of the run-time environment (rare). ML top-level bindings are managed within the theory context. \ ML \1 + 1\ ML \val a = 1\ ML \val b = 1\ ML \val c = a + b\ subsection \Antiquotations\ text \ There are some language extensions (via antiquotations), as explained in the ``Isabelle/Isar implementation manual'', chapter 0. \ ML \length []\ ML \\<^assert> (length [] = 0)\ text \Formal entities from the surrounding context may be referenced as follows:\ term "1 + 1" \ \term within theory source\ ML \\<^term>\1 + 1\ (* term as symbolic ML datatype value *)\ ML \\<^term>\1 + (1::int)\\ ML \ (* formal source with position information *) val s = \1 + 1\; (* read term via old-style string interface *) val t = Syntax.read_term \<^context> (Syntax.implode_input s); \ subsection \Recursive ML evaluation\ ML \ ML \ML \val a = @{thm refl}\\; ML \val b = @{thm sym}\; val c = @{thm trans} val thms = [a, b, c]; \ subsection \IDE support\ text \ ML embedded into the Isabelle environment is connected to the Prover IDE. Poly/ML provides: \<^item> precise positions for warnings / errors \<^item> markup for defining positions of identifiers \<^item> markup for inferred types of sub-expressions \<^item> pretty-printing of ML values with markup \<^item> completion of ML names \<^item> source-level debugger \ ML \fn i => fn list => length list + i\ subsection \Example: factorial and ackermann function in Isabelle/ML\ ML \ fun factorial 0 = 1 | factorial n = n * factorial (n - 1) \ ML \factorial 42\ ML \factorial 10000 div factorial 9999\ text \See \<^url>\http://mathworld.wolfram.com/AckermannFunction.html\.\ ML \ fun ackermann 0 n = n + 1 | ackermann m 0 = ackermann (m - 1) 1 | ackermann m n = ackermann (m - 1) (ackermann m (n - 1)) \ ML \timeit (fn () => ackermann 3 10)\ subsection \Parallel Isabelle/ML\ text \ Future.fork/join/cancel manage parallel evaluation. Note that within Isabelle theory documents, the top-level command boundary may not be transgressed without special precautions. This is normally managed by the system when performing parallel proof checking. \ ML \ val x = Future.fork (fn () => ackermann 3 10); val y = Future.fork (fn () => ackermann 3 10); val z = Future.join x + Future.join y \ text \ The \<^ML_structure>\Par_List\ module provides high-level combinators for parallel list operations. \ ML \timeit (fn () => map (fn n => ackermann 3 n) (1 upto 10))\ ML \timeit (fn () => Par_List.map (fn n => ackermann 3 n) (1 upto 10))\ subsection \Function specifications in Isabelle/HOL\ fun factorial :: "nat \ nat" where "factorial 0 = 1" | "factorial (Suc n) = Suc n * factorial n" term "factorial 4" \ \symbolic term\ value "factorial 4" \ \evaluation via ML code generation in the background\ declare [[ML_source_trace]] ML \\<^term>\factorial 4\\ \ \symbolic term in ML\ ML \@{code "factorial"}\ \ \ML code from function specification\ fun ackermann :: "nat \ nat \ nat" where "ackermann 0 n = n + 1" | "ackermann (Suc m) 0 = ackermann m 1" | "ackermann (Suc m) (Suc n) = ackermann m (ackermann (Suc m) n)" value "ackermann 3 5" end diff --git a/src/HOL/Examples/Seq.thy b/src/HOL/Examples/Seq.thy --- a/src/HOL/Examples/Seq.thy +++ b/src/HOL/Examples/Seq.thy @@ -1,35 +1,35 @@ (* Title: HOL/Examples/Seq.thy Author: Makarius *) section \Finite sequences\ theory Seq -imports Main + imports Main begin datatype 'a seq = Empty | Seq 'a "'a seq" fun conc :: "'a seq \ 'a seq \ 'a seq" where "conc Empty ys = ys" | "conc (Seq x xs) ys = Seq x (conc xs ys)" fun reverse :: "'a seq \ 'a seq" where "reverse Empty = Empty" | "reverse (Seq x xs) = conc (reverse xs) (Seq x Empty)" lemma conc_empty: "conc xs Empty = xs" by (induct xs) simp_all lemma conc_assoc: "conc (conc xs ys) zs = conc xs (conc ys zs)" by (induct xs) simp_all lemma reverse_conc: "reverse (conc xs ys) = conc (reverse ys) (reverse xs)" by (induct xs) (simp_all add: conc_empty conc_assoc) lemma reverse_reverse: "reverse (reverse xs) = xs" by (induct xs) (simp_all add: reverse_conc) end diff --git a/src/Tools/SML/Examples.thy b/src/Tools/SML/Examples.thy --- a/src/Tools/SML/Examples.thy +++ b/src/Tools/SML/Examples.thy @@ -1,52 +1,52 @@ (* Title: Tools/SML/Examples.thy Author: Makarius *) section \Standard ML within the Isabelle environment\ theory Examples -imports Pure + imports Pure begin text \ Isabelle/ML is a somewhat augmented version of Standard ML, with various add-ons that are indispensable for Isabelle development, but may cause conflicts with independent projects in plain Standard ML. The Isabelle/Isar command \<^theory_text>\SML_file\ supports official Standard ML within the Isabelle environment, with full support in the Prover IDE (Isabelle/jEdit). Here is a very basic example that defines the factorial function and evaluates it for some arguments. \ SML_file \factorial.sml\ text \ The subsequent example illustrates the use of multiple \<^theory_text>\SML_file\ commands to build larger Standard ML projects. The toplevel SML environment is enriched cumulatively within the theory context of Isabelle --- independently of the Isabelle/ML environment. \ SML_file \Example.sig\ SML_file \Example.sml\ text \ Isabelle/ML and SML share a common run-time system, but the static environments are separate. It is possible to exchange toplevel bindings via separate commands like this. \ SML_export \val f = factorial\ \ \re-use factorial from SML environment\ ML \f 42\ SML_import \val println = Output.writeln\ \ \re-use Isabelle/ML channel for SML\ SML_import \val par_map = Par_List.map\ \ \re-use Isabelle/ML parallel list combinator for SML\ end