CookBook/Package/Ind_Interface.thy
author Christian Urban <urbanc@in.tum.de>
Thu, 19 Feb 2009 14:44:53 +0000
changeset 126 fcc0e6e54dca
parent 124 0b9fa606a746
child 127 74846cb0fff9
permissions -rw-r--r--
polished
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
     1
theory Ind_Interface
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
     2
imports "../Base" "../Parsing" Simple_Inductive_Package
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
     3
begin
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
     4
113
9b6c9d172378 slightly updated
Christian Urban <urbanc@in.tum.de>
parents: 102
diff changeset
     5
section {* The Interface \label{sec:ind-interface} *}
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
     6
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
     7
text {* 
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
     8
  The purpose of the package we show next is that the user just specifies the
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
     9
  inductive predicate by stating some introduction rules and then the packages
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    10
  makes the equivalent definition and derives from it the needed properties.
124
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    11
*}
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    12
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    13
text {*
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    14
  From a high-level perspective the package consists of 6 subtasks:
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    15
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    16
  \begin{itemize}
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    17
  \item reading the various parts of specification (i.e.~parser),
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    18
  \item transforming the parser outut into an internal 
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    19
  (typed) datastructure,
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    20
  \item making the definitions, 
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    21
  \item deriving the induction principles,
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    22
  \item deriving the introduction rules, and
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    23
  \item storing the results in the given theory. 
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    24
  to the user. 
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    25
  \end{itemize}
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    26
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    27
*}
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    28
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
    29
text {* 
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    30
  To be able to write down the specification in Isabelle, we have to introduce
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    31
  a new command (see Section~\ref{sec:newcommand}).  As the keyword for the new
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    32
  command we chose \simpleinductive{}. The specifications corresponding to our
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    33
  examples described earlier are:
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    34
*}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    35
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    36
simple_inductive
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    37
  trcl :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> bool"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    38
where
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    39
  base: "trcl R x x"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    40
| step: "trcl R x y \<Longrightarrow> R y z \<Longrightarrow> trcl R x z"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    41
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    42
simple_inductive
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    43
  even and odd
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    44
where
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    45
  even0: "even 0"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    46
| evenS: "odd n \<Longrightarrow> even (Suc n)"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    47
| oddS: "even n \<Longrightarrow> odd (Suc n)"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    48
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    49
simple_inductive
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    50
  accpart :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> bool"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    51
where
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    52
  accpartI: "(\<forall>y. R y x \<longrightarrow> accpart R y) \<Longrightarrow> accpart R x"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    53
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
    54
text {*
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    55
  After the keyword we expect a constant (or constants) with possible typing 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    56
  annotations and a
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    57
  list of introduction rules. While these specifications are all
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    58
  straightforward, there is a technicality we like to deal with to do with
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    59
  fixed parameters and locales. Remember we pointed out that the parameter
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    60
  @{text R} is fixed throughout the specifications of @{text trcl} and @{text
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    61
  accpart}. The point is that they might be fixed in a locale and we like to
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    62
  support this. Accordingly we treat some parameters of the inductive
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    63
  definition specially; see Figure~\ref{fig:inddefsfixed} where the transitive
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    64
  closure and accessible part are defined with a fixed parameter @{text R} and
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    65
  also inside a locale fixing @{text R}.
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    66
*}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    67
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    68
text_raw {*
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    69
  \begin{figure}[p]
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    70
  \begin{isabelle}
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    71
*}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    72
simple_inductive
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    73
  trcl' for R :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    74
where
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    75
  base: "trcl' R x x"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    76
| step: "trcl' R x y \<Longrightarrow> R y z \<Longrightarrow> trcl' R x z"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    77
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    78
simple_inductive
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    79
  accpart' for R :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    80
where
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    81
  accpartI: "(\<forall>y. R y x \<longrightarrow> accpart' R y) \<Longrightarrow> accpart' R x"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    82
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    83
locale rel =
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    84
  fixes R :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    85
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    86
simple_inductive (in rel) trcl'' 
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    87
where
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    88
  base: "trcl'' x x"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    89
| step: "trcl'' x y \<Longrightarrow> R y z \<Longrightarrow> trcl'' x z"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    90
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    91
simple_inductive (in rel) accpart''
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    92
where
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    93
  accpartI: "(\<forall>y. R y x \<longrightarrow> accpart'' y) \<Longrightarrow> accpart'' x"
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
    94
