src/Doc/Codegen/Computations.thy
author wenzelm
Sat, 10 Sep 2022 16:12:52 +0200
changeset 76107 4dedb6e2dac2
parent 74584 c14787d73db6
child 76659 2afbd514b654
permissions -rw-r--r--
more command-line options;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
     1
theory Computations
69422
472af2d7835d clarified session dependencies: faster build_doc/build_release;
wenzelm
parents: 68028
diff changeset
     2
  imports Setup
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 65044
diff changeset
     3
    "HOL-Library.Code_Target_Int"
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
     4
begin
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
     5
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
     6
section \<open>Computations \label{sec:computations}\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
     7
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
     8
subsection \<open>Prelude -- The \<open>code\<close> antiquotation \label{sec:code_antiq}\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
     9
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    10
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    11
  The @{ML_antiquotation_def code} antiquotation allows to include constants
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    12
  from
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    13
  generated code directly into ML system code, as in the following toy
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    14
  example:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    15
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    16
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    17
datatype %quote form = T | F | And form form | Or form form (*<*)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    18
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
    19
(*>*) ML %quote \<open>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    20
  fun eval_form @{code T} = true
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    21
    | eval_form @{code F} = false
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    22
    | eval_form (@{code And} (p, q)) =
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    23
        eval_form p andalso eval_form q
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    24
    | eval_form (@{code Or} (p, q)) =
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    25
        eval_form p orelse eval_form q;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    26
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    27
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    28
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    29
  \noindent The antiquotation @{ML_antiquotation code} takes
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    30
  the name of a constant as argument;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    31
  the required code is generated
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    32
  transparently and the corresponding constant names are inserted
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    33
  for the given antiquotations.  This technique allows to use pattern
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    34
  matching on constructors stemming from compiled datatypes.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    35
  Note that the @{ML_antiquotation code}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    36
  antiquotation may not refer to constants which carry adaptations;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    37
  here you have to refer to the corresponding adapted code directly.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    38
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    39
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    40
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    41
subsection \<open>The concept of computations\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    42
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    43
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    44
  Computations embody the simple idea that for each
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    45
  monomorphic Isabelle/HOL term of type \<open>\<tau>\<close> by virtue of
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    46
  code generation there exists an corresponding ML type \<open>T\<close> and
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    47
  a morphism \<open>\<Phi> :: \<tau> \<rightarrow> T\<close> satisfying
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    48
  \<open>\<Phi> (t\<^sub>1 \<cdot> t\<^sub>2) = \<Phi> t\<^sub>1 \<cdot> \<Phi> t\<^sub>2\<close>, with \<open>\<cdot>\<close> denoting
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    49
  term application.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    50
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    51
  For a given Isabelle/HOL type \<open>\<tau>\<close>, parts of \<open>\<Phi>\<close> can be
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    52
  implemented by a corresponding ML function \<open>\<phi>\<^sub>\<tau> :: term \<rightarrow> T\<close>.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    53
  How?
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    54
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    55
    \<^descr> \<open>Let input be a constant C :: \<tau>.\<close> \\
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    56
      Then \<open>\<phi>\<^sub>\<tau> C = f\<^sub>C\<close> with \<open>f\<^sub>C\<close> being
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    57
      the image of \<open>C\<close> under code generation.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    58
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    59
    \<^descr> \<open>Let input be an application (t\<^sub>1 \<cdot> t\<^sub>2) :: \<tau>.\<close> \\
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    60
      Then \<open>\<phi>\<^sub>\<tau> (t\<^sub>1 \<cdot> t\<^sub>2) = \<phi>\<^sub>\<tau> t\<^sub>1 (\<phi>\<^sub>\<tau> t\<^sub>2)\<close>.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    61
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    62
  \noindent Using these trivial properties, each monomorphic constant
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    63
  \<open>C : \<^vec>\<tau>\<^sub>n \<rightarrow> \<tau>\<close> yields the following
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    64
  equations:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    65
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    66
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    67
text %quote \<open>
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    68
  \<open>\<phi>\<^bsub>(\<tau>\<^sub>1 \<rightarrow> \<tau>\<^sub>2 \<rightarrow> \<dots> \<rightarrow> \<tau>\<^sub>n \<rightarrow> \<tau>)\<^esub> C = f\<^sub>C\<close> \\
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    69
  \<open>\<phi>\<^bsub>(\<tau>\<^sub>2 \<rightarrow> \<dots> \<rightarrow> \<tau>\<^sub>n \<rightarrow> \<tau>)\<^esub> (C \<cdot> t\<^sub>1) = f\<^sub>C (\<phi>\<^bsub>\<tau>\<^sub>1\<^esub> t\<^sub>1)\<close> \\
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    70
  \<open>\<dots>\<close> \\
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    71
  \<open>\<phi>\<^bsub>\<tau>\<^esub> (C \<cdot> t\<^sub>1 \<cdot> \<dots> \<cdot> t\<^sub>n) = f\<^sub>C (\<phi>\<^bsub>\<tau>\<^sub>1\<^esub> t\<^sub>1) \<dots> (\<phi>\<^bsub>\<tau>\<^sub>n\<^esub> t\<^sub>n)\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    72
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    73
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    74
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    75
  \noindent Hence a computation is characterized as follows:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    76
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    77
    \<^item> Let \<open>input constants\<close> denote a set of monomorphic constants.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    78
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    79
    \<^item> Let \<open>\<tau>\<close> denote a monomorphic type and \<open>'ml\<close> be a schematic
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    80
      placeholder for its corresponding type in ML under code generation.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    81
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    82
    \<^item> Then the corresponding computation is an ML function of type
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    83
      \<^ML_type>\<open>Proof.context -> term -> 'ml\<close>
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    84
      partially implementing the morphism \<open>\<Phi> :: \<tau> \<rightarrow> T\<close> for all
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    85
      \<^emph>\<open>input terms\<close> consisting only of input constants and applications.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    86
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    87
  \noindent The charming idea is that all required code is automatically generated
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    88
  by the code generator for givens input constants and types;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    89
  that code is directly inserted into the Isabelle/ML runtime system
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    90
  by means of antiquotations.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    91
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    92
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    93
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    94
subsection \<open>The \<open>computation\<close> antiquotation\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    95
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    96
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    97
  The following example illustrates its basic usage:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    98
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    99
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   100
ML %quote \<open>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   101
  local
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   102
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   103
  fun int_of_nat @{code "0 :: nat"} = 0
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   104
    | int_of_nat (@{code Suc} n) = int_of_nat n + 1;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   105
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   106
  in
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   107
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   108
  val comp_nat = @{computation nat terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   109
    "plus :: nat \<Rightarrow> nat \<Rightarrow> nat" "times :: nat \<Rightarrow> nat \<Rightarrow> nat"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   110
    "sum_list :: nat list \<Rightarrow> nat" "prod_list :: nat list \<Rightarrow> nat"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   111
    datatypes: nat "nat list"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   112
    (fn post => post o HOLogic.mk_nat o int_of_nat o the);
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   113
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   114
  end
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   115
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   116
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   117
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   118
    \<^item> Antiquotations occurring in the
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   119
      same ML block always refer to the same transparently generated code;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   120
      particularly, they share the same transparently generated datatype
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   121
      declarations.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   122
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   123
    \<^item> The type of a computation is specified as first argument.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   124
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   125
    \<^item> Input constants are specified the following ways:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   126
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   127
        \<^item> Each term following \<open>terms:\<close> specifies all constants
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   128
          it contains as input constants.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   129
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   130
        \<^item> Each type following \<open>datatypes:\<close> specifies all constructors
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   131
          of the corresponding code datatype as input constants.  Note that
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   132
          this does not increase expressiveness but succinctness for datatypes
67327
89be5a4f514b skip abstract constructors silently in datatype clauses of computations
haftmann
parents: 67299
diff changeset
   133
          with many constructors.  Abstract type constructors are skipped
89be5a4f514b skip abstract constructors silently in datatype clauses of computations
haftmann
parents: 67299
diff changeset
   134
          silently.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   135
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   136
    \<^item> The code generated by a \<open>computation\<close> antiquotation takes a functional argument
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   137
      which describes how to conclude the computation.  What's the rationale
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   138
      behind this?
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   139
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   140
        \<^item> There is no automated way to generate a reconstruction function
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   141
          from the resulting ML type to a Isabelle term -- this is in the
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   142
          responsibility of the implementor.  One possible approach
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   143
          for robust term reconstruction is the \<open>code\<close> antiquotation.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   144
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   145
        \<^item> Both statically specified input constants and dynamically provided input
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   146
          terms are subject to preprocessing.  Likewise the result
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   147
          is supposed to be subject to postprocessing; the implementor
65044
0940a741adf7 more correct wording
haftmann
parents: 65043
diff changeset
   148
          is expected to take care for this explicitly.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   149
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   150
        \<^item> Computations follow the partiality principle (cf.~\secref{sec:partiality_principle}):
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   151
          failures due to pattern matching or unspecified functions
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   152
          are interpreted as partiality; therefore resulting ML values
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   153
          are optional. 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   154
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   155
      Hence the functional argument accepts the following parameters
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   156
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   157
        \<^item> A postprocessor function \<^ML_type>\<open>term -> term\<close>.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   158
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   159
        \<^item> The resulting value as optional argument.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   160
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   161
      The functional argument is supposed to compose the final result
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   162
      from these in a suitable manner.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   163
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   164
  \noindent A simple application:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   165
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   166
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   167
ML_val %quote \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   168
  comp_nat \<^context> \<^term>\<open>sum_list [Suc 0, Suc (Suc 0)] * Suc (Suc 0)\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   169
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   170
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   171
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   172
  \noindent A single ML block may contain an arbitrary number of computation
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   173
  antiquotations.  These share the \<^emph>\<open>same\<close> set of possible
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   174
  input constants.  In other words, it does not matter in which
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   175
  antiquotation constants are specified;  in the following example,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   176
  \<^emph>\<open>all\<close> constants are specified by the first antiquotation once
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   177
  and for all:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   178
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   179
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   180
ML %quote \<open>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   181
  local
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   182
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   183
  fun int_of_nat @{code "0 :: nat"} = 0
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   184
    | int_of_nat (@{code Suc} n) = int_of_nat n + 1;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   185
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   186
  in
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   187
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   188
  val comp_nat = @{computation nat terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   189
    "plus :: nat \<Rightarrow> nat \<Rightarrow> nat" "times :: nat \<Rightarrow> nat \<Rightarrow> nat"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   190
    "sum_list :: nat list \<Rightarrow> nat" "prod_list :: nat list \<Rightarrow> nat"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   191
    "replicate :: nat \<Rightarrow> nat \<Rightarrow> nat list"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   192
    datatypes: nat "nat list"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   193
    (fn post => post o HOLogic.mk_nat o int_of_nat o the);
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   194
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   195
  val comp_nat_list = @{computation "nat list"}
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   196
    (fn post => post o HOLogic.mk_list \<^typ>\<open>nat\<close> o
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   197
      map (HOLogic.mk_nat o int_of_nat) o the);
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   198
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   199
  end
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   200
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   201
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   202
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   203
subsection \<open>Pitfalls when specifying input constants \label{sec:input_constants_pitfalls}\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   204
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   205
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   206
    \<^descr> \<open>Complete type coverage.\<close> Specified input constants must
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   207
      be \<^emph>\<open>complete\<close> in the sense that for each
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   208
      required type \<open>\<tau>\<close> there is at least one corresponding
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   209
      input constant which can actually \<^emph>\<open>construct\<close> a concrete
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   210
      value of type \<open>\<tau>\<close>, potentially requiring more types recursively;
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   211
      otherwise the system of equations cannot be generated properly.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   212
      Hence such incomplete input constants sets are rejected immediately.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   213
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   214
    \<^descr> \<open>Unsuitful right hand sides.\<close> The generated code for a computation
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   215
      must compile in the strict ML runtime environment.  This imposes
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   216
      the technical restriction that each compiled input constant
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   217
      \<open>f\<^sub>C\<close> on the right hand side of a generated equations
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   218
      must compile without throwing an exception.  That rules
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   219
      out pathological examples like @{term [source] "undefined :: nat"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   220
      as input constants, as well as abstract constructors (cf. \secref{sec:invariant}).
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   221
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   222
    \<^descr> \<open>Preprocessing.\<close> For consistency, input constants are subject
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   223
      to preprocessing;  however, the overall approach requires
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   224
      to operate on constants \<open>C\<close> and their respective compiled images
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   225
      \<open>f\<^sub>C\<close>.\footnote{Technical restrictions of the implementation
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   226
      enforce this, although those could be lifted in the future.}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   227
      This is a problem whenever preprocessing maps an input constant
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   228
      to a non-constant.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   229
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   230
      To circumvent these situations, the computation machinery
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   231
      has a dedicated preprocessor which is applied \<^emph>\<open>before\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   232
      the regular preprocessing, both to input constants as well as
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   233
      input terms.  This can be used to map problematic constants
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   234
      to other ones that are not subject to regular preprocessing. 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   235
      Rewrite rules are added using attribute @{attribute code_computation_unfold}.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   236
      There should rarely be a need to use this beyond the few default
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   237
      setups in HOL, which deal with literals (see also \secref{sec:literal_input}).
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   238
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   239
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   240
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   241
subsection \<open>Pitfalls concerning input terms\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   242
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   243
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   244
    \<^descr> \<open>No polymorphims.\<close> Input terms must be monomorphic: compilation
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   245
      to ML requires dedicated choice of monomorphic types.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   246
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   247
    \<^descr> \<open>No abstractions.\<close> Only constants and applications are admissible
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   248
      as input; abstractions are not possible.  In theory, the
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   249
      compilation schema could be extended to cover abstractions also,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   250
      but this would increase the trusted code base.  If abstractions
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   251
      are required, they can always be eliminated by a dedicated preprocessing
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   252
      step, e.g.~using combinatorial logic.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   253
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   254
    \<^descr> \<open>Potential interfering of the preprocessor.\<close> As described in \secref{sec:input_constants_pitfalls}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   255
      regular preprocessing can have a disruptive effect for input constants.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   256
      The same also applies to input terms; however the same measures 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   257
      to circumvent that problem for input constants apply to input terms also.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   258
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   259
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   260
  
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   261
subsection \<open>Computations using the \<open>computation_conv\<close> antiquotation\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   262
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   263
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   264
  Computations are a device to implement fast proof procedures.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   265
  Then results of a computation are often assumed to be trustable
67299
ba52a058942f prefer formal citations;
wenzelm
parents: 66453
diff changeset
   266
  and thus wrapped in oracles (see @{cite "isabelle-isar-ref"}),
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   267
  as in the following example:\footnote{
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   268
  The technical details how numerals are dealt with are given later in
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   269
  \secref{sec:literal_input}.}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   270
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   271
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   272
ML %quote \<open>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   273
  local
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   274
74582
882de99c7c83 more antiquotations;
wenzelm
parents: 69660
diff changeset
   275
  fun raw_dvd (b, ct) =
882de99c7c83 more antiquotations;
wenzelm
parents: 69660
diff changeset
   276
    \<^instantiate>\<open>x = ct and y = \<open>if b then \<^cterm>\<open>True\<close> else \<^cterm>\<open>False\<close>\<close>
74584
wenzelm
parents: 74582
diff changeset
   277
      in cterm \<open>x \<equiv> y\<close> for x y :: bool\<close>;
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   278
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   279
  val (_, dvd_oracle) = Context.>>> (Context.map_theory_result
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   280
    (Thm.add_oracle (\<^binding>\<open>dvd\<close>, raw_dvd)));
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   281
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   282
  in
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   283
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   284
  val conv_dvd = @{computation_conv bool terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   285
    "Rings.dvd :: int \<Rightarrow> int \<Rightarrow> bool"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   286
    "plus :: int \<Rightarrow> int \<Rightarrow> int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   287
    "minus :: int \<Rightarrow> int \<Rightarrow> int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   288
    "times :: int \<Rightarrow> int \<Rightarrow> int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   289
    "0 :: int" "1 :: int" "2 :: int" "3 :: int" "-1 :: int"
65043
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   290
  } (K (curry dvd_oracle))
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   291
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   292
  end
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   293
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   294
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   295
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   296
    \<^item> Antiquotation @{ML_antiquotation computation_conv} basically yields
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   297
      a conversion of type \<^ML_type>\<open>Proof.context -> cterm -> thm\<close>
67299
ba52a058942f prefer formal citations;
wenzelm
parents: 66453
diff changeset
   298
      (see further @{cite "isabelle-implementation"}).
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   299
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   300
    \<^item> The antiquotation expects one functional argument to bridge the
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   301
      \qt{untrusted gap};  this can be done e.g.~using an oracle.  Since that oracle
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   302
      will only yield \qt{valid} results in the context of that particular
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   303
      computation, the implementor must make sure that it does not leave
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   304
      the local ML scope;  in this example, this is achieved using
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   305
      an explicit \<open>local\<close> ML block.  The very presence of the oracle
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   306
      in the code acknowledges that each computation requires explicit thinking
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   307
      before it can be considered trustworthy!
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   308
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   309
    \<^item> Postprocessing just operates as further conversion after normalization.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   310
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   311
    \<^item> Partiality makes the whole conversion fall back to reflexivity.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   312
\<close> (*<*)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   313
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   314
(*>*) ML_val %quote \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   315
  conv_dvd \<^context> \<^cterm>\<open>7 dvd ( 62437867527846782 :: int)\<close>;
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   316
  conv_dvd \<^context> \<^cterm>\<open>7 dvd (-62437867527846783 :: int)\<close>;
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   317
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   318
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   319
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   320
  \noindent An oracle is not the only way to construct a valid theorem.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   321
  A computation result can be used to construct an appropriate certificate:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   322
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   323
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   324
lemma %quote conv_div_cert:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   325
  "(Code_Target_Int.positive r * Code_Target_Int.positive s)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   326
     div Code_Target_Int.positive s \<equiv> (numeral r :: int)" (is "?lhs \<equiv> ?rhs")
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   327
proof (rule eq_reflection)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   328
  have "?lhs = numeral r * numeral s div numeral s"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   329
    by simp
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   330
  also have "numeral r * numeral s div numeral s = ?rhs"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   331
    by (rule nonzero_mult_div_cancel_right) simp
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   332
  finally show "?lhs = ?rhs" .
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   333
qed
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   334
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   335
lemma %quote positive_mult:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   336
  "Code_Target_Int.positive r * Code_Target_Int.positive s = 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   337
    Code_Target_Int.positive (r * s)"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   338
  by simp
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   339
  
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   340
ML %quote \<open>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   341
  local
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   342
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   343
  fun integer_of_int (@{code int_of_integer} k) = k
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   344
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   345
  val cterm_of_int = Thm.cterm_of \<^context> o HOLogic.mk_numeral o integer_of_int;
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   346
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   347
  val divisor = Thm.dest_arg o Thm.dest_arg;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   348
65043
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   349
  val evaluate_simps = map mk_eq @{thms arith_simps positive_mult};
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   350
65043
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   351
  fun evaluate ctxt = 
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   352
    Simplifier.rewrite_rule ctxt evaluate_simps;
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   353
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   354
  fun revaluate ctxt k ct =
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   355
    @{thm conv_div_cert}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   356
    |> Thm.instantiate' [] [SOME (cterm_of_int k), SOME (divisor ct)]
65043
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   357
    |> evaluate ctxt;
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   358
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   359
  in
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   360
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   361
  val conv_div = @{computation_conv int terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   362
    "divide :: int \<Rightarrow> int \<Rightarrow> int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   363
    "0 :: int" "1 :: int" "2 :: int" "3 :: int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   364
  } revaluate
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   365
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   366
  end
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   367
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   368
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   369
ML_val %quote \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   370
  conv_div \<^context>
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   371
    \<^cterm>\<open>46782454343499999992777742432342242323423425 div (7 :: int)\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   372
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   373
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   374
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   375
  \noindent The example is intentionally kept simple: only positive
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   376
  integers are covered, only remainder-free divisions are feasible,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   377
  and the input term is expected to have a particular shape.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   378
  This exhibits the idea more clearly:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   379
  the result of the computation is used as a mere
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   380
  hint how to instantiate @{fact conv_div_cert}, from which the required
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   381
  theorem is obtained by performing multiplication using the
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   382
  simplifier;  hence that theorem is built of proper inferences,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   383
  with no oracles involved.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   384
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   385
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   386
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   387
subsection \<open>Computations using the \<open>computation_check\<close> antiquotation\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   388
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   389
text \<open>
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   390
  The \<open>computation_check\<close> antiquotation is convenient if
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   391
  only a positive checking of propositions is desired, because then
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   392
  the result type is fixed (\<^typ>\<open>prop\<close>) and all the technical
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   393
  matter concerning postprocessing and oracles is done in the framework
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   394
  once and for all:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   395
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   396
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   397
ML %quote \<open>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   398
  val check_nat = @{computation_check terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   399
    Trueprop "less :: nat \<Rightarrow> nat \<Rightarrow> bool" "plus :: nat \<Rightarrow> nat \<Rightarrow> nat" 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   400
    "times :: nat \<Rightarrow> nat \<Rightarrow> nat"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   401
    "0 :: nat" Suc
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   402
  }
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   403
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   404
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   405
text \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   406
  \noindent The HOL judgement \<^term>\<open>Trueprop\<close> embeds an expression
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   407
  of type \<^typ>\<open>bool\<close> into \<^typ>\<open>prop\<close>.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   408
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   409
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   410
ML_val %quote \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   411
  check_nat \<^context> \<^cprop>\<open>less (Suc (Suc 0)) (Suc (Suc (Suc 0)))\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   412
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   413
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   414
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   415
  \noindent Note that such computations can only \<^emph>\<open>check\<close>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   416
  for \<^typ>\<open>prop\<close>s to hold but not \<^emph>\<open>decide\<close>.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   417
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   418
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   419
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   420
subsection \<open>Some practical hints\<close>  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   421
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   422
subsubsection \<open>Inspecting generated code\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   423
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   424
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   425
  The antiquotations for computations attempt to produce meaningful error
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   426
  messages.  If these are not sufficient, it might by useful to
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   427
  inspect the generated code, which can be achieved using
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   428
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   429
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   430
declare %quote [[ML_source_trace]] (*<*) declare %quote [[ML_source_trace = false]] (*>*)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   431
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   432
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   433
subsubsection \<open>Literals as input constants \label{sec:literal_input}\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   434
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   435
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   436
  Literals (characters, numerals) in computations cannot be processed
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   437
  naively: the compilation pattern for computations fails whenever
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   438
  target-language literals are involved; since various
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   439
  common code generator setups (see \secref{sec:common_adaptation})
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   440
  implement \<^typ>\<open>nat\<close> and \<^typ>\<open>int\<close> by target-language literals,
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   441
  this problem manifests whenever numeric types are involved.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   442
  In practice, this is circumvented with a dedicated preprocessor
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   443
  setup for literals (see also \secref{sec:input_constants_pitfalls}).
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   444
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   445
  The following examples illustrate the pattern
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   446
  how to specify input constants when literals are involved, without going into
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   447
  too much detail:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   448
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   449
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   450
paragraph \<open>An example for \<^typ>\<open>nat\<close>\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   451
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   452
ML %quote \<open>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   453
  val check_nat = @{computation_check terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   454
    Trueprop "even :: nat \<Rightarrow> bool" "plus :: nat \<Rightarrow> nat \<Rightarrow> nat" 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   455
    "0 :: nat" Suc "1 :: nat" "2 :: nat" "3 :: nat"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   456
  }
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   457
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   458
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   459
ML_val %quote \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   460
  check_nat \<^context> \<^cprop>\<open>even (Suc 0 + 1 + 2 + 3 + 4 + 5)\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   461
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   462
  
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   463
paragraph \<open>An example for \<^typ>\<open>int\<close>\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   464
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   465
ML %quote \<open>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   466
  val check_int = @{computation_check terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   467
    Trueprop "even :: int \<Rightarrow> bool" "plus :: int \<Rightarrow> int \<Rightarrow> int" 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   468
    "0 :: int" "1 :: int" "2 :: int" "3 :: int" "-1 :: int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   469
  }
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   470
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   471
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   472
ML_val %quote \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   473
  check_int \<^context> \<^cprop>\<open>even ((0::int) + 1 + 2 + 3 + -1 + -2 + -3)\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   474
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   475
  
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   476
paragraph \<open>An example for \<^typ>\<open>String.literal\<close>\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   477
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67526
diff changeset
   478
definition %quote is_cap_letter :: "String.literal \<Rightarrow> bool"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67526
diff changeset
   479
  where "is_cap_letter s \<longleftrightarrow> (case String.asciis_of_literal s
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67526
diff changeset
   480
    of [] \<Rightarrow> False | k # _ \<Rightarrow> 65 \<le> k \<and> k \<le> 90)" (*<*)
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   481
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   482
(*>*) ML %quote \<open>
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67526
diff changeset
   483
  val check_literal = @{computation_check terms:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67526
diff changeset
   484
    Trueprop is_cap_letter datatypes: bool String.literal
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   485
  }
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   486
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   487
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   488
ML_val %quote \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   489
  check_literal \<^context> \<^cprop>\<open>is_cap_letter (STR ''Q'')\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   490
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   491
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   492
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   493
subsubsection \<open>Preprocessing HOL terms into evaluable shape\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   494
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   495
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   496
  When integrating decision procedures developed inside HOL into HOL itself,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   497
  a common approach is to use a deep embedding where operators etc.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   498
  are represented by datatypes in Isabelle/HOL.  Then it is necessary
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   499
  to turn generic shallowly embedded statements into that particular
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   500
  deep embedding (\qt{reification}).
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   501
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   502
  One option is to hardcode using code antiquotations (see \secref{sec:code_antiq}).
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   503
  Another option is to use pre-existing infrastructure in HOL:
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   504
  \<^ML>\<open>Reification.conv\<close> and \<^ML>\<open>Reification.tac\<close>.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   505
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   506
  A simplistic example:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   507
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   508
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   509
datatype %quote form_ord = T | F | Less nat nat
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   510
  | And form_ord form_ord | Or form_ord form_ord | Neg form_ord
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   511
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   512
primrec %quote interp :: "form_ord \<Rightarrow> 'a::order list \<Rightarrow> bool"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   513
where
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   514
  "interp T vs \<longleftrightarrow> True"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   515
| "interp F vs \<longleftrightarrow> False"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   516
| "interp (Less i j) vs \<longleftrightarrow> vs ! i < vs ! j"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   517
| "interp (And f1 f2) vs \<longleftrightarrow> interp f1 vs \<and> interp f2 vs"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   518
| "interp (Or f1 f2) vs \<longleftrightarrow> interp f1 vs \<or> interp f2 vs"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   519
| "interp (Neg f) vs \<longleftrightarrow> \<not> interp f vs"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   520
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   521
text \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   522
  \noindent The datatype \<^type>\<open>form_ord\<close> represents formulae whose semantics is given by
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   523
  \<^const>\<open>interp\<close>.  Note that values are represented by variable indices (\<^typ>\<open>nat\<close>)
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   524
  whose concrete values are given in list \<^term>\<open>vs\<close>.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   525
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   526
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   527
ML %quote (*<*) \<open>\<close>
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   528
lemma "thm": fixes x y z :: "'a::order" shows "x < y \<and> x < z \<equiv> interp (And (Less (Suc 0) (Suc (Suc 0))) (Less (Suc 0) 0)) [z, x, y]"
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   529
ML_prf %quote
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   530
(*>*) \<open>val thm =
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   531
  Reification.conv \<^context> @{thms interp.simps} \<^cterm>\<open>x < y \<and> x < z\<close>\<close> (*<*)
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   532
by (tactic \<open>ALLGOALS (resolve_tac \<^context> [thm])\<close>)
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69597
diff changeset
   533
(*>*)
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   534
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   535
text \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   536
  \noindent By virtue of @{fact interp.simps}, \<^ML>\<open>Reification.conv\<close> provides a conversion
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   537
  which, for this concrete example, yields @{thm thm [no_vars]}.  Note that the argument
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   538
  to \<^const>\<open>interp\<close> does not contain any free variables and can thus be evaluated
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   539
  using evaluation.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   540
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   541
  A less meager example can be found in the AFP, session \<open>Regular-Sets\<close>,
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   542
  theory \<open>Regexp_Method\<close>.
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   543
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   544
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   545
end