src/HOL/ex/Locales.thy
author krauss
Thu, 17 May 2007 22:33:41 +0200
changeset 22999 c1ce129e6f9c
parent 19931 fb32b43e7f80
permissions -rw-r--r--
Added unification case study (using new function package)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/ex/Locales.thy
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
12574
wenzelm
parents: 12507
diff changeset
     3
    Author:     Markus Wenzel, LMU München
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     4
*)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     5
17388
495c799df31d tuned headers etc.;
wenzelm
parents: 16417
diff changeset
     6
header {* Using locales in Isabelle/Isar -- outdated version! *}
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     7
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 14981
diff changeset
     8
theory Locales imports Main begin
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     9
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    10
text_raw {*
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    11
  \newcommand{\isasyminv}{\isasyminverse}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    12
  \newcommand{\isasymIN}{\isatext{\isakeyword{in}}}
12965
c8a97eb1e3c7 renamed 'uses' to 'includes';
wenzelm
parents: 12955
diff changeset
    13
  \newcommand{\isasymINCLUDES}{\isatext{\isakeyword{includes}}}
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    14
*}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    15
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    16
subsection {* Overview *}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    17
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    18
text {*
12105
wenzelm
parents: 12099
diff changeset
    19
  Locales provide a mechanism for encapsulating local contexts.  The
12574
wenzelm
parents: 12507
diff changeset
    20
  original version due to Florian Kammüller \cite{Kamm-et-al:1999}
13538
wenzelm
parents: 13457
diff changeset
    21
  refers directly to Isabelle's meta-logic \cite{Paulson:1989}, which
wenzelm
parents: 13457
diff changeset
    22
  is minimal higher-order logic with connectives @{text "\<And>"}
wenzelm
parents: 13457
diff changeset
    23
  (universal quantification), @{text "\<Longrightarrow>"} (implication), and @{text
wenzelm
parents: 13457
diff changeset
    24
  "\<equiv>"} (equality).
wenzelm
parents: 13457
diff changeset
    25
wenzelm
parents: 13457
diff changeset
    26
  From this perspective, a locale is essentially a meta-level
wenzelm
parents: 13457
diff changeset
    27
  predicate, together with some infrastructure to manage the
wenzelm
parents: 13457
diff changeset
    28
  abstracted parameters (@{text "\<And>"}), assumptions (@{text "\<Longrightarrow>"}), and
wenzelm
parents: 13457
diff changeset
    29
  definitions for (@{text "\<equiv>"}) in a reasonable way during the proof
wenzelm
parents: 13457
diff changeset
    30
  process.  This simple predicate view also provides a solid
wenzelm
parents: 13457
diff changeset
    31
  semantical basis for our specification concepts to be developed
wenzelm
parents: 13457
diff changeset
    32
  later.
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    33
13538
wenzelm
parents: 13457
diff changeset
    34
  \medskip The present version of locales for Isabelle/Isar builds on
wenzelm
parents: 13457
diff changeset
    35
  top of the rich infrastructure of proof contexts
wenzelm
parents: 13457
diff changeset
    36
  \cite{Wenzel:1999,Wenzel:2001:isar-ref,Wenzel:2001:Thesis}, which in
wenzelm
parents: 13457
diff changeset
    37
  turn is based on the same meta-logic.  Thus we achieve a tight
wenzelm
parents: 13457
diff changeset
    38
  integration with Isar proof texts, and a slightly more abstract view
wenzelm
parents: 13457
diff changeset
    39
  of the underlying logical concepts.  An Isar proof context
wenzelm
parents: 13457
diff changeset
    40
  encapsulates certain language elements that correspond to @{text
wenzelm
parents: 13457
diff changeset
    41
  "\<And>/\<Longrightarrow>/\<equiv>"} at the level of structure proof texts.  Moreover, there are
wenzelm
parents: 13457
diff changeset
    42
  extra-logical concepts like term abbreviations or local theorem
wenzelm
parents: 13457
diff changeset
    43
  attributes (declarations of simplification rules etc.) that are
wenzelm
parents: 13457
diff changeset
    44
  useful in applications (e.g.\ consider standard simplification rules
wenzelm
parents: 13457
diff changeset
    45
  declared in a group context).
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    46
13538
wenzelm
parents: 13457
diff changeset
    47
  Locales also support concrete syntax, i.e.\ a localized version of
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    48
  the existing concept of mixfix annotations of Isabelle
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    49
  \cite{Paulson:1994:Isabelle}.  Furthermore, there is a separate
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    50
  concept of ``implicit structures'' that admits to refer to
13538
wenzelm
parents: 13457
diff changeset
    51
  particular locale parameters in a casual manner (basically a
wenzelm
parents: 13457
diff changeset
    52
  simplified version of the idea of ``anti-quotations'', or
wenzelm
parents: 13457
diff changeset
    53
  generalized de-Bruijn indexes as demonstrated elsewhere
wenzelm
parents: 13457
diff changeset
    54
  \cite[\S13--14]{Wenzel:2001:Isar-examples}).
12105
wenzelm
parents: 12099
diff changeset
    55
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    56
  Implicit structures work particular well together with extensible
13538
wenzelm
parents: 13457
diff changeset
    57
  records in HOL \cite{Naraschewski-Wenzel:1998} (without the
wenzelm
parents: 13457
diff changeset
    58
  ``object-oriented'' features discussed there as well).  Thus we
wenzelm
parents: 13457
diff changeset
    59
  achieve a specification technique where record type schemes
wenzelm
parents: 13457
diff changeset
    60
  represent polymorphic signatures of mathematical structures, and
wenzelm
parents: 13457
diff changeset
    61
  actual locales describe the corresponding logical properties.
wenzelm
parents: 13457
diff changeset
    62
  Semantically speaking, such abstract mathematical structures are
wenzelm
parents: 13457
diff changeset
    63
  just predicates over record types.  Due to type inference of
wenzelm
parents: 13457
diff changeset
    64
  simply-typed records (which subsumes structural subtyping) we arrive
wenzelm
parents: 13457
diff changeset
    65
  at succinct specification texts --- ``signature morphisms''
wenzelm
parents: 13457
diff changeset
    66
  degenerate to implicit type-instantiations.  Additional eye-candy is
wenzelm
parents: 13457
diff changeset
    67
  provided by the separate concept of ``indexed concrete syntax'' used
wenzelm
parents: 13457
diff changeset
    68
  for record selectors, so we get close to informal mathematical
wenzelm
parents: 13457
diff changeset
    69
  notation.
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    70
13538
wenzelm
parents: 13457
diff changeset
    71
  \medskip Operations for building up locale contexts from existing
wenzelm
parents: 13457
diff changeset
    72
  ones include \emph{merge} (disjoint union) and \emph{rename} (of
wenzelm
parents: 13457
diff changeset
    73
  term parameters only, types are inferred automatically).  Here we
wenzelm
parents: 13457
diff changeset
    74
  draw from existing traditions of algebraic specification languages.
wenzelm
parents: 13457
diff changeset
    75
  A structured specification corresponds to a directed acyclic graph
wenzelm
parents: 13457
diff changeset
    76
  of potentially renamed nodes (due to distributivity renames may
wenzelm
parents: 13457
diff changeset
    77
  pushed inside of merges).  The result is a ``flattened'' list of
wenzelm
parents: 13457
diff changeset
    78
  primitive context elements in canonical order (corresponding to
wenzelm
parents: 13457
diff changeset
    79
  left-to-right reading of merges, while suppressing duplicates).
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    80
13538
wenzelm
parents: 13457
diff changeset
    81
  \medskip The present version of Isabelle/Isar locales still lacks
wenzelm
parents: 13457
diff changeset
    82
  some important specification concepts.
wenzelm
parents: 13457
diff changeset
    83
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    84
  \begin{itemize}
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    85
13538
wenzelm
parents: 13457
diff changeset
    86
  \item Separate language elements for \emph{instantiation} of
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    87
  locales.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    88
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    89
  Currently users may simulate this to some extend by having primitive
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    90
  Isabelle/Isar operations (@{text of} for substitution and @{text OF}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    91
  for composition, \cite{Wenzel:2001:isar-ref}) act on the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    92
  automatically exported results stemming from different contexts.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    93
13538
wenzelm
parents: 13457
diff changeset
    94
  \item Interpretation of locales (think of ``views'', ``functors''
wenzelm
parents: 13457
diff changeset
    95
  etc.).
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    96
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    97
  In principle one could directly work with functions over structures
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    98
  (extensible records), and predicates being derived from locale
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    99
  definitions.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   100
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   101
  \end{itemize}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   102
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   103
  \medskip Subsequently, we demonstrate some readily available
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   104
  concepts of Isabelle/Isar locales by some simple examples of
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   105
  abstract algebraic reasoning.
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   106
*}
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   107
13538
wenzelm
parents: 13457
diff changeset
   108
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   109
subsection {* Local contexts as mathematical structures *}
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   110
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   111
text {*
13538
wenzelm
parents: 13457
diff changeset
   112
  The following definitions of @{text group_context} and @{text
wenzelm
parents: 13457
diff changeset
   113
  abelian_group_context} merely encapsulate local parameters (with
wenzelm
parents: 13457
diff changeset
   114
  private syntax) and assumptions; local definitions of derived
wenzelm
parents: 13457
diff changeset
   115
  concepts could be given, too, but are unused below.
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   116
*}
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   117
12574
wenzelm
parents: 12507
diff changeset
   118
