doc-src/Locales/Locales/Locales.thy
author wenzelm
Sat, 29 Mar 2008 19:14:00 +0100
changeset 26480 544cef16045b
parent 17567 20c0b69dd192
permissions -rw-r--r--
replaced 'ML_setup' by 'ML';
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
     1
(*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
     2
  Title:  Locales in Isabelle/Isar
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
     3
  Id:	  $Id$
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
     4
  Author: Clemens Ballarin, started 31 January 2003
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
     5
  Copyright (c) 2003 by Clemens Ballarin
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
     6
*)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
     7
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
     8
(*<*)
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 16168
diff changeset
     9
theory Locales imports Main begin
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    10
17567
20c0b69dd192 updated for Isabelle2005;
wenzelm
parents: 16417
diff changeset
    11
ML {* print_mode := "type_brackets" :: !print_mode; *}
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    12
(*>*)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    13
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    14
section {* Overview *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    15
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    16
text {*
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
    17
  The present text is based on~\cite{Ballarin2004a}.  It was updated
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
    18
  for for Isabelle2005, but does not cover locale interpretation.
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
    19
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    20
  Locales are an extension of the Isabelle proof assistant.  They
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    21
  provide support for modular reasoning. Locales were initially
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    22
  developed by Kamm\"uller~\cite{Kammuller2000} to support reasoning
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    23
  in abstract algebra, but are applied also in other domains --- for
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    24
  example, bytecode verification~\cite{Klein2003}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    25
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    26
  Kamm\"uller's original design, implemented in Isabelle99, provides, in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    27
  addition to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    28
  means for declaring locales, a set of ML functions that were used
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    29
  along with ML tactics in a proof.  In the meantime, the input format
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    30
  for proof in Isabelle has changed and users write proof
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    31
  scripts in ML only rarely if at all.  Two new proof styles are
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    32
  available, and can
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    33
  be used interchangeably: linear proof scripts that closely resemble ML
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    34
  tactics, and the structured Isar proof language by
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    35
  Wenzel~\cite{Wenzel2002a}.  Subsequently, Wenzel re-implemented
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    36
  locales for
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    37
  the new proof format.  The implementation, available with
17567
20c0b69dd192 updated for Isabelle2005;
wenzelm
parents: 16417
diff changeset
    38
  Isabelle2002 or later, constitutes a complete re-design and exploits that
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    39
  both Isar and locales are based on the notion of context,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    40
  and thus locales are seen as a natural extension of Isar.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    41
  Nevertheless, locales can also be used with proof scripts:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    42
  their use does not require a deep understanding of the structured
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    43
  Isar proof style.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    44
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    45
  At the same time, Wenzel considerably extended locales.  The most
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    46
  important addition are locale expressions, which allow to combine
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    47
  locales more freely.  Previously only
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    48
  linear inheritance was possible.  Now locales support multiple
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    49
  inheritance through a normalisation algorithm.  New are also
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    50
  structures, which provide special syntax for locale parameters that
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    51
  represent algebraic structures.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    52
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    53
  Unfortunately, Wenzel provided only an implementation but hardly any
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    54
  documentation.  Besides providing documentation, the present paper
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    55
  is a high-level description of locales, and in particular locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    56
  expressions.  It is meant as a first step towards the semantics of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    57
  locales, and also as a base for comparing locales with module concepts
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    58
  in other provers.  It also constitutes the base for future
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    59
  extensions of locales in Isabelle.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    60
  The description was derived mainly by experimenting
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    61
  with locales and partially also by inspecting the code.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    62
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    63
  The main contribution of the author of the present paper is the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    64
  abstract description of Wenzel's version of locales, and in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    65
  particular of the normalisation algorithm for locale expressions (see
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    66
  Section~\ref{sec-normal-forms}).  Contributions to the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    67
  implementation are confined to bug fixes and to provisions that
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    68
  enable the use of locales with linear proof scripts.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    69
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    70
  Concepts are introduced along with examples, so that the text can be
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    71
  used as tutorial.  It is assumed that the reader is somewhat
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    72
  familiar with Isabelle proof scripts.  Examples have been phrased as
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    73
  structured
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    74
  Isar proofs.  However, in order to understand the key concepts,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    75
  including locales expressions and their normalisation, detailed
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    76
  knowledge of Isabelle is not necessary. 
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    77
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    78
\nocite{Nipkow2003,Wenzel2002b,Wenzel2003}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    79
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    80
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    81
section {* Locales: Beyond Proof Contexts *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    82
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    83
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    84
  In tactic-based provers the application of a sequence of proof
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    85
  tactics leads to a proof state.  This state is usually hard to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    86
  predict from looking at the tactic script, unless one replays the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    87
  proof step-by-step.  The structured proof language Isar is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    88
  different.  It is additionally based on \emph{proof contexts},
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    89
  which are directly visible in Isar scripts, and since tactic
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    90
  sequences tend to be short, this commonly leads to clearer proof
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    91
  scripts.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    92
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    93
  Goals are stated with the \textbf{theorem}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    94
  command.  This is followed by a proof.  When discharging a goal
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    95
  requires an elaborate argument
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    96
  (rather than the application of a single tactic) a new context
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    97
  may be entered (\textbf{proof}).  Inside the context, variables may
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    98
  be fixed (\textbf{fix}), assumptions made (\textbf{assume}) and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
    99
  intermediate goals stated (\textbf{have}) and proved.  The
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   100
  assumptions must be dischargeable by premises of the surrounding
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   101
  goal, and once this goal has been proved (\textbf{show}) the proof context
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   102
  can be closed (\textbf{qed}). Contexts inherit from surrounding
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   103
  contexts, but it is not possible
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   104
  to export from them (with exception of the proved goal);
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   105
  they ``disappear'' after the closing \textbf{qed}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   106
  Facts may have attributes --- for example, identifying them as
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   107
  default to the simplifier or classical reasoner.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   108
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   109
  Locales extend proof contexts in various ways:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   110
  \begin{itemize}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   111
  \item
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   112
    Locales are usually \emph{named}.  This makes them persistent.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   113
  \item
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   114
    Fixed variables may have \emph{syntax}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   115
  \item
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   116
    It is possible to \emph{add} and \emph{export} facts.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   117
  \item
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   118
    Locales can be combined and modified with \emph{locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   119
    expressions}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   120
  \end{itemize}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   121
  The Locales facility extends the Isar language: it provides new ways
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   122
  of stating and managing facts, but it does not modify the language
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   123
  for proofs.  Its purpose is to support writing modular proofs.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   124
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   125
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   126
section {* Simple Locales *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   127
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   128
subsection {* Syntax and Terminology *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   129
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   130
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   131
  The grammar of Isar is extended by commands for locales as shown in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   132
  Figure~\ref{fig-grammar}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   133
  A key concept, introduced by Wenzel, is that
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   134
  locales are (internally) lists
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   135
  of \emph{context elements}.  There are five kinds, identified
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   136
  by the keywords \textbf{fixes}, \textbf{constrains},
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   137
  \textbf{assumes}, \textbf{defines} and \textbf{notes}.
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   138
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   139
  \begin{figure}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   140
  \hrule
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   141
  \vspace{2ex}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   142
  \begin{small}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   143
  \begin{tabular}{l>$c<$l}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   144
  \textit{attr-name} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   145
  & \textit{name} $|$ \textit{attribute} $|$
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   146
    \textit{name} \textit{attribute} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   147
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   148
  \textit{locale-expr}  & ::= 
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   149
  & \textit{locale-expr1} ( ``\textbf{+}'' \textit{locale-expr1} )$^*$ \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   150
  \textit{locale-expr1} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   151
  & ( \textit{qualified-name} $|$
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   152
    ``\textbf{(}'' \textit{locale-expr} ``\textbf{)}'' ) \\
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   153
  & & ( \textit{name} [ \textit{mixfix} ] $|$ ``\textbf{\_}'' )$^*$ \\
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   154
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   155
  \textit{fixes} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   156
  & \textit{name} [ ``\textbf{::}'' \textit{type} ]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   157
    [ ``\textbf{(}'' \textbf{structure} ``\textbf{)}'' $|$
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   158
    \textit{mixfix} ] \\
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   159
  \textit{constrains} & ::=
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   160
  & \textit{name} ``\textbf{::}'' \textit{type} \\
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   161
  \textit{assumes} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   162
  & [ \textit{attr-name} ``\textbf{:}'' ] \textit{proposition} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   163
  \textit{defines} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   164
  & [ \textit{attr-name} ``\textbf{:}'' ] \textit{proposition} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   165
  \textit{notes} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   166
  & [ \textit{attr-name} ``\textbf{=}'' ]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   167
    ( \textit{qualified-name} [ \textit{attribute} ] )$^+$ \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   168
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   169
  \textit{element} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   170
  & \textbf{fixes} \textit{fixes} ( \textbf{and} \textit{fixes} )$^*$ \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   171
  & |
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   172
  & \textbf{constrains} \textit{constrains}
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   173
    ( \textbf{and} \textit{constrains} )$^*$ \\
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   174
  & |
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   175
  & \textbf{assumes} \textit{assumes} ( \textbf{and} \textit{assumes} )$^*$ \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   176
  & |
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   177
  & \textbf{defines} \textit{defines} ( \textbf{and} \textit{defines} )$^*$ \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   178
  & |
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   179
  & \textbf{notes} \textit{notes} ( \textbf{and} \textit{notes} )$^*$ \\
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   180
  \textit{element1} & ::=
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   181
  & \textit{element} \\
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   182
  & | & \textbf{includes} \textit{locale-expr} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   183
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   184
  \textit{locale} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   185
  & \textit{element}$^+$ \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   186
  & | & \textit{locale-expr} [ ``\textbf{+}'' \textit{element}$^+$ ] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   187
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   188
  \textit{in-target} & ::=
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   189
  & ``\textbf{(}'' \textbf{in} \textit{qualified-name} ``\textbf{)}'' \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   190
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   191
  \textit{theorem} & ::= & ( \textbf{theorem} $|$ \textbf{lemma} $|$
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   192
    \textbf{corollary} ) [ \textit{in-target} ] [ \textit{attr-name} ] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   193
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   194
  \textit{theory-level} & ::= & \ldots \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   195
  & | & \textbf{locale} \textit{name} [ ``\textbf{=}''
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   196
    \textit{locale} ] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   197
  % note: legacy "locale (open)" omitted.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   198
  & | & ( \textbf{theorems} $|$ \textbf{lemmas} ) \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   199
  & & [ \textit{in-target} ] [ \textit{attr-name} ``\textbf{=}'' ]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   200
    ( \textit{qualified-name} [ \textit{attribute} ] )$^+$ \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   201
  & | & \textbf{declare} [ \textit{in-target} ] ( \textit{qualified-name}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   202
    [ \textit{attribute} ] )$^+$ \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   203
  & | & \textit{theorem} \textit{proposition} \textit{proof} \\
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   204
  & | & \textit{theorem} \textit{element1}$^*$
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   205
    \textbf{shows} \textit{proposition} \textit{proof} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   206
  & | & \textbf{print\_locale} \textit{locale} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   207
  & | & \textbf{print\_locales}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   208
  \end{tabular}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   209
  \end{small}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   210
  \vspace{2ex}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   211
  \hrule
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   212
  \caption{Locales extend the grammar of Isar.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   213
  \label{fig-grammar}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   214
  \end{figure}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   215
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   216
  At the theory level --- that is, at the outer syntactic level of an
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   217
  Isabelle input file --- \textbf{locale} declares a named
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   218
  locale.  Other kinds of locales,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   219
  locale expressions and unnamed locales, will be introduced later.  When
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   220
  declaring a named locale, it is possible to \emph{import} another
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   221
  named locale, or indeed several ones by importing a locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   222
  expression.  The second part of the declaration, also optional,
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   223
  consists of a number of context element declarations.
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   224
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   225
  A number of Isar commands have an additional, optional \emph{target}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   226
  argument, which always refers to a named locale.  These commands
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   227
  are \textbf{theorem} (together with \textbf{lemma} and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   228
  \textbf{corollary}),  \textbf{theorems} (and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   229
  \textbf{lemmas}), and \textbf{declare}.  The effect of specifying a target is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   230
  that these commands focus on the specified locale, not the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   231
  surrounding theory.  Commands that are used to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   232
  prove new theorems will add them not to the theory, but to the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   233
  locale.  Similarly, \textbf{declare} modifies attributes of theorems
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   234
  that belong to the specified target.  Additionally, for
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   235
  \textbf{theorem} (and related commands), theorems stored in the target
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   236
  can be used in the associated proof scripts.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   237
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   238
  The Locales package provides a \emph{long goals format} for
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   239
  propositions stated with \textbf{theorem} (and friends).  While
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   240
  normally a goal is just a formula, a long goal is a list of context
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   241
  elements, followed by the keyword \textbf{shows}, followed by the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   242
  formula.  Roughly speaking, the context elements are
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   243
  (additional) premises.  For an example, see
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   244
  Section~\ref{sec-includes}.  The list of context elements in a long goal
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   245
  is also called \emph{unnamed locale}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   246
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   247
  Finally, there are two commands to inspect locales when working in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   248
  interactive mode: \textbf{print\_locales} prints the names of all
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   249
  targets
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   250
  visible in the current theory, \textbf{print\_locale} outputs the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   251
  elements of a named locale or locale expression.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   252
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   253
  The following presentation will use notation of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   254
  Isabelle's meta logic, hence a few sentences to explain this.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   255
  The logical
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   256
  primitives are universal quantification (@{text "\<And>"}), entailment
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   257
  (@{text "\<Longrightarrow>"}) and equality (@{text "\<equiv>"}).  Variables (not bound
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   258
  variables) are sometimes preceded by a question mark.  The logic is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   259
  typed.  Type variables are denoted by @{text "'a"}, @{text "'b"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   260
  etc., and @{text "\<Rightarrow>"} is the function type.  Double brackets @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   261
  "\<lbrakk>"} and @{text "\<rbrakk>"} are used to abbreviate nested entailment.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   262
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   263
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   264
subsection {* Parameters, Assumptions and Facts *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   265
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   266
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   267
  From a logical point of view a \emph{context} is a formula schema of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   268
  the form
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   269
\[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   270
  @{text "\<And>x\<^sub>1\<dots>x\<^sub>n. \<lbrakk> C\<^sub>1; \<dots> ;C\<^sub>m \<rbrakk> \<Longrightarrow> \<dots>"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   271
\]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   272
  The variables $@{text "x\<^sub>1"}, \ldots, @{text "x\<^sub>n"}$ are
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   273
  called \emph{parameters}, the premises $@{text "C\<^sub>1"}, \ldots,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   274
  @{text "C\<^sub>n"}$ \emph{assumptions}.  A formula @{text "F"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   275
  holds in this context if
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   276
\begin{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   277
\label{eq-fact-in-context}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   278
  @{text "\<And>x\<^sub>1\<dots>x\<^sub>n. \<lbrakk> C\<^sub>1; \<dots> ;C\<^sub>m \<rbrakk> \<Longrightarrow> F"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   279
\end{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   280
  is valid.  The formula is called a \emph{fact} of the context.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   281
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   282
  A locale allows fixing the parameters @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   283
  "x\<^sub>1, \<dots>, x\<^sub>n"} and making the assumptions @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   284
  "C\<^sub>1, \<dots>, C\<^sub>m"}.  This implicitly builds the context in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   285
  which the formula @{text "F"} can be established.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   286
  Parameters of a locale correspond to the context element
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   287
  \textbf{fixes}, and assumptions may be declared with
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   288
  \textbf{assumes}.  Using these context elements one can define
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   289
  the specification of semigroups.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   290
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   291
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   292
locale semi =
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   293
  fixes prod :: "['a, 'a] \<Rightarrow> 'a" (infixl "\<cdot>" 70)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   294
  assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   295
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   296
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   297
  The parameter @{term prod} has a
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   298
  syntax annotation enabling the infix ``@{text "\<cdot>"}'' in the
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   299
  assumption of associativity.  Parameters may have arbitrary mixfix
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   300
  syntax, like constants.  In the example, the type of @{term prod} is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   301
  specified explicitly.  This is not necessary.  If no type is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   302
  specified, a most general type is inferred simultaneously for all
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   303
  parameters, taking into account all assumptions (and type
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   304
  specifications of parameters, if present).%
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   305
\footnote{Type inference also takes into account type constraints,
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   306
  definitions and import, as introduced later.}
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   307
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   308
  Free variables in assumptions are implicitly universally quantified,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   309
  unless they are parameters.  Hence the context defined by the locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   310
  @{term "semi"} is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   311
\[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   312
  @{text "\<And>prod. \<lbrakk> \<And>x y z. prod (prod x y) z = prod x (prod y z)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   313
  \<rbrakk> \<Longrightarrow> \<dots>"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   314
\]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   315
  The locale can be extended to commutative semigroups.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   316
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   317
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   318
locale comm_semi = semi +
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   319
  assumes comm: "x \<cdot> y = y \<cdot> x"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   320
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   321
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   322
  This locale \emph{imports} all elements of @{term "semi"}.  The
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   323
  latter locale is called the import of @{term "comm_semi"}. The
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   324
  definition adds commutativity, hence its context is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   325
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   326
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   327
  @{text "\<And>prod. \<lbrakk> "} & 
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   328
  @{text "\<And>x y z. prod (prod x y) z = prod x (prod y z);"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   329
  & @{text "\<And>x y. prod x y = prod y x \<rbrakk> \<Longrightarrow> \<dots>"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   330
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   331
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   332
  One may now derive facts --- for example, left-commutativity --- in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   333
  the context of @{term "comm_semi"} by specifying this locale as
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   334
  target, and by referring to the names of the assumptions @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   335
  assoc} and @{text comm} in the proof.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   336
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   337
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   338
theorem (in comm_semi) lcomm:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   339
  "x \<cdot> (y \<cdot> z) = y \<cdot> (x \<cdot> z)"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   340
proof -
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   341
  have "x \<cdot> (y \<cdot> z) = (x \<cdot> y) \<cdot> z" by (simp add: assoc)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   342
  also have "\<dots> = (y \<cdot> x) \<cdot> z" by (simp add: comm)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   343
  also have "\<dots> = y \<cdot> (x \<cdot> z)" by (simp add: assoc)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   344
  finally show ?thesis .
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   345
qed
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   346
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   347
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   348
  In this equational Isar proof, ``@{text "\<dots>"}'' refers to the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   349
  right hand side of the preceding equation.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   350
  After the proof is finished, the fact @{text "lcomm"} is added to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   351
  the locale @{term "comm_semi"}.  This is done by adding a
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   352
  \textbf{notes} element to the internal representation of the locale,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   353
  as explained the next section.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   354
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   355
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   356
subsection {* Locale Predicates and the Internal Representation of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   357
  Locales *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   358
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   359
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   360
\label{sec-locale-predicates}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   361
  In mathematical texts, often arbitrary but fixed objects with
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   362
  certain properties are considered --- for instance, an arbitrary but
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   363
  fixed group $G$ --- with the purpose of establishing facts valid for
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   364
  any group.  These facts are subsequently used on other objects that
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   365
  also have these properties.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   366
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   367
  Locales permit the same style of reasoning.  Exporting a fact $F$
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   368
  generalises the fixed parameters and leads to a (valid) formula of the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   369
  form of equation~(\ref{eq-fact-in-context}).  If a locale has many
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   370
  assumptions
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   371
  (possibly accumulated through a number of imports) this formula can
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   372
  become large and cumbersome.  Therefore, Wenzel introduced 
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   373
  predicates that abbreviate the assumptions of locales.  These
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   374
  predicates are not confined to the locale but are visible in the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   375
  surrounding theory.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   376
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   377
  The definition of the locale @{term semi} generates the \emph{locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   378
  predicate} @{term semi} over the type of the parameter @{term prod},
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   379
  hence the predicate's type is @{typ "(['a, 'a] \<Rightarrow> 'a)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   380
  \<Rightarrow> bool"}.  Its
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   381
  definition is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   382
\begin{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   383
  \tag*{@{thm [source] semi_def}:} @{thm semi_def}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   384
\end{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   385
  In the case where the locale has no import, the generated
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   386
  predicate abbreviates all assumptions and is over the parameters
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   387
  that occur in these assumptions.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   388
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   389
  The situation is more complicated when a locale extends
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   390
  another locale, as is the case for @{term comm_semi}.  Two
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   391
  predicates are defined.  The predicate
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   392
  @{term comm_semi_axioms} corresponds to the new assumptions and is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   393
  called \emph{delta predicate}, the locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   394
  predicate @{term comm_semi} captures the content of all the locale,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   395
  including the import.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   396
  If a locale has neither assumptions nor import, no predicate is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   397
  defined.  If a locale has import but no assumptions, only the locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   398
  predicate is defined.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   399
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   400
(*<*)
26480
544cef16045b replaced 'ML_setup' by 'ML';
wenzelm
parents: 17567
diff changeset
   401
ML {*
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   402
  val [comm_semi_ax1, comm_semi_ax2] = thms "comm_semi.axioms";
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   403
  bind_thm ("comm_semi_ax1", comm_semi_ax1);
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   404
  bind_thm ("comm_semi_ax2", comm_semi_ax2);
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   405
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   406
(*>*)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   407
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   408
  The Locales package generates a number of theorems for locale and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   409
  delta predicates.  All predicates have a definition and an
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   410
  introduction rule.  Locale predicates that are defined in terms of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   411
  other predicates (which is the case if and only if the locale has
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   412
  import) also have a number of elimination rules (called
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   413
  \emph{axioms}).  All generated theorems for the predicates of the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   414
  locales @{text semi} and @{text comm_semi} are shown in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   415
  Figures~\ref{fig-theorems-semi} and~\ref{fig-theorems-comm-semi},
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   416
  respectively.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   417
  \begin{figure}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   418
  \hrule
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   419
  \vspace{2ex}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   420
  Theorems generated for the predicate @{term semi}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   421
  \begin{gather}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   422
    \tag*{@{thm [source] semi_def}:} @{thm semi_def} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   423
    \tag*{@{thm [source] semi.intro}:} @{thm semi.intro}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   424
  \end{gather}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   425
  \hrule
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   426
  \caption{Theorems for the locale predicate @{term "semi"}.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   427
  \label{fig-theorems-semi}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   428
  \end{figure}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   429
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   430
  \begin{figure}[h]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   431
  \hrule
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   432
  \vspace{2ex}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   433
  Theorems generated for the predicate @{term "comm_semi_axioms"}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   434
  \begin{gather}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   435
    \tag*{@{thm [source] comm_semi_axioms_def}:} @{thm
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   436
    comm_semi_axioms_def} \\                        
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   437
    \tag*{@{thm [source] comm_semi_axioms.intro}:} @{thm
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   438
    comm_semi_axioms.intro}                       
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   439
  \end{gather}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   440
  Theorems generated for the predicate @{term "comm_semi"}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   441
  \begin{gather}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   442
    \tag*{@{thm [source] comm_semi_def}:} @{thm
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   443
    comm_semi_def} \\                          
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   444
    \tag*{@{thm [source] comm_semi.intro}:} @{thm
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   445
    comm_semi.intro} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   446
    \tag*{@{thm [source] comm_semi.axioms}:} \mbox{} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   447
    \notag @{thm comm_semi_ax1} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   448
    \notag @{thm comm_semi_ax2}               
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   449
  \end{gather} 
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   450
  \hrule
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   451
  \caption{Theorems for the predicates @{term "comm_semi_axioms"} and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   452
    @{term "comm_semi"}.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   453
  \label{fig-theorems-comm-semi}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   454
  \end{figure}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   455
  Note that the theorems generated by a locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   456
  definition may be inspected immediately after the definition in the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   457
  Proof General interface \cite{Aspinall2000} of Isabelle through
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   458
  the menu item ``Isabelle/Isar$>$Show me $\ldots>$Theorems''.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   459
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   460
  Locale and delta predicates are used also in the internal
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   461
  representation of locales as lists of context elements.  While all
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   462
  \textbf{fixes} in a
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   463
  declaration generate internal \textbf{fixes}, all assumptions
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   464
  of one locale declaration contribute to one internal \textbf{assumes}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   465
  element.  The internal representation of @{term semi} is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   466
\[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   467
\begin{array}{ll}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   468
  \textbf{fixes} & @{text prod} :: @{typ [quotes] "['a, 'a] \<Rightarrow> 'a"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   469
    (\textbf{infixl} @{text [quotes] "\<cdot>"} 70) \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   470
  \textbf{assumes} & @{text [quotes] "semi prod"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   471
  \textbf{notes} & @{text assoc}: @{text [quotes] "?x \<cdot> ?y \<cdot> ?z = ?x \<cdot> (?y \<cdot>
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   472
    ?z)"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   473
\end{array}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   474
\]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   475
  and the internal representation of @{text [quotes] comm_semi} is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   476
\begin{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   477
\label{eq-comm-semi}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   478
\begin{array}{ll}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   479
  \textbf{fixes} & @{text prod} :: @{typ [quotes] "['a, 'a] \<Rightarrow> 'a"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   480
    ~(\textbf{infixl}~@{text [quotes] "\<cdot>"}~70) \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   481
  \textbf{assumes} & @{text [quotes] "semi prod"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   482
  \textbf{notes} & @{text assoc}: @{text [quotes] "?x \<cdot> ?y \<cdot> ?z = ?x \<cdot> (?y \<cdot>
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   483
    ?z)"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   484
  \textbf{assumes} & @{text [quotes] "comm_semi_axioms prod"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   485
  \textbf{notes} & @{text comm}: @{text [quotes] "?x \<cdot> ?y = ?y \<cdot> ?x"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   486
  \textbf{notes} & @{text lcomm}: @{text [quotes] "?x \<cdot> (?y \<cdot> ?z) = ?y \<cdot> (?x \<cdot>
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   487
    ?z)"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   488
\end{array}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   489
\end{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   490
  The \textbf{notes} elements store facts of the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   491
  locales.  The facts @{text assoc} and @{text comm} were added
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   492
  during the declaration of the locales.  They stem from assumptions,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   493
  which are trivially facts.  The fact @{text lcomm} was
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   494
  added later, after finishing the proof in the respective
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   495
  \textbf{theorem} command above.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   496
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   497
  By using \textbf{notes} in a declaration, facts can be added
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   498
  to a locale directly.  Of course, these must be theorems.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   499
  Typical use of this feature includes adding theorems that are not
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   500
  usually used as a default rewrite rules by the simplifier to the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   501
  simpset of the locale by a \textbf{notes} element with the attribute
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   502
  @{text "[simp]"}.  This way it is also possible to add specialised
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   503
  versions of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   504
  theorems to a locale by instantiating locale parameters for unknowns
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   505
  or locale assumptions for premises.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   506
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   507
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   508
subsection {* Definitions *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   509
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   510
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   511
  Definitions were available in Kamm\"uller's version of Locales, and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   512
  they are in Wenzel's.  
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   513
  The context element \textbf{defines} adds a definition of the form
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   514
  @{text "p x\<^sub>1 \<dots> x\<^sub>n \<equiv> t"} as an assumption, where @{term p} is a
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   515
  parameter of the locale (possibly an imported parameter), and @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   516
  t} a term that may contain the @{text "x\<^sub>i"}.  The parameter may
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   517
  neither occur in a previous \textbf{assumes} or \textbf{defines}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   518
  element, nor on the right hand side of the definition.  Hence
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   519
  recursion is not allowed.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   520
  The parameter may, however, occur in subsequent \textbf{assumes} and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   521
  on the right hand side of subsequent \textbf{defines}.  We call
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   522
  @{term p} \emph{defined parameter}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   523
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   524
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   525
locale semi2 = semi +
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   526
  fixes rprod (infixl "\<odot>" 70)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   527
  defines rprod_def: "rprod x y \<equiv> y \<cdot> x "
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   528
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   529
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   530
  This locale extends @{term semi} by a second binary operation @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   531
  [quotes] \<odot>} that is like @{text [quotes] \<cdot>} but with
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   532
  reversed arguments.  The
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   533
  definition of the locale generates the predicate @{term semi2},
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   534
  which is equivalent to @{text semi}, but no @{term "semi2_axioms"}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   535
  The difference between \textbf{assumes} and \textbf{defines} lies in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   536
  the way parameters are treated on export.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   537
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   538
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   539
subsection {* Export *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   540
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   541
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   542
  A fact is exported out
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   543
  of a locale by generalising over the parameters and adding
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   544
  assumptions as premises.  For brevity of the exported theorems,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   545
  locale predicates are used.  Exported facts are referenced by
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   546
  writing qualified names consisting of the locale name and the fact name ---
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   547
  for example,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   548
\begin{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   549
  \tag*{@{thm [source] semi.assoc}:} @{thm semi.assoc}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   550
\end{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   551
  Defined parameters receive special treatment.  Instead of adding a
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   552
  premise for the definition, the definition is unfolded in the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   553
  exported theorem.  In order to illustrate this we prove that the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   554
  reverse operation @{text [quotes] \<odot>} defined in the locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   555
  @{text semi2} is also associative.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   556
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   557
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   558
theorem (in semi2) r_assoc: "(x \<odot> y) \<odot> z = x \<odot> (y \<odot> z)"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   559
  by (simp only: rprod_def assoc)                                    
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   560
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   561
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   562
  The exported fact is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   563
\begin{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   564
  \tag*{@{thm [source] semi2.r_assoc}:} @{thm semi2.r_assoc}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   565
\end{equation}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   566
  The defined parameter is not present but is replaced by its
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   567
  definition.  Note that the definition itself is not exported, hence
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   568
  there is no @{text "semi2.rprod_def"}.%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   569
\footnote{The definition could alternatively be exported using a
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   570
  let-construct if there was one in Isabelle's meta-logic.  Let is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   571
  usually defined in object-logics.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   572
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   573
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   574
section {* Locale Expressions *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   575
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   576
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   577
  Locale expressions provide a simple language for combining
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   578
  locales.  They are an effective means of building complex
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   579
  specifications from simple ones.  Locale expressions are the main
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   580
  innovation of the version of Locales discussed here.  Locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   581
  expressions are also reason for introducing locale predicates.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   582
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   583
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   584
subsection {* Rename and Merge *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   585
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   586
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   587
  The grammar of locale expressions is part of the grammar in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   588
  Figure~\ref{fig-grammar}.  Locale names are locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   589
  expressions, and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   590
  further expressions are obtained by \emph{rename} and \emph{merge}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   591
\begin{description}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   592
\item[Rename.]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   593
  The locale expression $e\: q_1 \ldots q_n$ denotes
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   594
  the locale of $e$ where pa\-ra\-me\-ters, in the order in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   595
  which they are fixed, are renamed to $q_1$ to $q_n$.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   596
  The expression is only well-formed if $n$ does not
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   597
  exceed the number of parameters of $e$.  Underscores denote
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   598
  parameters that are not renamed.
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   599
  Renaming by default removes mixfix syntax, but new syntax may be
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   600
  specified.
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   601
\item[Merge.]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   602
  The locale expression $e_1 + e_2$ denotes
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   603
  the locale obtained by merging the locales of $e_1$
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   604
  and $e_2$.  This locale contains the context elements
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   605
  of $e_1$, followed by the context elements of $e_2$.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   606
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   607
  In actual fact, the semantics of the merge operation
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   608
  is more complicated.  If $e_1$ and $e_2$ are expressions containing
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   609
  the same name, followed by
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   610
  identical parameter lists, then the merge of both will contain
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   611
  the elements of those locales only once.  Details are explained in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   612
  Section~\ref{sec-normal-forms} below.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   613
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   614
  The merge operation is associative but not commutative.  The latter
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   615
  is because parameters of $e_1$ appear
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   616
  before parameters of $e_2$ in the composite expression.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   617
\end{description}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   618
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   619
  Rename can be used if a different parameter name seems more
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   620
  appropriate --- for example, when moving from groups to rings, a
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   621
  parameter @{text G} representing the group could be changed to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   622
  @{text R}.  Besides of this stylistic use, renaming is important in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   623
  combination with merge.  Both operations are used in the following
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   624
  specification of semigroup homomorphisms.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   625
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   626
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   627
locale semi_hom = comm_semi sum (infixl "\<oplus>" 65) + comm_semi +
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   628
  fixes hom
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   629
  assumes hom: "hom (x \<oplus> y) = hom x \<cdot> hom y"
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   630
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   631
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   632
  This locale defines a context with three parameters @{text "sum"},
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   633
  @{text "prod"} and @{text "hom"}.  The first two parameters have
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   634
  mixfix syntax.  They are associative operations,
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   635
  the first of type @{typeof [locale=semi_hom] prod}, the second of
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   636
  type @{typeof [locale=semi_hom] sum}.  
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   637
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   638
  How are facts that are imported via a locale expression identified?
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   639
  Facts are always introduced in a named locale (either in the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   640
  locale's declaration, or by using the locale as target in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   641
  \textbf{theorem}), and their names are
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   642
  qualified by the parameter names of this locale.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   643
  Hence the full name of associativity in @{text "semi"} is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   644
  @{text "prod.assoc"}.  Renaming parameters of a target also renames
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   645
  the qualifier of facts.  Hence, associativity of @{text "sum"} is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   646
  @{text "sum.assoc"}.  Several parameters are separated by
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   647
  underscores in qualifiers.  For example, the full name of the fact
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   648
  @{text "hom"} in the locale @{text "semi_hom"} is @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   649
  "sum_prod_hom.hom"}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   650
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   651
  The following example is quite artificial, it illustrates the use of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   652
  facts, though.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   653
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   654
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   655
theorem (in semi_hom) "hom x \<cdot> (hom y \<cdot> hom z) = hom (x \<oplus> (y \<oplus> z))"
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   656
proof -
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   657
  have "hom x \<cdot> (hom y \<cdot> hom z) = hom y \<cdot> (hom x \<cdot> hom z)"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   658
    by (simp add: prod.lcomm)
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   659
  also have "\<dots> = hom (y \<oplus> (x \<oplus> z))" by (simp add: hom)
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   660
  also have "\<dots> = hom (x \<oplus> (y \<oplus> z))" by (simp add: sum.lcomm)
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   661
  finally show ?thesis .
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   662
qed
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   663
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   664
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   665
  Importing via a locale expression imports all facts of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   666
  the imported locales, hence both @{text "sum.lcomm"} and @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   667
  "prod.lcomm"} are
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   668
  available in @{text "hom_semi"}.  The import is dynamic --- that is,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   669
  whenever facts are added to a locale, they automatically
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   670
  become available in subsequent \textbf{theorem} commands that use
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   671
  the locale as a target, or a locale importing the locale.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   672
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   673
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   674
subsection {* Normal Forms *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   675
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   676
text_raw {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   677
\label{sec-normal-forms}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   678
\newcommand{\I}{\mathcal{I}}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   679
\newcommand{\F}{\mathcal{F}}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   680
\newcommand{\N}{\mathcal{N}}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   681
\newcommand{\C}{\mathcal{C}}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   682
\newcommand{\App}{\mathbin{\overline{@}}}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   683
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   684
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   685
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   686
  Locale expressions are interpreted in a two-step process.  First, an
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   687
  expression is normalised, then it is converted to a list of context
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   688
  elements.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   689
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   690
  Normal forms are based on \textbf{locale} declarations.  These
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   691
  consist of an import section followed by a list of context
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   692
  elements.  Let $\I(l)$ denote the locale expression imported by
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   693
  locale $l$.  If $l$ has no import then $\I(l) = \varepsilon$.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   694
  Likewise, let $\F(l)$ denote the list of context elements, also
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   695
  called the \emph{context fragment} of $l$.  Note that $\F(l)$
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   696
  contains only those context elements that are stated in the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   697
  declaration of $l$, not imported ones.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   698
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   699
\paragraph{Example 1.}  Consider the locales @{text semi} and @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   700
  "comm_semi"}.  We have $\I(@{text semi}) = \varepsilon$ and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   701
  $\I(@{text "comm_semi"}) = @{text semi}$, and the context fragments
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   702
  are
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   703
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   704
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   705
  \F(@{text semi}) & = \left[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   706
\begin{array}{ll}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   707
  \textbf{fixes} & @{text prod} :: @{typ [quotes] "['a, 'a] \<Rightarrow> 'a"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   708
    ~(\textbf{infixl}~@{text [quotes] "\<cdot>"}~70) \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   709
  \textbf{assumes} & @{text [quotes] "semi prod"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   710
  \textbf{notes} & @{text assoc}: @{text  [quotes]"?x \<cdot> ?y \<cdot> ?z = ?x \<cdot> (?y \<cdot>
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   711
    ?z)"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   712
\end{array} \right], \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   713
  \F(@{text "comm_semi"}) & = \left[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   714
\begin{array}{ll}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   715
  \textbf{assumes} & @{text [quotes] "comm_semi_axioms prod"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   716
  \textbf{notes} & @{text comm}: @{text [quotes] "?x \<cdot> ?y = ?y \<cdot> ?x"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   717
  \textbf{notes} & @{text lcomm}: @{text [quotes] "?x \<cdot> (?y \<cdot> ?z) = ?y \<cdot> (?x \<cdot>
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   718
    ?z)"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   719
\end{array} \right].
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   720
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   721
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   722
  Let $\pi_0(\F(l))$ denote the list of parameters defined in the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   723
  \textbf{fixes} elements of $\F(l)$ in the order of their occurrence.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   724
  The list of parameters of a locale expression $\pi(e)$ is defined as
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   725
  follows:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   726
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   727
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   728
  \pi(l) & = \pi(\I(l)) \App \pi_0(\F(l)) \text{, for named locale $l$.} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   729
  \pi(e\: q_1 \ldots q_n) & = \text{$[q_1, \ldots, q_n, p_{n+1}, \ldots,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   730
    p_{m}]$, where $\pi(e) = [p_1, \ldots, p_m]$.} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   731
  \pi(e_1 + e_2) & = \pi(e_1) \App \pi(e_2)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   732
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   733
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   734
  The operation $\App$ concatenates two lists but omits elements from
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   735
  the second list that are also present in the first list.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   736
  It is not possible to rename more parameters than there
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   737
  are present in an expression --- that is, $n \le m$ --- otherwise
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   738
  the renaming is illegal.  If $q_i
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   739
  = \_$ then the $i$th entry of the resulting list is $p_i$.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   740
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   741
  In the normalisation phase, imports of named locales are unfolded, and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   742
  renames and merges are recursively propagated to the imported locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   743
  expressions.  The result is a list of locale names, each with a full
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   744
  list of parameters, where locale names occurring with the same parameter
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   745
  list twice are removed.  Let $\N$ denote normalisation.  It is defined
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   746
  by these equations:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   747
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   748
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   749
  \N(l) & = \N(\I(l)) \App [l\:\pi(l)] \text{, for named locale $l$.} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   750
  \N(e\: q_1 \ldots q_n) & = \N(e)\:[q_1 \ldots q_n/\pi(e)] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   751
  \N(e_1 + e_2) & = \N(e_1) \App \N(e_2)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   752
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   753
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   754
  Normalisation yields a list of \emph{identifiers}.  An identifier
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   755
  consists of a locale name and a (possibly empty) list of parameters.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   756
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   757
  In the second phase, the list of identifiers $\N(e)$ is converted to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   758
  a list of context elements $\C(e)$ by converting each identifier to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   759
  a list of context elements, and flattening the obtained list.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   760
  Conversion of the identifier $l\:q_1 \ldots q_n$ yields the list of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   761
  context elements $\F(l)$, but with the following modifications:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   762
\begin{itemize}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   763
\item
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   764
  Rename the parameter in the $i$th \textbf{fixes} element of $\F(l)$
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   765
  to $q_i$, $i = 1, \ldots, n$.  If the parameter name is actually
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   766
  changed then delete the syntax annotation.  Renaming a parameter may
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   767
  also change its type.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   768
\item
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   769
  Perform the same renamings on all occurrences of parameters (fixed
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   770
  variables) in \textbf{assumes}, \textbf{defines} and \textbf{notes}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   771
  elements.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   772
\item
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   773
  Qualify names of facts by $q_1\_\ldots\_q_n$.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   774
\end{itemize}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   775
  The locale expression is \emph{well-formed} if it contains no
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   776
  illegal renamings and the following conditions on $\C(e)$ hold,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   777
  otherwise the expression is rejected:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   778
\begin{itemize}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   779
\item Parameters in \textbf{fixes} are distinct;
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   780
\item Free variables in \textbf{assumes} and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   781
  \textbf{defines} occur in preceding \textbf{fixes};%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   782
\footnote{This restriction is relaxed for contexts obtained with
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   783
  \textbf{includes}, see Section~\ref{sec-includes}.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   784
\item Parameters defined in \textbf{defines} must neither occur in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   785
  preceding \textbf{assumes} nor \textbf{defines}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   786
\end{itemize}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   787
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   788
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   789
subsection {* Examples *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   790
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   791
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   792
\paragraph{Example 2.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   793
  We obtain the context fragment $\C(@{text "comm_semi"})$ of the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   794
  locale @{text "comm_semi"}.  First, the parameters are computed.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   795
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   796
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   797
  \pi(@{text "semi"}) & = [@{text prod}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   798
  \pi(@{text "comm_semi"}) & = \pi(@{text "semi"}) \App []
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   799
     = [@{text prod}]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   800
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   801
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   802
  Next, the normal form of the locale expression
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   803
  @{text "comm_semi"} is obtained.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   804
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   805
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   806
  \N(@{text "semi"}) & = [@{text semi} @{text prod}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   807
  \N(@{text "comm_semi"}) & = \N(@{text "semi"}) \App
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   808
       [@{text "comm_semi prod"}]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   809
   = [@{text "semi prod"}, @{text "comm_semi prod"}]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   810
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   811
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   812
  Converting this to a list of context elements leads to the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   813
  list~(\ref{eq-comm-semi}) shown in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   814
  Section~\ref{sec-locale-predicates}, but with fact names qualified
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   815
  by @{text prod} --- for example, @{text "prod.assoc"}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   816
  Qualification was omitted to keep the presentation simple.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   817
  Isabelle's scoping rules identify the most recent fact with
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   818
  qualified name $x.a$ when a fact with name $a$ is requested.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   819
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   820
\paragraph{Example 3.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   821
  The locale expression @{text "comm_semi sum"} involves
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   822
  renaming.  Computing parameters yields $\pi(@{text "comm_semi sum"})
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   823
  = [@{text sum}]$, the normal form is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   824
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   825
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   826
  \N(@{text "comm_semi sum"}) & =
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   827
  \N(@{text "comm_semi"})[@{text sum}/@{text prod}] =
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   828
  [@{text "semi sum"}, @{text "comm_semi sum"}]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   829
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   830
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   831
  and the list of context elements
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   832
\[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   833
\begin{array}{ll}
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   834
  \textbf{fixes} & @{text sum} :: @{typ [quotes] "['a, 'a] \<Rightarrow> 'a"}
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   835
    ~(\textbf{infixl}~@{text [quotes] "\<oplus>"}~65) \\
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   836
  \textbf{assumes} & @{text [quotes] "semi sum"} \\
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   837
  \textbf{notes} & @{text sum.assoc}: @{text [quotes] "(?x \<oplus> ?y) \<oplus> ?z
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   838
    = sum ?x (sum ?y ?z)"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   839
  \textbf{assumes} & @{text [quotes] "comm_semi_axioms sum"} \\
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   840
  \textbf{notes} & @{text sum.comm}: @{text [quotes] "?x \<oplus> ?y = 
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   841
    ?y \<oplus> ?x"} \\
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   842
  \textbf{notes} & @{text sum.lcomm}: @{text [quotes] "?x \<oplus> (?y \<oplus> ?z)
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   843
    = ?y \<oplus> (?x \<oplus> ?z)"}
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   844
\end{array}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   845
\]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   846
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   847
\paragraph{Example 4.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   848
  The context defined by the locale @{text "semi_hom"} involves
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   849
  merging two copies of @{text "comm_semi"}.  We obtain the parameter
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   850
  list and normal form:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   851
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   852
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   853
  \pi(@{text "semi_hom"}) & = \pi(@{text "comm_semi sum"} +
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   854
       @{text "comm_semi"}) \App [@{text hom}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   855
     & = (\pi(@{text "comm_semi sum"}) \App \pi(@{text "comm_semi"}))
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   856
       \App [@{text hom}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   857
     & = ([@{text sum}] \App [@{text prod}]) \App [@{text hom}]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   858
     = [@{text sum}, @{text prod}, @{text hom}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   859
  \N(@{text "semi_hom"}) & =
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   860
       \N(@{text "comm_semi sum"} + @{text "comm_semi"}) \App \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   861
     & \phantom{==}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   862
       [@{text "semi_hom sum prod hom"}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   863
     & = (\N(@{text "comm_semi sum"}) \App \N(@{text "comm_semi"})) \App \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   864
     & \phantom{==}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   865
       [@{text "semi_hom sum prod hom"}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   866
     & = ([@{text "semi sum"}, @{text "comm_semi sum"}] \App %\\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   867
%     & \phantom{==}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   868
       [@{text "semi prod"}, @{text "comm_semi prod"}]) \App \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   869
     & \phantom{==}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   870
       [@{text "semi_hom sum prod hom"}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   871
     & = [@{text "semi sum"}, @{text "comm_semi sum"},
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   872
       @{text "semi prod"}, @{text "comm_semi prod"}, \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   873
     & \phantom{==}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   874
       @{text "semi_hom sum prod hom"}].
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   875
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   876
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   877
  Hence $\C(@{text "semi_hom"})$, shown below, is again well-formed.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   878
\[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   879
\begin{array}{ll}
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   880
  \textbf{fixes} & @{text sum} :: @{typ [quotes] "['a, 'a] \<Rightarrow> 'a"}
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   881
    ~(\textbf{infixl}~@{text [quotes] "\<oplus>"}~65) \\
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   882
  \textbf{assumes} & @{text [quotes] "semi sum"} \\
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   883
  \textbf{notes} & @{text sum.assoc}: @{text [quotes] "(?x \<oplus> ?y) \<oplus> ?z
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   884
    = ?x \<oplus> (?y \<oplus> ?z)"} \\
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   885
  \textbf{assumes} & @{text [quotes] "comm_semi_axioms sum"} \\
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   886
  \textbf{notes} & @{text sum.comm}: @{text [quotes] "?x \<oplus> ?y = ?y \<oplus> ?x"} \\
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   887
  \textbf{notes} & @{text sum.lcomm}: @{text [quotes] "?x \<oplus> (?y \<oplus> ?z)
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   888
    = ?y \<oplus> (?x \<oplus> ?z)"} \\
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   889
  \textbf{fixes} & @{text prod} :: @{typ [quotes] "['b, 'b] \<Rightarrow> 'b"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   890
    ~(\textbf{infixl}~@{text [quotes] "\<cdot>"}~70) \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   891
  \textbf{assumes} & @{text [quotes] "semi prod"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   892
  \textbf{notes} & @{text prod.assoc}: @{text [quotes] "?x \<cdot> ?y \<cdot> ?z = ?x \<cdot> (?y \<cdot>
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   893
    ?z)"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   894
  \textbf{assumes} & @{text [quotes] "comm_semi_axioms prod"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   895
  \textbf{notes} & @{text prod.comm}: @{text [quotes] "?x \<cdot> ?y = ?y \<cdot> ?x"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   896
  \textbf{notes} & @{text prod.lcomm}: @{text [quotes] "?x \<cdot> (?y \<cdot> ?z) = ?y \<cdot> (?x \<cdot>
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   897
    ?z)"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   898
  \textbf{fixes} & @{text hom} :: @{typ [quotes] "'a \<Rightarrow> 'b"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   899
  \textbf{assumes} & @{text [quotes] "semi_hom_axioms sum"} \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   900
  \textbf{notes} & @{text "sum_prod_hom.hom"}:
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   901
    @{text "hom (x \<oplus> y) = hom x \<cdot> hom y"}
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   902
\end{array}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   903
\]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   904
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   905
\paragraph{Example 5.}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   906
  In this example, a locale expression leading to a list of context
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   907
  elements that is not well-defined is encountered, and it is illustrated
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   908
  how normalisation deals with multiple inheritance.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   909
  Consider the specification of monads (in the algebraic sense)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   910
  and monoids.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   911
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   912
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   913
locale monad =
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   914
  fixes prod :: "['a, 'a] \<Rightarrow> 'a" (infixl "\<cdot>" 70) and one :: 'a ("\<one>" 100)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   915
  assumes l_one: "\<one> \<cdot> x = x" and r_one: "x \<cdot> \<one> = x"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   916
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   917
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   918
  Monoids are both semigroups and monads and one would want to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   919
  specify them as locale expression @{text "semi + monad"}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   920
  Unfortunately, this expression is not well-formed.  Its normal form
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   921
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   922
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   923
  \N(@{text "monad"}) & = [@{text "monad prod"}] \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   924
  \N(@{text "semi"}+@{text "monad"}) & =
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   925
       \N(@{text "semi"}) \App \N(@{text "monad"})
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   926
     = [@{text "semi prod"}, @{text "monad prod"}]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   927
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   928
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   929
  leads to a list containing the context element
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   930
\[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   931
  \textbf{fixes}~@{text prod} :: @{typ [quotes] "['a, 'a] \<Rightarrow> 'a"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   932
    ~(\textbf{infixl}~@{text [quotes] "\<cdot>"}~70)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   933
\]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   934
  twice and thus violating the first criterion of well-formedness.  To
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   935
  avoid this problem, one can
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   936
  introduce a new locale @{text magma} with the sole purpose of fixing the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   937
  parameter and defining its syntax.  The specifications of semigroup
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   938
  and monad are changed so that they import @{text magma}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   939
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   940
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   941
locale magma = fixes prod (infixl "\<cdot>" 70)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   942
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   943
locale semi' = magma + assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   944
locale monad' = magma + fixes one ("\<one>" 100)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   945
  assumes l_one: "\<one> \<cdot> x = x" and r_one: "x \<cdot> \<one> = x"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   946
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   947
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   948
  Normalisation now yields
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   949
\begin{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   950
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   951
  \N(@{text "semi' + monad'"}) & =
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   952
       \N(@{text "semi'"}) \App \N(@{text "monad'"}) \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   953
     & = (\N(@{text magma}) \App [@{text "semi' prod"}]) \App
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   954
         (\N(@{text magma}) \App [@{text "monad' prod"}]) \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   955
     & = [@{text "magma prod"}, @{text "semi' prod"}] \App
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   956
         [@{text "magma prod"}, @{text "monad' prod"}]) \\
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   957
     & = [@{text "magma prod"}, @{text "semi' prod"},
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   958
          @{text "monad' prod"}]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   959
\end{align*%
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   960
}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   961
  where the second occurrence of @{text "magma prod"} is eliminated.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   962
  The reader is encouraged to check, using the \textbf{print\_locale}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   963
  command, that the list of context elements generated from this is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   964
  indeed well-formed.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   965
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   966
  It follows that importing
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   967
  parameters is more flexible than fixing them using a context element.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   968
  The Locale package provides the predefined locale @{term var} that
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   969
  can be used to import parameters if no
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   970
  particular mixfix syntax is required.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   971
  Its definition is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   972
\begin{center}
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   973
  \textbf{locale} @{text var} = \textbf{fixes} @{text "x_"}
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   974
\end{center}
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   975
  The use of the internal variable @{text "x_"}
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   976
  enforces that the parameter is renamed before being used, because
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   977
  internal variables may not occur in the input syntax.  Using
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   978
  @{text var}, the locale @{text magma} could have been replaced by
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   979
  the locale expression
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   980
\begin{center}
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   981
  @{text var} @{text prod} (\textbf{infixl} @{text [quotes] \<cdot>} 70)
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   982
\end{center}
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   983
  in the above locale declarations.
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   984
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   985
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   986
subsection {* Includes *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   987
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   988
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   989
\label{sec-includes}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   990
  The context element \textbf{includes} takes a locale expression $e$
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
   991
  as argument.  It can only occur in long goals, where it
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   992
  adds, like a target, locale context to the proof context.  Unlike
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   993
  with targets, the proved theorem is not stored
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   994
  in the locale.  Instead, it is exported immediately.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   995
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   996
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   997
theorem lcomm2:
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   998
  includes comm_semi shows "x \<cdot> (y \<cdot> z) = y \<cdot> (x \<cdot> z)"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
   999
proof -
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1000
  have "x \<cdot> (y \<cdot> z) = (x \<cdot> y) \<cdot> z" by (simp add: assoc)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1001
  also have "\<dots> = (y \<cdot> x) \<cdot> z" by (simp add: comm)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1002
  also have "\<dots> = y \<cdot> (x \<cdot> z)" by (simp add: assoc)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1003
  finally show ?thesis .
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1004
qed
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1005
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1006
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1007
  This proof is identical to the proof of @{text lcomm}.  The use of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1008
  \textbf{includes} provides the same context and facts as when using
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1009
  @{term comm_semi} as target.  On the other hand, @{thm [source]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1010
  lcomm2} is not added as a fact to the locale @{term comm_semi}, but
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1011
  is directly visible in the theory.  The theorem is
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1012
\[
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1013
  @{thm lcomm2}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1014
\]
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1015
  Note that it is possible to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1016
  combine a target and (several) \textbf{includes} in a goal statement, thus
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1017
  using contexts of several locales but storing the theorem in only
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1018
  one of them.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1019
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1020
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1021
section {* Structures *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1022
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1023
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1024
\label{sec-structures}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1025
  The specifications of semigroups and monoids that served as examples
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1026
  in previous sections modelled each operation of an algebraic
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1027
  structure as a single parameter.  This is rather inconvenient for
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1028
  structures with many operations, and also unnatural.  In accordance
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1029
  to mathematical texts, one would rather fix two groups instead of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1030
  two sets of operations.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1031
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1032
  The approach taken in Isabelle is to encode algebraic structures
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1033
  with suitable types (in Isabelle/HOL usually records).  An issue to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1034
  be addressed by
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1035
  locales is syntax for algebraic structures.  This is the purpose of
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1036
  the \textbf{(structure)} annotation in \textbf{fixes}, introduced by
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1037
  Wenzel.  We illustrate this, independently of record types, with a
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1038
  different formalisation of semigroups.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1039
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1040
  Let @{text "'a semi_type"} be a not further specified type that
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1041
  represents semigroups over the carrier type @{typ "'a"}.  Let @{text
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1042
  "s_op"} be an operation that maps an object of @{text "'a semi_type"} to
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1043
  a binary operation.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1044
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1045
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1046
typedecl 'a semi_type
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1047
consts s_op :: "['a semi_type, 'a, 'a] \<Rightarrow> 'a" (infixl "\<star>\<index>" 70)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1048
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1049
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1050
  Although @{text "s_op"} is a ternary operation, it is declared
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1051
  infix.  The syntax annotation contains the token  @{text \<index>}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1052
  (\verb.\<index>.), which refers to the first argument.  This syntax is only
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1053
  effective in the context of a locale, and only if the first argument
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1054
  is a
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1055
  \emph{structural} parameter --- that is, a parameter with annotation
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1056
  \textbf{(structure)}.  The token has the effect of subscripting the
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1057
  parameter --- by bracketing it between \verb.\<^bsub>. and  \verb.\<^esub>..
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1058
  Additionally, the subscript of the first structural parameter may be
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1059
  omitted, as in this specification of semigroups with structures:
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1060
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1061
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1062
locale comm_semi' =
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1063
  fixes G :: "'a semi_type" (structure)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1064
  assumes assoc: "(x \<star> y) \<star> z = x \<star> (y \<star> z)" and comm: "x \<star> y = y \<star> x"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1065
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1066
text {*
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1067
  Here @{text "x \<star> y"} is equivalent to @{text "x \<star>\<^bsub>G\<^esub> y"} and
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1068
  abbreviates @{text "s_op G x y"}.  A specification of homomorphisms
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1069
  requires a second structural parameter.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1070
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1071
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1072
locale semi'_hom = comm_semi' + comm_semi' H +
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1073
  fixes hom
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1074
  assumes hom: "hom (x \<star> y) = hom x \<star>\<^bsub>H\<^esub> hom y"
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1075
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1076
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1077
  The parameter @{text H} is defined in the second \textbf{fixes}
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1078
  element of $\C(@{term "semi'_comm"})$. Hence @{text "\<star>\<^bsub>H\<^esub>"}
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1079
  abbreviates @{text "s_op H x y"}.  The same construction can be done
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1080
  with records instead of an \textit{ad-hoc} type.  *}
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1081
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1082
record 'a semi = prod :: "['a, 'a] \<Rightarrow> 'a" (infixl "\<bullet>\<index>" 70)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1083
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1084
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1085
  This declares the types @{typ "'a semi"} and  @{typ "('a, 'b)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1086
  semi_scheme"}.  The latter is an extensible record, where the second
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1087
  type argument is the type of the extension field.  For details on
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1088
  records, see \cite{NipkowEtAl2002} Chapter~8.3.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1089
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1090
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1091
locale semi_w_records = struct G +
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1092
  assumes assoc: "(x \<bullet> y) \<bullet> z = x \<bullet> (y \<bullet> z)"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1093
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1094
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1095
  The type @{typ "('a, 'b) semi_scheme"} is inferred for the parameter @{term
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1096
  G}.  Using subtyping on records, the specification can be extended
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1097
  to groups easily.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1098
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1099
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1100
record 'a group = "'a semi" +
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1101
  one :: "'a" ("l\<index>" 100)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1102
  inv :: "'a \<Rightarrow> 'a" ("inv\<index> _" [81] 80)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1103
locale group_w_records = semi_w_records +
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1104
  assumes l_one: "l \<bullet> x = x" and l_inv: "inv x \<bullet> x = l"
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1105
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1106
text {*
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1107
 Finally, the predefined locale
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1108
\begin{center}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1109
  \textbf{locale} \textit{struct} = \textbf{fixes} @{text "S_"}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1110
    \textbf{(structure)}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1111
\end{center}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1112
  is analogous to @{text "var"}.  
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1113
  More examples on the use of structures, including groups, rings and
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1114
  polynomials can be found in the Isabelle distribution in the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1115
  session HOL-Algebra.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1116
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1117
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1118
section {* Conclusions and Outlook *}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1119
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1120
text {*
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1121
  Locales provide a simple means of modular reasoning.  They enable to
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1122
  abbreviate frequently occurring context statements and maintain facts
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1123
  valid in these contexts.  Importantly, using structures, they allow syntax to be
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1124
  effective only in certain contexts, and thus to mimic common
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1125
  practice in mathematics, where notation is chosen very flexibly.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1126
  This is also known as literate formalisation \cite{Bailey1998}.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1127
  Locale expressions allow to duplicate and merge
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1128
  specifications.  This is a necessity, for example, when reasoning about
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1129
  homomorphisms.  Normalisation makes it possible to deal with
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1130
  diamond-shaped inheritance structures, and generally with directed
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1131
  acyclic graphs.  The combination of locales with record
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1132
  types in higher-order logic provides an effective means for
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1133
  specifying algebraic structures: locale import and record subtyping
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1134
  provide independent hierarchies for specifications and structure
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1135
  elements.  Rich examples for this can be found in
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1136
  the Isabelle distribution in the session HOL-Algebra.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1137
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1138
  The primary reason for writing this report was to provide a better
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1139
  understanding of locales in Isar.  Wenzel provided hardly any
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1140
  documentation, with the exception of \cite{Wenzel2002b}.  The
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1141
  present report should make it easier for users of Isabelle to take
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1142
  advantage of locales.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1143
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1144
  The report is also a base for future extensions.  These include
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1145
  improved syntax for structures.  Identifying them by numbers seems
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1146
  unnatural and can be confusing if more than two structures are
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1147
  involved --- for example, when reasoning about universal
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1148
  properties --- and numbering them by order of occurrence seems
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1149
  arbitrary.  Another desirable feature is \emph{instantiation}.  One
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1150
  may, in the course of a theory development, construct objects that
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1151
  fulfil the specification of a locale.  These objects are possibly
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1152
  defined in the context of another locale.  Instantiation should make it
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1153
  simple to specialise abstract facts for the object under
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1154
  consideration and to use the specified facts.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1155
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1156
  A detailed comparison of locales with module systems in type theory
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1157
  has not been undertaken yet, but could be beneficial.  For example,
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1158
  a module system for Coq has recently been presented by Chrzaszcz
16168
adb83939177f Locales: new element constrains, parameter renaming with syntax,
ballarin
parents: 14586
diff changeset
  1159
  \cite{Chrzaszcz2003,Chrzaszcz2004}.  While the
14586
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1160
  latter usually constitute extensions of the calculus, locales are
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1161
  a rather thin layer that does not change Isabelle's meta logic.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1162
  Locales mainly manage specifications and facts.  Functors, like
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1163
  the constructor for polynomial rings, remain objects of the
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1164
  logic.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1165
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1166
  \textbf{Acknowledgements.}  Lawrence C.\ Paulson and Norbert
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1167
  Schirmer made useful comments on a draft of this paper.
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1168
*}
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1169
                                
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1170
(*<*)
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1171
end
7b8d56b4ac60 Added Locales Tutorial.
ballarin
parents:
diff changeset
  1172
(*>*)