src/Doc/Codegen/Computations.thy
author haftmann
Mon, 29 Jan 2018 19:38:17 +0000
changeset 67526 a585c5b53576
parent 67327 89be5a4f514b
child 68028 1f9f973eed2a
permissions -rw-r--r--
irrelevant reference to doubtful theory Code_Char
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
     1
theory Computations
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 65044
diff changeset
     2
  imports Codegen_Basics.Setup
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
     8
subsection \<open>Prelude -- The @{text code} antiquotation \label{sec:code_antiq}\<close>
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    19
(*>*) ML %quotetypewriter \<open>
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    45
  monomorphic Isabelle/HOL term of type @{text \<tau>} by virtue of
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    46
  code generation there exists an corresponding ML type @{text T} and
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    47
  a morphism @{text "\<Phi> :: \<tau> \<rightarrow> T"} satisfying
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    48
  @{text "\<Phi> (t\<^sub>1 \<cdot> t\<^sub>2) = \<Phi> t\<^sub>1 \<cdot> \<Phi> t\<^sub>2"}, with @{text \<cdot>} denoting
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    49
  term application.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    50
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    51
  For a given Isabelle/HOL type @{text \<tau>}, parts of @{text \<Phi>} can be
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    52
  implemented by a corresponding ML function @{text "\<phi>\<^sub>\<tau> :: term \<rightarrow> T"}.
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> \\
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    56
      Then @{text "\<phi>\<^sub>\<tau> C = f\<^sub>C"} with @{text "f\<^sub>C"} being
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    57
      the image of @{text C} under code generation.
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> \\
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    60
      Then @{text "\<phi>\<^sub>\<tau> (t\<^sub>1 \<cdot> t\<^sub>2) = \<phi>\<^sub>\<tau> t\<^sub>1 (\<phi>\<^sub>\<tau> t\<^sub>2)"}.
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    63
  @{text "C : \<^vec>\<tau>\<^sub>n \<rightarrow> \<tau>"} yields the following
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>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    68
  @{text "\<phi>\<^bsub>(\<tau>\<^sub>1 \<rightarrow> \<tau>\<^sub>2 \<rightarrow> \<dots> \<rightarrow> \<tau>\<^sub>n \<rightarrow> \<tau>)\<^esub> C = f\<^sub>C"} \\
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    69
  @{text "\<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)"} \\
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    70
  @{text "\<dots>"} \\
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    71
  @{text "\<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)"}
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    77
    \<^item> Let @{text "input constants"} denote a set of monomorphic constants.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    78
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    79
    \<^item> Let @{text \<tau>} denote a monomorphic type and @{text "'ml"} be a schematic
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    83
      @{ML_type "Proof.context -> term -> 'ml"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    84
      partially implementing the morphism @{text "\<Phi> :: \<tau> \<rightarrow> T"} for all
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
    94
subsection \<open>The @{text computation} antiquotation\<close>
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   100
ML %quotetypewriter \<open>
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   127
        \<^item> Each term following @{text "terms:"} specifies all constants
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   130
        \<^item> Each type following @{text "datatypes:"} specifies all constructors
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   136
    \<^item> The code generated by a @{text computation} antiquotation takes a functional argument
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   143
          for robust term reconstruction is the @{text code} antiquotation.
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   157
        \<^item> A postprocessor function @{ML_type "term -> term"}.
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   167
ML_val %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   168
  comp_nat @{context} @{term "sum_list [Suc 0, Suc (Suc 0)] * Suc (Suc 0)"}
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   180
ML %quotetypewriter \<open>
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"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   196
    (fn post => post o HOLogic.mk_list @{typ nat} o
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   208
      required type @{text \<tau>} there is at least one corresponding
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   209
      input constant which can actually \<^emph>\<open>construct\<close> a concrete
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   210
      value of type @{text \<tau>}, potentially requiring more types recursively;
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   217
      @{text f\<^sub>C} on the right hand side of a generated equations
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   224
      to operate on constants @{text C} and their respective compiled images
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   225
      @{text f\<^sub>C}.\footnote{Technical restrictions of the implementation
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
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   261
subsection \<open>Computations using the @{text computation_conv} antiquotation\<close>
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
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   272
ML %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   273
  local
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   274
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   275
  fun raw_dvd (b, ct) = Thm.mk_binop @{cterm "Pure.eq :: bool \<Rightarrow> bool \<Rightarrow> prop"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   276
    ct (if b then @{cterm True} else @{cterm False});
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   277
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   278
  val (_, dvd_oracle) = Context.>>> (Context.map_theory_result
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   279
    (Thm.add_oracle (@{binding dvd}, raw_dvd)));
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   280
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   281
  in
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   282
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   283
  val conv_dvd = @{computation_conv bool terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   284
    "Rings.dvd :: int \<Rightarrow> int \<Rightarrow> bool"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   285
    "plus :: int \<Rightarrow> int \<Rightarrow> int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   286
    "minus :: int \<Rightarrow> int \<Rightarrow> int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   287
    "times :: int \<Rightarrow> int \<Rightarrow> int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   288
    "0 :: int" "1 :: int" "2 :: int" "3 :: int" "-1 :: int"
65043
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   289
  } (K (curry dvd_oracle))
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   290
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   291
  end
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   292
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   293
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   294
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   295
    \<^item> Antiquotation @{ML_antiquotation computation_conv} basically yields
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   296
      a conversion of type @{ML_type "Proof.context -> cterm -> thm"}
67299
ba52a058942f prefer formal citations;
wenzelm
parents: 66453
diff changeset
   297
      (see further @{cite "isabelle-implementation"}).
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   298
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   299
    \<^item> The antiquotation expects one functional argument to bridge the
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   300
      \qt{untrusted gap};  this can be done e.g.~using an oracle.  Since that oracle
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   301
      will only yield \qt{valid} results in the context of that particular
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   302
      computation, the implementor must make sure that it does not leave
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   303
      the local ML scope;  in this example, this is achieved using
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   304
      an explicit @{text local} ML block.  The very presence of the oracle
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   305
      in the code acknowledges that each computation requires explicit thinking
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   306
      before it can be considered trustworthy!
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   307
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   308
    \<^item> Postprocessing just operates as further conversion after normalization.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   309
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   310
    \<^item> Partiality makes the whole conversion fall back to reflexivity.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   311
\<close> (*<*)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   312
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   313
(*>*) ML_val %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   314
  conv_dvd @{context} @{cterm "7 dvd ( 62437867527846782 :: int)"};
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   315
  conv_dvd @{context} @{cterm "7 dvd (-62437867527846783 :: int)"};
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   316
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   317
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   318
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   319
  \noindent An oracle is not the only way to construct a valid theorem.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   320
  A computation result can be used to construct an appropriate certificate:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   321
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   322
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   323
lemma %quote conv_div_cert:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   324
  "(Code_Target_Int.positive r * Code_Target_Int.positive s)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   325
     div Code_Target_Int.positive s \<equiv> (numeral r :: int)" (is "?lhs \<equiv> ?rhs")
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   326
proof (rule eq_reflection)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   327
  have "?lhs = numeral r * numeral s div numeral s"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   328
    by simp
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   329
  also have "numeral r * numeral s div numeral s = ?rhs"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   330
    by (rule nonzero_mult_div_cancel_right) simp
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   331
  finally show "?lhs = ?rhs" .
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   332
qed
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   333
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   334
lemma %quote positive_mult:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   335
  "Code_Target_Int.positive r * Code_Target_Int.positive s = 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   336
    Code_Target_Int.positive (r * s)"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   337
  by simp
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   338
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   339
ML %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   340
  local
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   341
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   342
  fun integer_of_int (@{code int_of_integer} k) = k
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   343
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   344
  val cterm_of_int = Thm.cterm_of @{context} o HOLogic.mk_numeral o integer_of_int;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   345
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   346
  val divisor = Thm.dest_arg o Thm.dest_arg;
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   347
65043
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   348
  val evaluate_simps = map mk_eq @{thms arith_simps positive_mult};
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   349
65043
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   350
  fun evaluate ctxt = 
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   351
    Simplifier.rewrite_rule ctxt evaluate_simps;
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   352
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   353
  fun revaluate ctxt k ct =
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   354
    @{thm conv_div_cert}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   355
    |> Thm.instantiate' [] [SOME (cterm_of_int k), SOME (divisor ct)]
65043
fd753468786f explicit dynamic context for gap-bridging function
haftmann
parents: 65041
diff changeset
   356
    |> evaluate ctxt;
65041
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   357
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   358
  in
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   359
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   360
  val conv_div = @{computation_conv int terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   361
    "divide :: int \<Rightarrow> int \<Rightarrow> int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   362
    "0 :: int" "1 :: int" "2 :: int" "3 :: int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   363
  } revaluate
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   364
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   365
  end
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   366
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   367
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   368
ML_val %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   369
  conv_div @{context}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   370
    @{cterm "46782454343499999992777742432342242323423425 div (7 :: int)"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   371
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   372
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   373
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   374
  \noindent The example is intentionally kept simple: only positive
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   375
  integers are covered, only remainder-free divisions are feasible,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   376
  and the input term is expected to have a particular shape.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   377
  This exhibits the idea more clearly:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   378
  the result of the computation is used as a mere
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   379
  hint how to instantiate @{fact conv_div_cert}, from which the required
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   380
  theorem is obtained by performing multiplication using the
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   381
  simplifier;  hence that theorem is built of proper inferences,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   382
  with no oracles involved.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   383
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   384
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   385
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   386
subsection \<open>Computations using the @{text computation_check} antiquotation\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   387
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   388
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   389
  The @{text computation_check} antiquotation is convenient if
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   390
  only a positive checking of propositions is desired, because then
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   391
  the result type is fixed (@{typ prop}) and all the technical
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   392
  matter concerning postprocessing and oracles is done in the framework
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   393
  once and for all:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   394
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   395
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   396
ML %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   397
  val check_nat = @{computation_check terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   398
    Trueprop "less :: nat \<Rightarrow> nat \<Rightarrow> bool" "plus :: nat \<Rightarrow> nat \<Rightarrow> nat" 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   399
    "times :: nat \<Rightarrow> nat \<Rightarrow> nat"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   400
    "0 :: nat" Suc
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   401
  }
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   402
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   403
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   404
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   405
  \noindent The HOL judgement @{term Trueprop} embeds an expression
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   406
  of type @{typ bool} into @{typ prop}.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   407
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   408
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   409
ML_val %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   410
  check_nat @{context} @{cprop "less (Suc (Suc 0)) (Suc (Suc (Suc 0)))"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   411
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   412
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   413
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   414
  \noindent Note that such computations can only \<^emph>\<open>check\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   415
  for @{typ prop}s to hold but not \<^emph>\<open>decide\<close>.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   416
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   417
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   418
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   419
subsection \<open>Some practical hints\<close>  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   420
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   421
subsubsection \<open>Inspecting generated code\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   422
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   423
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   424
  The antiquotations for computations attempt to produce meaningful error
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   425
  messages.  If these are not sufficient, it might by useful to
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   426
  inspect the generated code, which can be achieved using
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   427
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   428
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   429
declare %quote [[ML_source_trace]] (*<*) declare %quote [[ML_source_trace = false]] (*>*)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   430
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   431
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   432
subsubsection \<open>Literals as input constants \label{sec:literal_input}\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   433
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   434
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   435
  Literals (characters, numerals) in computations cannot be processed
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   436
  naively: the compilation pattern for computations fails whenever
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   437
  target-language literals are involved; since various
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   438
  common code generator setups (see \secref{sec:common_adaptation})
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   439
  implement @{typ nat} and @{typ int} by target-language literals,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   440
  this problem manifests whenever numeric types are involved.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   441
  In practice, this is circumvented with a dedicated preprocessor
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   442
  setup for literals (see also \secref{sec:input_constants_pitfalls}).
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   443
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   444
  The following examples illustrate the pattern
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   445
  how to specify input constants when literals are involved, without going into
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   446
  too much detail:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   447
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   448
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   449
paragraph \<open>An example for @{typ nat}\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   450
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   451
ML %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   452
  val check_nat = @{computation_check terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   453
    Trueprop "even :: nat \<Rightarrow> bool" "plus :: nat \<Rightarrow> nat \<Rightarrow> nat" 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   454
    "0 :: nat" Suc "1 :: nat" "2 :: nat" "3 :: nat"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   455
  }
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   456
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   457
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   458
ML_val %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   459
  check_nat @{context} @{cprop "even (Suc 0 + 1 + 2 + 3 + 4 + 5)"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   460
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   461
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   462
paragraph \<open>An example for @{typ int}\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   463
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   464
ML %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   465
  val check_int = @{computation_check terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   466
    Trueprop "even :: int \<Rightarrow> bool" "plus :: int \<Rightarrow> int \<Rightarrow> int" 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   467
    "0 :: int" "1 :: int" "2 :: int" "3 :: int" "-1 :: int"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   468
  }
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   469
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   470
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   471
ML_val %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   472
  check_int @{context} @{cprop "even ((0::int) + 1 + 2 + 3 + -1 + -2 + -3)"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   473
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   474
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   475
paragraph \<open>An example for @{typ char}\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   476
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   477
definition %quote is_cap_letter :: "char \<Rightarrow> bool"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   478
  where "is_cap_letter c \<longleftrightarrow> (let n = nat_of_char c in 65 \<le> n \<and> n \<le> 90)" (*<*)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   479
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   480
(*>*) ML %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   481
  val check_char = @{computation_check terms:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   482
    Trueprop is_cap_letter
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   483
    Char datatypes: num
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   484
  }
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   485
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   486
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   487
ML_val %quotetypewriter \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   488
  check_char @{context} @{cprop "is_cap_letter (CHR ''Y'')"}
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   489
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   490
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   491
  
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   492
subsubsection \<open>Preprocessing HOL terms into evaluable shape\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   493
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   494
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   495
  When integrating decision procedures developed inside HOL into HOL itself,
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   496
  a common approach is to use a deep embedding where operators etc.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   497
  are represented by datatypes in Isabelle/HOL.  Then it is necessary
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   498
  to turn generic shallowly embedded statements into that particular
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   499
  deep embedding (\qt{reification}).
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   500
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   501
  One option is to hardcode using code antiquotations (see \secref{sec:code_antiq}).
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   502
  Another option is to use pre-existing infrastructure in HOL:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   503
  @{ML "Reification.conv"} and @{ML "Reification.tac"}.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   504
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   505
  A simplistic example:
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   506
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   507
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   508
datatype %quote form_ord = T | F | Less nat nat
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   509
  | And form_ord form_ord | Or form_ord form_ord | Neg form_ord
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   510
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   511
primrec %quote interp :: "form_ord \<Rightarrow> 'a::order list \<Rightarrow> bool"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   512
where
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   513
  "interp T vs \<longleftrightarrow> True"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   514
| "interp F vs \<longleftrightarrow> False"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   515
| "interp (Less i j) vs \<longleftrightarrow> vs ! i < vs ! j"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   516
| "interp (And f1 f2) vs \<longleftrightarrow> interp f1 vs \<and> interp f2 vs"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   517
| "interp (Or f1 f2) vs \<longleftrightarrow> interp f1 vs \<or> interp f2 vs"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   518
| "interp (Neg f) vs \<longleftrightarrow> \<not> interp f vs"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   519
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   520
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   521
  \noindent The datatype @{type form_ord} represents formulae whose semantics is given by
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   522
  @{const interp}.  Note that values are represented by variable indices (@{typ nat})
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   523
  whose concrete values are given in list @{term vs}.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   524
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   525
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   526
ML %quotetypewriter (*<*) \<open>\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   527
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]"
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   528
ML_prf %quotetypewriter
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   529
(*>*) \<open>val thm =
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   530
  Reification.conv @{context} @{thms interp.simps} @{cterm "x < y \<and> x < z"}\<close> (*<*)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   531
by (tactic \<open>ALLGOALS (resolve_tac @{context} [thm])\<close>)
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   532
(*>*) 
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   533
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   534
text \<open>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   535
  \noindent By virtue of @{fact interp.simps}, @{ML "Reification.conv"} provides a conversion
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   536
  which, for this concrete example, yields @{thm thm [no_vars]}.  Note that the argument
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   537
  to @{const interp} does not contain any free variables and can thus be evaluated
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   538
  using evaluation.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   539
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   540
  A less meager example can be found in the AFP, session @{text "Regular-Sets"},
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   541
  theory @{text Regexp_Method}.
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   542
\<close>
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   543
2525e680f94f basic documentation for computations
haftmann
parents:
diff changeset
   544
end