locale group_context =
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   119
  fixes prod :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "\<cdot>" 70)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   120
    and inv :: "'a \<Rightarrow> 'a"    ("(_\<inv>)" [1000] 999)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   121
    and one :: 'a    ("\<one>")
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   122
  assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   123
    and left_inv: "x\<inv> \<cdot> x = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   124
    and left_one: "\<one> \<cdot> x = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   125
12574
wenzelm
parents: 12507
diff changeset
   126
locale abelian_group_context = group_context +
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   127
  assumes commute: "x \<cdot> y = y \<cdot> x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   128
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   129
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   130
  \medskip We may now prove theorems within a local context, just by
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   131
  including a directive ``@{text "(\<IN> name)"}'' in the goal
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   132
  specification.  The final result will be stored within the named
13538
wenzelm
parents: 13457
diff changeset
   133
  locale, still holding the context; a second copy is exported to the
wenzelm
parents: 13457
diff changeset
   134
  enclosing theory context (with qualified name).
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   135
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   136
12574
wenzelm
parents: 12507
diff changeset
   137
theorem (in group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   138
  right_inv: "x \<cdot> x\<inv> = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   139
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   140
  have "x \<cdot> x\<inv> = \<one> \<cdot> (x \<cdot> x\<inv>)" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   141
  also have "\<dots> = \<one> \<cdot> x \<cdot> x\<inv>" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   142
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> x\<inv> \<cdot> x \<cdot> x\<inv>" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   143
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> (x\<inv> \<cdot> x) \<cdot> x\<inv>" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   144
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> \<one> \<cdot> x\<inv>" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   145
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> (\<one> \<cdot> x\<inv>)" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   146
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> x\<inv>" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   147
  also have "\<dots> = \<one>" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   148
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   149
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   150
12574
wenzelm
parents: 12507
diff changeset
   151
theorem (in group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   152
  right_one: "x \<cdot> \<one> = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   153
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   154
  have "x \<cdot> \<one> = x \<cdot> (x\<inv> \<cdot> x)" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   155
  also have "\<dots> = x \<cdot> x\<inv> \<cdot> x" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   156
  also have "\<dots> = \<one> \<cdot> x" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   157
  also have "\<dots> = x" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   158
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   159
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   160
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   161
text {*
13538
wenzelm
parents: 13457
diff changeset
   162
  Facts like @{text right_one} are available @{text group_context} as
wenzelm
parents: 13457
diff changeset
   163
  stated above.  The exported version looses the additional
wenzelm
parents: 13457
diff changeset
   164
  infrastructure of Isar proof contexts (syntax etc.) retaining only
wenzelm
parents: 13457
diff changeset
   165
  the pure logical content: @{thm [source] group_context.right_one}
wenzelm
parents: 13457
diff changeset
   166
  becomes @{thm group_context.right_one} (in Isabelle outermost @{text
wenzelm
parents: 13457
diff changeset
   167
  \<And>} quantification is replaced by schematic variables).
wenzelm
parents: 13457
diff changeset
   168
wenzelm
parents: 13457
diff changeset
   169
  \medskip Apart from a named locale we may also refer to further
wenzelm
parents: 13457
diff changeset
   170
  context elements (parameters, assumptions, etc.) in an ad-hoc
wenzelm
parents: 13457
diff changeset
   171
  fashion, just for this particular statement.  In the result (local
wenzelm
parents: 13457
diff changeset
   172
  or global), any additional elements are discharged as usual.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   173
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   174
12574
wenzelm
parents: 12507
diff changeset
   175
theorem (in group_context)
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   176
  assumes eq: "e \<cdot> x = x"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   177
  shows one_equality: "\<one> = e"
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   178
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   179
  have "\<one> = x \<cdot> x\<inv>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   180
  also have "\<dots> = (e \<cdot> x) \<cdot> x\<inv>" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   181
  also have "\<dots> = e \<cdot> (x \<cdot> x\<inv>)" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   182
  also have "\<dots> = e \<cdot> \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   183
  also have "\<dots> = e" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   184
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   185
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   186
12574
wenzelm
parents: 12507
diff changeset
   187
theorem (in group_context)
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   188
  assumes eq: "x' \<cdot> x = \<one>"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   189
  shows inv_equality: "x\<inv> = x'"
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   190
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   191
  have "x\<inv> = \<one> \<cdot> x\<inv>" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   192
  also have "\<dots> = (x' \<cdot> x) \<cdot> x\<inv>" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   193
  also have "\<dots> = x' \<cdot> (x \<cdot> x\<inv>)" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   194
  also have "\<dots> = x' \<cdot> \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   195
  also have "\<dots> = x'" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   196
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   197
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   198
12574
wenzelm
parents: 12507
diff changeset
   199
theorem (in group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   200
  inv_prod: "(x \<cdot> y)\<inv> = y\<inv> \<cdot> x\<inv>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   201
proof (rule inv_equality)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   202
  show "(y\<inv> \<cdot> x\<inv>) \<cdot> (x \<cdot> y) = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   203
  proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   204
    have "(y\<inv> \<cdot> x\<inv>) \<cdot> (x \<cdot> y) = (y\<inv> \<cdot> (x\<inv> \<cdot> x)) \<cdot> y" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   205
    also have "\<dots> = (y\<inv> \<cdot> \<one>) \<cdot> y" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   206
    also have "\<dots> = y\<inv> \<cdot> y" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   207
    also have "\<dots> = \<one>" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   208
    finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   209
  qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   210
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   211
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   212
text {*
12105
wenzelm
parents: 12099
diff changeset
   213
  \medskip Established results are automatically propagated through
wenzelm
parents: 12099
diff changeset
   214
  the hierarchy of locales.  Below we establish a trivial fact in
wenzelm
parents: 12099
diff changeset
   215
  commutative groups, while referring both to theorems of @{text
wenzelm
parents: 12099
diff changeset
   216
  group} and the additional assumption of @{text abelian_group}.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   217
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   218
12574
wenzelm
parents: 12507
diff changeset
   219
theorem (in abelian_group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   220
  inv_prod': "(x \<cdot> y)\<inv> = x\<inv> \<cdot> y\<inv>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   221
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   222
  have "(x \<cdot> y)\<inv> = y\<inv> \<cdot> x\<inv>" by (rule inv_prod)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   223
  also have "\<dots> = x\<inv> \<cdot> y\<inv>" by (rule commute)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   224
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   225
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   226
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   227
text {*
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   228
  We see that the initial import of @{text group} within the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   229
  definition of @{text abelian_group} is actually evaluated
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   230
  dynamically.  Thus any results in @{text group} are made available
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   231
  to the derived context of @{text abelian_group} as well.  Note that
12965
c8a97eb1e3c7 renamed 'uses' to 'includes';
wenzelm
parents: 12955
diff changeset
   232
  the alternative context element @{text \<INCLUDES>} would import
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   233
  existing locales in a static fashion, without participating in
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   234
  further facts emerging later on.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   235
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   236
  \medskip Some more properties of inversion in general group theory
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   237
  follow.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   238
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   239
12574
wenzelm
parents: 12507
diff changeset
   240
theorem (in group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   241
  inv_inv: "(x\<inv>)\<inv> = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   242
proof (rule inv_equality)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   243
  show "x \<cdot> x\<inv> = \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   244
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   245
12574
wenzelm
parents: 12507
diff changeset
   246
theorem (in group_context)
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   247
  assumes eq: "x\<inv> = y\<inv>"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   248
  shows inv_inject: "x = y"
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   249
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   250
  have "x = x \<cdot> \<one>" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   251
  also have "\<dots> = x \<cdot> (y\<inv> \<cdot> y)" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   252
  also have "\<dots> = x \<cdot> (x\<inv> \<cdot> y)" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   253
  also have "\<dots> = (x \<cdot> x\<inv>) \<cdot> y" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   254
  also have "\<dots> = \<one> \<cdot> y" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   255
  also have "\<dots> = y" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   256
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   257
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   258
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   259
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   260
  \bigskip We see that this representation of structures as local
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   261
  contexts is rather light-weight and convenient to use for abstract
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   262
  reasoning.  Here the ``components'' (the group operations) have been
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   263
  exhibited directly as context parameters; logically this corresponds
13383
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   264
  to a curried predicate definition:
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   265
13419
wenzelm
parents: 13383
diff changeset
   266
  @{thm [display] group_context_def [no_vars]}
wenzelm
parents: 13383
diff changeset
   267
wenzelm
parents: 13383
diff changeset
   268
  The corresponding introduction rule is as follows:
wenzelm
parents: 13383
diff changeset
   269
13457
wenzelm
parents: 13419
diff changeset
   270
  @{thm [display, mode = no_brackets] group_context.intro [no_vars]}
13383
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   271
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   272
  Occasionally, this ``externalized'' version of the informal idea of
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   273
  classes of tuple structures may cause some inconveniences,
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   274
  especially in meta-theoretical studies (involving functors from
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   275
  groups to groups, for example).
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   276
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   277
  Another minor drawback of the naive approach above is that concrete
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   278
  syntax will get lost on any kind of operation on the locale itself
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   279
  (such as renaming, copying, or instantiation).  Whenever the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   280
  particular terminology of local parameters is affected the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   281
  associated syntax would have to be changed as well, which is hard to
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   282
  achieve formally.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   283
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   284
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   285
12105
wenzelm
parents: 12099
diff changeset
   286
subsection {* Explicit structures referenced implicitly *}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   287
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   288
text {*
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   289
  We introduce the same hierarchy of basic group structures as above,
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   290
  this time using extensible record types for the signature part,
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   291
  together with concrete syntax for selector functions.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   292
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   293
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   294
record 'a semigroup =
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   295
  prod :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "\<cdot>\<index>" 70)
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   296
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   297
record 'a group = "'a semigroup" +
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   298
  inv :: "'a \<Rightarrow> 'a"    ("(_\<inv>\<index>)" [1000] 999)
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   299
  one :: 'a    ("\<one>\<index>")
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   300
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   301
text {*
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   302
  The mixfix annotations above include a special ``structure index
13457
wenzelm
parents: 13419
diff changeset
   303
  indicator'' @{text \<index>} that makes grammar productions dependent on
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   304
  certain parameters that have been declared as ``structure'' in a
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   305
  locale context later on.  Thus we achieve casual notation as
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   306
  encountered in informal mathematics, e.g.\ @{text "x \<cdot> y"} for
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   307
  @{text "prod G x y"}.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   308
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   309
  \medskip The following locale definitions introduce operate on a
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   310
  single parameter declared as ``\isakeyword{structure}''.  Type
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   311
  inference takes care to fill in the appropriate record type schemes
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   312
  internally.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   313
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   314
12574
wenzelm
parents: 12507
diff changeset
   315
locale semigroup =
13457
wenzelm
parents: 13419
diff changeset
   316
  fixes S    (structure)
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   317
  assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   318
12574
wenzelm
parents: 12507
diff changeset
   319
locale group = semigroup G +
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   320
  assumes left_inv: "x\<inv> \<cdot> x = \<one>"
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   321
    and left_one: "\<one> \<cdot> x = x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   322
14254
342634f38451 Isar/Locales: <loc>.intro and <loc>.axioms no longer intro? and elim? by
ballarin
parents: 13538
diff changeset
   323
declare semigroup.intro [intro?]
342634f38451 Isar/Locales: <loc>.intro and <loc>.axioms no longer intro? and elim? by
ballarin
parents: 13538
diff changeset
   324
  group.intro [intro?] group_axioms.intro [intro?]
342634f38451 Isar/Locales: <loc>.intro and <loc>.axioms no longer intro? and elim? by
ballarin
parents: 13538
diff changeset
   325
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   326
text {*
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   327
  Note that we prefer to call the @{text group} record structure
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   328
  @{text G} rather than @{text S} inherited from @{text semigroup}.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   329
  This does not affect our concrete syntax, which is only dependent on
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   330
  the \emph{positional} arrangements of currently active structures
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   331
  (actually only one above), rather than names.  In fact, these
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   332
  parameter names rarely occur in the term language at all (due to the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   333
  ``indexed syntax'' facility of Isabelle).  On the other hand, names
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   334
  of locale facts will get qualified accordingly, e.g. @{text S.assoc}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   335
  versus @{text G.assoc}.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   336
12574
wenzelm
parents: 12507
diff changeset
   337
  \medskip We may now proceed to prove results within @{text group}
wenzelm
parents: 12507
diff changeset
   338
  just as before for @{text group}.  The subsequent proof texts are
wenzelm
parents: 12507
diff changeset
   339
  exactly the same as despite the more advanced internal arrangement.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   340
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   341
12574
wenzelm
parents: 12507
diff changeset
   342
theorem (in group)
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   343
  right_inv: "x \<cdot> x\<inv> = \<one>"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   344
proof -
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   345
  have "x \<cdot> x\<inv> = \<one> \<cdot> (x \<cdot> x\<inv>)" by (simp only: left_one)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   346
  also have "\<dots> = \<one> \<cdot> x \<cdot> x\<inv>" by (simp only: assoc)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   347
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> x\<inv> \<cdot> x \<cdot> x\<inv>" by (simp only: left_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   348
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> (x\<inv> \<cdot> x) \<cdot> x\<inv>" by (simp only: assoc)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   349
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> \<one> \<cdot> x\<inv>" by (simp only: left_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   350
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> (\<one> \<cdot> x\<inv>)" by (simp only: assoc)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   351
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> x\<inv>" by (simp only: left_one)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   352
  also have "\<dots> = \<one>" by (simp only: left_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   353
  finally show ?thesis .
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   354
qed
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   355
12574
wenzelm
parents: 12507
diff changeset
   356
theorem (in group)
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   357
  right_one: "x \<cdot> \<one> = x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   358
proof -
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   359
  have "x \<cdot> \<one> = x \<cdot> (x\<inv> \<cdot> x)" by (simp only: left_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   360
  also have "\<dots> = x \<cdot> x\<inv> \<cdot> x" by (simp only: assoc)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   361
  also have "\<dots> = \<one> \<cdot> x" by (simp only: right_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   362
  also have "\<dots> = x" by (simp only: left_one)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   363
  finally show ?thesis .
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   364
qed
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   365
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   366
text {*
12574
wenzelm
parents: 12507
diff changeset
   367
  \medskip Several implicit structures may be active at the same time.
wenzelm
parents: 12507
diff changeset
   368
  The concrete syntax facility for locales actually maintains indexed
wenzelm
parents: 12507
diff changeset
   369
  structures that may be references implicitly --- via mixfix
wenzelm
parents: 12507
diff changeset
   370
  annotations that have been decorated by an ``index argument''
wenzelm
parents: 12507
diff changeset
   371
  (@{text \<index>}).
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   372
12574
wenzelm
parents: 12507
diff changeset
   373
  The following synthetic example demonstrates how to refer to several
wenzelm
parents: 12507
diff changeset
   374
  structures of type @{text group} succinctly.  We work with two
wenzelm
parents: 12507
diff changeset
   375
  versions of the @{text group} locale above.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   376
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   377
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   378
lemma
12955
f4d60f358cb6 renamed "uses" to "includes";
wenzelm
parents: 12937
diff changeset
   379
  includes group G
f4d60f358cb6 renamed "uses" to "includes";
wenzelm
parents: 12937
diff changeset
   380
  includes group H
13107
8743cc847224 tuned presentation;
wenzelm
parents: 12965
diff changeset
   381
  shows "x \<cdot> y \<cdot> \<one> = prod G (prod G x y) (one G)"
8743cc847224 tuned presentation;
wenzelm
parents: 12965
diff changeset
   382
    and "x \<cdot>\<^sub>2 y \<cdot>\<^sub>2 \<one>\<^sub>2 = prod H (prod H x y) (one H)"
8743cc847224 tuned presentation;
wenzelm
parents: 12965
diff changeset
   383
    and "x \<cdot> \<one>\<^sub>2 = prod G x (one H)"
8743cc847224 tuned presentation;
wenzelm
parents: 12965
diff changeset
   384
  by (rule refl)+
12574
wenzelm
parents: 12507
diff changeset
   385
wenzelm
parents: 12507
diff changeset
   386
text {*
wenzelm
parents: 12507
diff changeset
   387
  Note that the trivial statements above need to be given as a
wenzelm
parents: 12507
diff changeset
   388
  simultaneous goal in order to have type-inference make the implicit
wenzelm
parents: 12507
diff changeset
   389
  typing of structures @{text G} and @{text H} agree.
wenzelm
parents: 12507
diff changeset
   390
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   391
13457
wenzelm
parents: 13419
diff changeset
   392
wenzelm
parents: 13419
diff changeset
   393
subsection {* Simple meta-theory of structures *}
wenzelm
parents: 13419
diff changeset
   394
wenzelm
parents: 13419
diff changeset
   395
text {*
wenzelm
parents: 13419
diff changeset
   396
  The packaging of the logical specification as a predicate and the
wenzelm
parents: 13419
diff changeset
   397
  syntactic structure as a record type provides a reasonable starting
wenzelm
parents: 13419
diff changeset
   398
  point for simple meta-theoretic studies of mathematical structures.
wenzelm
parents: 13419
diff changeset
   399
  This includes operations on structures (also known as ``functors''),
wenzelm
parents: 13419
diff changeset
   400
  and statements about such constructions.
wenzelm
parents: 13419
diff changeset
   401
wenzelm
parents: 13419
diff changeset
   402
  For example, the direct product of semigroups works as follows.
wenzelm
parents: 13419
diff changeset
   403
*}
wenzelm
parents: 13419
diff changeset
   404
wenzelm
parents: 13419
diff changeset
   405
constdefs
wenzelm
parents: 13419
diff changeset
   406
  semigroup_product :: "'a semigroup \<Rightarrow> 'b semigroup \<Rightarrow> ('a \<times> 'b) semigroup"
13538
wenzelm
parents: 13457
diff changeset
   407
  "semigroup_product S T \<equiv>
wenzelm
parents: 13457
diff changeset
   408
    \<lparr>prod = \<lambda>p q. (prod S (fst p) (fst q), prod T (snd p) (snd q))\<rparr>"
13457
wenzelm
parents: 13419
diff changeset
   409
wenzelm
parents: 13419
diff changeset
   410
lemma semigroup_product [intro]:
wenzelm
parents: 13419
diff changeset
   411
  assumes S: "semigroup S"
wenzelm
parents: 13419
diff changeset
   412
    and T: "semigroup T"
wenzelm
parents: 13419
diff changeset
   413
  shows "semigroup (semigroup_product S T)"
wenzelm
parents: 13419
diff changeset
   414
proof
wenzelm
parents: 13419
diff changeset
   415
  fix p q r :: "'a \<times> 'b"
wenzelm
parents: 13419
diff changeset
   416
  have "prod S (prod S (fst p) (fst q)) (fst r) =
wenzelm
parents: 13419
diff changeset
   417
      prod S (fst p) (prod S (fst q) (fst r))"
wenzelm
parents: 13419
diff changeset
   418
    by (rule semigroup.assoc [OF S])
wenzelm
parents: 13419
diff changeset
   419
  moreover have "prod T (prod T (snd p) (snd q)) (snd r) =
wenzelm
parents: 13419
diff changeset
   420
      prod T (snd p) (prod T (snd q) (snd r))"
wenzelm
parents: 13419
diff changeset
   421
    by (rule semigroup.assoc [OF T])
13538
wenzelm
parents: 13457
diff changeset
   422
  ultimately
wenzelm
parents: 13457
diff changeset
   423
  show "prod (semigroup_product S T) (prod (semigroup_product S T) p q) r =
13457
wenzelm
parents: 13419
diff changeset
   424
      prod (semigroup_product S T) p (prod (semigroup_product S T) q r)"
wenzelm
parents: 13419
diff changeset
   425
    by (simp add: semigroup_product_def)
wenzelm
parents: 13419
diff changeset
   426
qed
wenzelm
parents: 13419
diff changeset
   427
wenzelm
parents: 13419
diff changeset
   428
text {*
wenzelm
parents: 13419
diff changeset
   429
  The above proof is fairly easy, but obscured by the lack of concrete
wenzelm
parents: 13419
diff changeset
   430
  syntax.  In fact, we didn't make use of the infrastructure of
wenzelm
parents: 13419
diff changeset
   431
  locales, apart from the raw predicate definition of @{text
wenzelm
parents: 13419
diff changeset
   432
  semigroup}.
wenzelm
parents: 13419
diff changeset
   433
wenzelm
parents: 13419
diff changeset
   434
  The alternative version below uses local context expressions to
wenzelm
parents: 13419
diff changeset
   435
  achieve a succinct proof body.  The resulting statement is exactly
wenzelm
parents: 13419
diff changeset
   436
  the same as before, even though its specification is a bit more
wenzelm
parents: 13419
diff changeset
   437
  complex.
wenzelm
parents: 13419
diff changeset
   438
*}
wenzelm
parents: 13419
diff changeset
   439
wenzelm
parents: 13419
diff changeset
   440
lemma
wenzelm
parents: 13419
diff changeset
   441
  includes semigroup S + semigroup T
wenzelm
parents: 13419
diff changeset
   442
  fixes U    (structure)
wenzelm
parents: 13419
diff changeset
   443
  defines "U \<equiv> semigroup_product S T"
wenzelm
parents: 13419
diff changeset
   444
  shows "semigroup U"
wenzelm
parents: 13419
diff changeset
   445
proof
wenzelm
parents: 13419
diff changeset
   446
  fix p q r :: "'a \<times> 'b"
wenzelm
parents: 13419
diff changeset
   447
  have "(fst p \<cdot>\<^sub>1 fst q) \<cdot>\<^sub>1 fst r = fst p \<cdot>\<^sub>1 (fst q \<cdot>\<^sub>1 fst r)"
wenzelm
parents: 13419
diff changeset
   448
    by (rule S.assoc)
wenzelm
parents: 13419
diff changeset
   449
  moreover have "(snd p \<cdot>\<^sub>2 snd q) \<cdot>\<^sub>2 snd r = snd p \<cdot>\<^sub>2 (snd q \<cdot>\<^sub>2 snd r)"
wenzelm
parents: 13419
diff changeset
   450
    by (rule T.assoc)
wenzelm
parents: 13419
diff changeset
   451
  ultimately show "(p \<cdot>\<^sub>3 q) \<cdot>\<^sub>3 r = p \<cdot>\<^sub>3 (q \<cdot>\<^sub>3 r)"
wenzelm
parents: 13419
diff changeset
   452
    by (simp add: U_def semigroup_product_def semigroup.defs)
wenzelm
parents: 13419
diff changeset
   453
qed
wenzelm
parents: 13419
diff changeset
   454
wenzelm
parents: 13419
diff changeset
   455
text {*
wenzelm
parents: 13419
diff changeset
   456
  Direct products of group structures may be defined in a similar
wenzelm
parents: 13419
diff changeset
   457
  manner, taking two further operations into account.  Subsequently,
wenzelm
parents: 13419
diff changeset
   458
  we use high-level record operations to convert between different
wenzelm
parents: 13419
diff changeset
   459
  signature types explicitly; see also
wenzelm
parents: 13419
diff changeset
   460
  \cite[\S8.3]{isabelle-hol-book}.
wenzelm
parents: 13419
diff changeset
   461
*}
wenzelm
parents: 13419
diff changeset
   462
wenzelm
parents: 13419
diff changeset
   463
constdefs
wenzelm
parents: 13419
diff changeset
   464
  group_product :: "'a group \<Rightarrow> 'b group \<Rightarrow> ('a \<times> 'b) group"
wenzelm
parents: 13419
diff changeset
   465
  "group_product G H \<equiv>
wenzelm
parents: 13419
diff changeset
   466
    semigroup.extend
wenzelm
parents: 13419
diff changeset
   467
      (semigroup_product (semigroup.truncate G) (semigroup.truncate H))
wenzelm
parents: 13419
diff changeset
   468
      (group.fields (\<lambda>p. (inv G (fst p), inv H (snd p))) (one G, one H))"
wenzelm
parents: 13419
diff changeset
   469
wenzelm
parents: 13419
diff changeset
   470
lemma group_product_aux:
wenzelm
parents: 13419
diff changeset
   471
  includes group G + group H
wenzelm
parents: 13419
diff changeset
   472
  fixes I    (structure)
wenzelm
parents: 13419
diff changeset
   473
  defines "I \<equiv> group_product G H"
wenzelm
parents: 13419
diff changeset
   474
  shows "group I"
wenzelm
parents: 13419
diff changeset
   475
proof
wenzelm
parents: 13419
diff changeset
   476
  show "semigroup I"
wenzelm
parents: 13419
diff changeset
   477
  proof -
wenzelm
parents: 13419
diff changeset
   478
    let ?G' = "semigroup.truncate G" and ?H' = "semigroup.truncate H"
wenzelm
parents: 13419
diff changeset
   479
    have "prod (semigroup_product ?G' ?H') = prod I"
13538
wenzelm
parents: 13457
diff changeset
   480
      by (simp add: I_def group_product_def group.defs
wenzelm
parents: 13457
diff changeset
   481
	semigroup_product_def semigroup.defs)
13457
wenzelm
parents: 13419
diff changeset
   482
    moreover
wenzelm
parents: 13419
diff changeset
   483
    have "semigroup ?G'" and "semigroup ?H'"
19931
fb32b43e7f80 Restructured locales with predicates: import is now an interpretation.
ballarin
parents: 17388
diff changeset
   484
      using prems by (simp_all add: semigroup_def semigroup.defs G.assoc H.assoc)
13457
wenzelm
parents: 13419
diff changeset
   485
    then have "semigroup (semigroup_product ?G' ?H')" ..
wenzelm
parents: 13419
diff changeset
   486
    ultimately show ?thesis by (simp add: I_def semigroup_def)
wenzelm
parents: 13419
diff changeset
   487
  qed
wenzelm
parents: 13419
diff changeset
   488
  show "group_axioms I"
wenzelm
parents: 13419
diff changeset
   489
  proof
wenzelm
parents: 13419
diff changeset
   490
    fix p :: "'a \<times> 'b"
wenzelm
parents: 13419
diff changeset
   491
    have "(fst p)\<inv>\<^sub>1 \<cdot>\<^sub>1 fst p = \<one>\<^sub>1"
wenzelm
parents: 13419
diff changeset
   492
      by (rule G.left_inv)
wenzelm
parents: 13419
diff changeset
   493
    moreover have "(snd p)\<inv>\<^sub>2 \<cdot>\<^sub>2 snd p = \<one>\<^sub>2"
wenzelm
parents: 13419
diff changeset
   494
      by (rule H.left_inv)
wenzelm
parents: 13419
diff changeset
   495
    ultimately show "p\<inv>\<^sub>3 \<cdot>\<^sub>3 p = \<one>\<^sub>3"
13538
wenzelm
parents: 13457
diff changeset
   496
      by (simp add: I_def group_product_def group.defs
wenzelm
parents: 13457
diff changeset
   497
	semigroup_product_def semigroup.defs)
13457
wenzelm
parents: 13419
diff changeset
   498
    have "\<one>\<^sub>1 \<cdot>\<^sub>1 fst p = fst p" by (rule G.left_one)
wenzelm
parents: 13419
diff changeset
   499
    moreover have "\<one>\<^sub>2 \<cdot>\<^sub>2 snd p = snd p" by (rule H.left_one)
wenzelm
parents: 13419
diff changeset
   500
    ultimately show "\<one>\<^sub>3 \<cdot>\<^sub>3 p = p"
13538
wenzelm
parents: 13457
diff changeset
   501
      by (simp add: I_def group_product_def group.defs
wenzelm
parents: 13457
diff changeset
   502
	semigroup_product_def semigroup.defs)
13457
wenzelm
parents: 13419
diff changeset
   503
  qed
wenzelm
parents: 13419
diff changeset
   504
qed
wenzelm
parents: 13419
diff changeset
   505
wenzelm
parents: 13419
diff changeset
   506
theorem group_product: "group G \<Longrightarrow> group H \<Longrightarrow> group (group_product G H)"
wenzelm
parents: 13419
diff changeset
   507
  by (rule group_product_aux) (assumption | rule group.axioms)+
wenzelm
parents: 13419
diff changeset
   508
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   509
end