text_raw {*
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    95
  \end{isabelle}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    96
  \caption{The first definition is for the transitive closure where the
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    97
  relation @{text R} is explicitly fixed. Simiraly the second definition
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    98
  of the accessible part of the relation @{text R}. The last two definitions
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
    99
  specify the same inductive predicates, but this time defined inside
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   100
  a locale.\label{fig:inddefsfixed}}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   101
  \end{figure}
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   102
*}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   103
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   104
text {*
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   105
  \begin{figure}[p]
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   106
  \begin{isabelle}
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   107
  \railnontermfont{\rmfamily\itshape}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   108
  \railterm{simpleinductive,where,for}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   109
  \railalias{simpleinductive}{\simpleinductive{}}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   110
  \railalias{where}{\isacommand{where}}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   111
  \railalias{for}{\isacommand{for}}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   112
  \begin{rail}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   113
  simpleinductive target? fixes (for fixes)? \\
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   114
  (where (thmdecl? prop + '|'))?
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   115
  ;
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   116
  \end{rail}
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   117
  \end{isabelle}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   118
  \caption{A railroad diagram describing the syntax of \simpleinductive{}. 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   119
  The \emph{target} indicates an optional locale; the \emph{fixes} are an 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   120
  \isacommand{and}-separated list of names for the inductive predicates (they
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   121
  can also contain typing- and syntax anotations); similarly the \emph{fixes} 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   122
  after \isacommand{for} to indicate fixed parameters; \emph{prop} stands for a 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   123
  introduction rule with an optional theorem declaration (\emph{thmdecl}).
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   124
  \label{fig:railroad}}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   125
  \end{figure}
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   126
*}
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   127
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   128
text {*
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   129
  For the first subtask, the syntax of the \simpleinductive{} command can be
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   130
  described by the railroad diagram in Figure~\ref{fig:railroad}. This diagram
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   131
  more or less translates directly into the parser:
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   132
118
5f003fdf2653 polished and added more material to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 117
diff changeset
   133
5f003fdf2653 polished and added more material to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 117
diff changeset
   134
  @{ML_chunk [display,gray] parser}
5f003fdf2653 polished and added more material to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 117
diff changeset
   135
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   136
  which we described in Section~\ref{sec:parsingspecs}. If we feed into the 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   137
  parser the string (which corresponds to our definition of @{term even} and 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   138
  @{term odd}):
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   139
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   140
  @{ML_response [display,gray]
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   141
"let
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   142
  val input = filtered_input
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   143
     (\"even and odd \" ^  
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   144
      \"where \" ^
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   145
      \"  even0[intro]: \\\"even 0\\\" \" ^ 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   146
      \"| evenS[intro]: \\\"odd n \<Longrightarrow> even (Suc n)\\\" \" ^ 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   147
      \"| oddS[intro]:  \\\"even n \<Longrightarrow> odd (Suc n)\\\"\")
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   148
in
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   149
  parse spec_parser input
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   150
end"
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   151
"((((NONE, [(even, NONE, NoSyn), (odd, NONE, NoSyn)]), []),
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   152
     [((even0,\<dots>), \"\\^E\\^Ftoken\\^Eeven 0\\^E\\^F\\^E\"),
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   153
      ((evenS,\<dots>), \"\\^E\\^Ftoken\\^Eodd n \<Longrightarrow> even (Suc n)\\^E\\^F\\^E\"),
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   154
      ((oddS,\<dots>), \"\\^E\\^Ftoken\\^Eeven n \<Longrightarrow> odd (Suc n)\\^E\\^F\\^E\")]), [])"}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   155
*}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   156
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   157
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   158
text {*
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   159
  then we get back a locale (in this case @{ML NONE}), the predicates (with type
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   160
  and syntax annotations), the parameters (similar as the predicates) and
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   161
  the specifications of the introduction rules. 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   162
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   163
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   164
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   165
  This is all the information we
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   166
  need for calling the package and setting up the keyword. The latter is
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   167
  done in Lines 6 and 7 in the code below.
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   168
118
5f003fdf2653 polished and added more material to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 117
diff changeset
   169
  @{ML_chunk [display,gray,linenos] syntax}
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   170
  
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   171
  We call @{ML OuterSyntax.command} with the kind-indicator @{ML
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   172
  OuterKeyword.thy_decl} since the package does not need to open up any goal
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   173
  state (see Section~\ref{sec:newcommand}). Note that the predicates and
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   174
  parameters are at the moment only some ``naked'' variables: they have no
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   175
  type yet (even if we annotate them with types) and they are also no defined
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   176
  constants yet (which the predicates will eventually be).  In Lines 1 to 4 we
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   177
  gather the information from the parser to be processed further. The locale
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   178
  is passed as argument to the function @{ML
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   179
  Toplevel.local_theory}.\footnote{FIXME Is this already described?} The other
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   180
  arguments, i.e.~the predicates, parameters and intro rule specifications,
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   181
  are passed to the function @{ML add_inductive in SimpleInductivePackage}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   182
  (Line 4).
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   183
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   184
  We now come to the second subtask of the package, namely transforming the 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   185
  parser output into some internal datastructures that can be processed further. 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   186
  Remember that at the moment the introduction rules are just strings, and even
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   187
  if the predicates and parameters can contain some typing annotations, they
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   188
  are not yet in any way reflected in the introduction rules. So the task of
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   189
  @{ML add_inductive in SimpleInductivePackage} is to transform the strings
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   190
  into properly typed terms. For this it can use the function 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   191
  @{ML read_specification in Specification}. This function takes some constants
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   192
  with possible typing annotations and some rule specifications and attempts to
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   193
  find a type according to the given type constraints and the type constraints
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   194
  by the surrounding (local theory). However this function is a bit
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   195
  too general for our purposes: we want that each introduction rule has only 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   196
  name (for example @{text even0} or @{text evenS}), if a name is given at all.
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   197
  The function @{ML read_specification in Specification} however allows more
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   198
  than one rule. Since it is quite convenient to rely on this function (instead of
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   199
  building your own) we just quick ly write a wrapper function that translates
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   200
  between our specific format and the general format expected by 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   201
  @{ML read_specification in Specification}. The code of this wrapper is as follows:
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   202
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   203
  @{ML_chunk [display,gray,linenos] read_specification}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   204
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   205
  It takes a list of constants, a list of rule specifications and a local theory 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   206
  as input. Does the transformation of the rule specifications in Line 3; calls
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   207
  the function and transforms the now typed rule specifications back into our
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   208
  format and returns the type parameter and typed rule specifications. 
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   209
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   210
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   211
   @{ML_chunk [display,gray,linenos] add_inductive}
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   212
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   213
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   214
  In order to add a new inductive predicate to a theory with the help of our
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   215
  package, the user must \emph{invoke} it. For every package, there are
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   216
  essentially two different ways of invoking it, which we will refer to as
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   217
  \emph{external} and \emph{internal}. By external invocation we mean that the
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   218
  package is called from within a theory document. In this case, the
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   219
  specification of the inductive predicate, including type annotations and
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   220
  introduction rules, are given as strings by the user. Before the package can
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   221
  actually make the definition, the type and introduction rules have to be
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   222
  parsed. In contrast, internal invocation means that the package is called by
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   223
  some other package. For example, the function definition package
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   224
  calls the inductive definition package to define the
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   225
  graph of the function. However, it is not a good idea for the function
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   226
  definition package to pass the introduction rules for the function graph to
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   227
  the inductive definition package as strings. In this case, it is better to
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   228
  directly pass the rules to the package as a list of terms, which is more
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   229
  robust than handling strings that are lacking the additional structure of
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   230
  terms. These two ways of invoking the package are reflected in its ML
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   231
  programming interface, which consists of two functions:
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   232
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   233
113
9b6c9d172378 slightly updated
Christian Urban <urbanc@in.tum.de>
parents: 102
diff changeset
   234
  @{ML_chunk [display,gray] SIMPLE_INDUCTIVE_PACKAGE}
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   235
*}
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   236
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   237
text {*
124
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   238
  (FIXME: explain Binding.binding; Attrib.binding somewhere else)
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   239
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   240
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   241
  The function for external invocation of the package is called @{ML
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   242
  add_inductive in SimpleInductivePackage}, whereas the one for internal
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   243
  invocation is called @{ML add_inductive_i in SimpleInductivePackage}. Both
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   244
  of these functions take as arguments the names and types of the inductive
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   245
  predicates, the names and types of their parameters, the actual introduction
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   246
  rules and a \emph{local theory}.  They return a local theory containing the
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   247
  definition and the induction principle as well introduction rules. 
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   248
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   249
  Note that @{ML add_inductive_i in SimpleInductivePackage} expects
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   250
  the types of the predicates and parameters to be specified using the
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   251
  datatype @{ML_type typ} of Isabelle's logical framework, whereas @{ML
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   252
  add_inductive in SimpleInductivePackage} expects them to be given as
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   253
  optional strings. If no string is given for a particular predicate or
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   254
  parameter, this means that the type should be inferred by the
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   255
  package. 
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   256
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   257
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   258
  Additional \emph{mixfix syntax} may be associated with the
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   259
  predicates and parameters as well. Note that @{ML add_inductive_i in
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   260
  SimpleInductivePackage} does not allow mixfix syntax to be associated with
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   261
  parameters, since it can only be used for parsing.\footnote{FIXME: why ist it there then?} 
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   262
  The names of the
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   263
  predicates, parameters and rules are represented by the type @{ML_type
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   264
  Binding.binding}. Strings can be turned into elements of the type @{ML_type
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   265
  Binding.binding} using the function @{ML [display] "Binding.name : string ->
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   266
  Binding.binding"} Each introduction rule is given as a tuple containing its
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   267
  name, a list of \emph{attributes} and a logical formula. Note that the type
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   268
  @{ML_type Attrib.binding} used in the list of introduction rules is just a
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   269
  shorthand for the type @{ML_type "Binding.binding * Attrib.src list"}.  The
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   270
  function @{ML add_inductive_i in SimpleInductivePackage} expects the formula
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   271
  to be specified using the datatype @{ML_type term}, whereas @{ML
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   272
  add_inductive in SimpleInductivePackage} expects it to be given as a string.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   273
  An attribute specifies additional actions and transformations that should be
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   274
  applied to a theorem, such as storing it in the rule databases used by
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   275
  automatic tactics like the simplifier. The code of the package, which will
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   276
  be described in the following section, will mostly treat attributes as a
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   277
  black box and just forward them to other functions for storing theorems in
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   278
  local theories.  The implementation of the function @{ML add_inductive in
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   279
  SimpleInductivePackage} for external invocation of the package is quite
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   280
  simple. Essentially, it just parses the introduction rules and then passes
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   281
  them on to @{ML add_inductive_i in SimpleInductivePackage}:
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   282
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   283
  @{ML_chunk [display] add_inductive}
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   284
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   285
  For parsing and type checking the introduction rules, we use the function
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   286
  
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   287
  @{ML [display] "Specification.read_specification:
76
b99fa5fa63fc adapted to changes in binding.ML
Christian Urban <urbanc@in.tum.de>
parents: 71
diff changeset
   288
  (Binding.binding * string option * mixfix) list ->  (*{variables}*)
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   289
  (Attrib.binding * string list) list list ->  (*{rules}*)
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   290
  local_theory ->
76
b99fa5fa63fc adapted to changes in binding.ML
Christian Urban <urbanc@in.tum.de>
parents: 71
diff changeset
   291
  (((Binding.binding * typ) * mixfix) list *
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   292
   (Attrib.binding * term list) list) *
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   293
  local_theory"}
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   294
*}
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   295
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   296
text {*
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   297
  During parsing, both predicates and parameters are treated as variables, so
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   298
  the lists \verb!preds_syn! and \verb!params_syn! are just appended
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   299
  before being passed to @{ML read_specification in Specification}. Note that the format
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   300
  for rules supported by @{ML read_specification in Specification} is more general than
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   301
  what is required for our package. It allows several rules to be associated
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   302
  with one name, and the list of rules can be partitioned into several
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   303
  sublists. In order for the list \verb!intro_srcs! of introduction rules
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   304
  to be acceptable as an input for @{ML read_specification in Specification}, we first
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   305
  have to turn it into a list of singleton lists. This transformation
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   306
  has to be reversed later on by applying the function
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   307
  @{ML [display] "the_single: 'a list -> 'a"}
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   308
  to the list \verb!specs! containing the parsed introduction rules.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   309
  The function @{ML read_specification in Specification} also returns the list \verb!vars!
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   310
  of predicates and parameters that contains the inferred types as well.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   311
  This list has to be chopped into the two lists \verb!preds_syn'! and
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   312
  \verb!params_syn'! for predicates and parameters, respectively.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   313
  All variables occurring in a rule but not in the list of variables passed to
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   314
  @{ML read_specification in Specification} will be bound by a meta-level universal
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   315
  quantifier.
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   316
*}
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   317
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   318
text {*
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   319
  Finally, @{ML read_specification in Specification} also returns another local theory,
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   320
  but we can safely discard it. As an example, let us look at how we can use this
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   321
  function to parse the introduction rules of the @{text trcl} predicate:
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   322
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   323
  @{ML_response [display]
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   324
"Specification.read_specification
55
0b55402ae95e Adapted to changes in binding module.
berghofe
parents: 53
diff changeset
   325
  [(Binding.name \"trcl\", NONE, NoSyn),
0b55402ae95e Adapted to changes in binding module.
berghofe
parents: 53
diff changeset
   326
   (Binding.name \"r\", SOME \"'a \<Rightarrow> 'a \<Rightarrow> bool\", NoSyn)]
0b55402ae95e Adapted to changes in binding module.
berghofe
parents: 53
diff changeset
   327
  [[((Binding.name \"base\", []), [\"trcl r x x\"])],
0b55402ae95e Adapted to changes in binding module.
berghofe
parents: 53
diff changeset
   328
   [((Binding.name \"step\", []), [\"trcl r x y \<Longrightarrow> r y z \<Longrightarrow> trcl r x z\"])]]
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   329
  @{context}"
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   330
"((\<dots>,
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   331
  [(\<dots>,
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   332
    [Const (\"all\", \<dots>) $ Abs (\"x\", TFree (\"'a\", \<dots>),
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   333
       Const (\"Trueprop\", \<dots>) $
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   334
         (Free (\"trcl\", \<dots>) $ Free (\"r\", \<dots>) $ Bound 0 $ Bound 0))]),
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   335
   (\<dots>,
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   336
    [Const (\"all\", \<dots>) $ Abs (\"x\", TFree (\"'a\", \<dots>),
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   337
       Const (\"all\", \<dots>) $ Abs (\"y\", TFree (\"'a\", \<dots>),
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   338
         Const (\"all\", \<dots>) $ Abs (\"z\", TFree (\"'a\", \<dots>),
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   339
           Const (\"==>\", \<dots>) $
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   340
             (Const (\"Trueprop\", \<dots>) $
42
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 35
diff changeset
   341
               (Free (\"trcl\", \<dots>) $ Free (\"r\", \<dots>) $ Bound 2 $ Bound 1)) $
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   342
             (Const (\"==>\", \<dots>) $ \<dots> $ \<dots>))))])]),
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   343
 \<dots>)
76
b99fa5fa63fc adapted to changes in binding.ML
Christian Urban <urbanc@in.tum.de>
parents: 71
diff changeset
   344
: (((Binding.binding * typ) * mixfix) list *
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   345
   (Attrib.binding * term list) list) * local_theory"}
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   346
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   347
  In the list of variables passed to @{ML read_specification in Specification}, we have
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   348
  used the mixfix annotation @{ML NoSyn} to indicate that we do not want to associate any
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   349
  mixfix syntax with the variable. Moreover, we have only specified the type of \texttt{r},
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   350
  whereas the type of \texttt{trcl} is computed using type inference.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   351
  The local variables \texttt{x}, \texttt{y} and \texttt{z} of the introduction rules
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   352
  are turned into bound variables with the de Bruijn indices,
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   353
  whereas \texttt{trcl} and \texttt{r} remain free variables.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   354
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   355
*}
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   356
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 42
diff changeset
   357
text {*
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   358
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   359
  \paragraph{Parsers for theory syntax}
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   360
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   361
  Although the function @{ML add_inductive in SimpleInductivePackage} parses terms and types, it still
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   362
  cannot be used to invoke the package directly from within a theory document.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   363
  In order to do this, we have to write another parser. Before we describe
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   364
  the process of writing parsers for theory syntax in more detail, we first
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   365
  show some examples of how we would like to use the inductive definition
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   366
  package.
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   367
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   368
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   369
  The definition of the transitive closure should look as follows:
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   370
*}
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   371
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   372
text {*
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   373
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   374
  A proposition can be parsed using the function @{ML prop in OuterParse}.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   375
  Essentially, a proposition is just a string or an identifier, but using the
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   376
  specific parser function @{ML prop in OuterParse} leads to more instructive
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   377
  error messages, since the parser will complain that a proposition was expected
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   378
  when something else than a string or identifier is found.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   379
  An optional locale target specification of the form \isa{(\isacommand{in}\ $\ldots$)}
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   380
  can be parsed using @{ML opt_target in OuterParse}.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   381
  The lists of names of the predicates and parameters, together with optional
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   382
  types and syntax, are parsed using the functions @{ML "fixes" in OuterParse}
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   383
  and @{ML for_fixes in OuterParse}, respectively.
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   384
  In addition, the following function from @{ML_struct SpecParse} for parsing
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   385
  an optional theorem name and attribute, followed by a delimiter, will be useful:
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   386
  
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   387
  \begin{table}
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   388
  @{ML "opt_thm_name:
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   389
  string -> token list -> Attrib.binding * token list" in SpecParse}
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   390
  \end{table}
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   391
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   392
  We now have all the necessary tools to write the parser for our
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   393
  \isa{\isacommand{simple{\isacharunderscore}inductive}} command:
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   394
  
116
c9ff326e3ce5 more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 113
diff changeset
   395
 
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   396
  Once all arguments of the command have been parsed, we apply the function
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   397
  @{ML add_inductive in SimpleInductivePackage}, which yields a local theory
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   398
  transformer of type @{ML_type "local_theory -> local_theory"}. Commands in
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   399
  Isabelle/Isar are realized by transition transformers of type
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   400
  @{ML_type [display] "Toplevel.transition -> Toplevel.transition"}
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   401
  We can turn a local theory transformer into a transition transformer by using
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   402
  the function
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   403
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   404
  @{ML [display] "Toplevel.local_theory : string option ->
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   405
  (local_theory -> local_theory) ->
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   406
  Toplevel.transition -> Toplevel.transition"}
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   407
 
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   408
  which, apart from the local theory transformer, takes an optional name of a locale
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   409
  to be used as a basis for the local theory. 
60
5b9c6010897b doem tuning and made the cookbook work again with recent changes (CookBook/Package/Ind_Interface.thy needs to be looked at to see what the problem with the new parser type is)
Christian Urban <urbanc@in.tum.de>
parents: 55
diff changeset
   410
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   411
  (FIXME : needs to be adjusted to new parser type)
60
5b9c6010897b doem tuning and made the cookbook work again with recent changes (CookBook/Package/Ind_Interface.thy needs to be looked at to see what the problem with the new parser type is)
Christian Urban <urbanc@in.tum.de>
parents: 55
diff changeset
   412
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   413
  {\it
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   414
  The whole parser for our command has type
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 88
diff changeset
   415
  @{text [display] "OuterLex.token list ->
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   416
  (Toplevel.transition -> Toplevel.transition) * OuterLex.token list"}
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 88
diff changeset
   417
  which is abbreviated by @{text OuterSyntax.parser_fn}. The new command can be added
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   418
  to the system via the function
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 88
diff changeset
   419
  @{text [display] "OuterSyntax.command :
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   420
  string -> string -> OuterKeyword.T -> OuterSyntax.parser_fn -> unit"}
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   421
  which imperatively updates the parser table behind the scenes. }
60
5b9c6010897b doem tuning and made the cookbook work again with recent changes (CookBook/Package/Ind_Interface.thy needs to be looked at to see what the problem with the new parser type is)
Christian Urban <urbanc@in.tum.de>
parents: 55
diff changeset
   422
88
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   423
  In addition to the parser, this
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   424
  function takes two strings representing the name of the command and a short description,
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   425
  as well as an element of type @{ML_type OuterKeyword.T} describing which \emph{kind} of
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   426
  command we intend to add. Since we want to add a command for declaring new concepts,
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   427
  we choose the kind @{ML "OuterKeyword.thy_decl"}. Other kinds include
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   428
  @{ML "OuterKeyword.thy_goal"}, which is similar to @{ML thy_decl in OuterKeyword},
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   429
  but requires the user to prove a goal before making the declaration, or
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   430
  @{ML "OuterKeyword.diag"}, which corresponds to a purely diagnostic command that does
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   431
  not change the context. For example, the @{ML thy_goal in OuterKeyword} kind is used
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   432
  by the \isa{\isacommand{function}} command \cite{Krauss-IJCAR06}, which requires the user
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   433
  to prove that a given set of equations is non-overlapping and covers all cases. The kind
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   434
  of the command should be chosen with care, since selecting the wrong one can cause strange
ebbd0dd008c8 adaptation of the package chapter to fit the rest
Christian Urban <urbanc@in.tum.de>
parents: 76
diff changeset
   435
  behaviour of the user interface, such as failure of the undo mechanism.
32
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   436
*}
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   437
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   438
(*<*)
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   439
end
5bb2d29553c2 Added new chapter about writing packages.
berghofe
parents:
diff changeset
   440
(*>*)