src/HOL/ex/Locales.thy
author wenzelm
Wed, 24 Jul 2002 22:13:02 +0200
changeset 13419 902ec83c1ca9
parent 13383 041d78bf9403
child 13457 7ddcf40a80b3
permissions -rw-r--r--
tuned;
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
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     5
*)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     6
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
     7
header {* Using locales in Isabelle/Isar *}
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     8
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     9
theory Locales = Main:
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    10
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    11
text_raw {*
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    12
  \newcommand{\isasyminv}{\isasyminverse}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    13
  \newcommand{\isasymIN}{\isatext{\isakeyword{in}}}
12965
c8a97eb1e3c7 renamed 'uses' to 'includes';
wenzelm
parents: 12955
diff changeset
    14
  \newcommand{\isasymINCLUDES}{\isatext{\isakeyword{includes}}}
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    15
*}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    16
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    17
subsection {* Overview *}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    18
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    19
text {*
12105
wenzelm
parents: 12099
diff changeset
    20
  Locales provide a mechanism for encapsulating local contexts.  The
12574
wenzelm
parents: 12507
diff changeset
    21
  original version due to Florian Kammüller \cite{Kamm-et-al:1999}
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    22
  refers directly to the raw meta-logic of Isabelle.  Semantically, a
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    23
  locale is just a (curried) predicate of the pure meta-logic
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    24
  \cite{Paulson:1989}.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    25
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    26
  The present version for Isabelle/Isar builds on top of the rich
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    27
  infrastructure of proof contexts
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    28
  \cite{Wenzel:1999,Wenzel:2001:isar-ref,Wenzel:2001:Thesis},
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    29
  achieving a tight integration with Isar proof texts, and a slightly
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    30
  more abstract view of the underlying concepts.  An Isar proof
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    31
  context encapsulates certain language elements that correspond to
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    32
  @{text \<And>} (universal quantification), @{text \<Longrightarrow>} (implication), and
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    33
  @{text "\<equiv>"} (definitions) of the pure Isabelle framework.  Moreover,
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    34
  there are extra-logical concepts like term abbreviations or local
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    35
  theorem attributes (declarations of simplification rules etc.) that
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    36
  are indispensable in realistic applications.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    37
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    38
  Locales support concrete syntax, providing a localized version of
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    39
  the existing concept of mixfix annotations of Isabelle
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    40
  \cite{Paulson:1994:Isabelle}.  Furthermore, there is a separate
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    41
  concept of ``implicit structures'' that admits to refer to
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    42
  particular locale parameters in a casual manner (essentially derived
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    43
  from the basic idea of ``anti-quotations'' or generalized de-Bruijn
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    44
  indexes demonstrated in \cite[\S13--14]{Wenzel:2001:Isar-examples}).
12105
wenzelm
parents: 12099
diff changeset
    45
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    46
  Implicit structures work particular well together with extensible
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    47
  records in HOL \cite{Naraschewski-Wenzel:1998} (the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    48
  ``object-oriented'' features discussed there are not required here).
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    49
  Thus we shall essentially use record types to represent polymorphic
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    50
  signatures of mathematical structures, while locales describe their
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    51
  logical properties as a predicate.  Due to type inference of
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    52
  simply-typed records we are able to give succinct specifications,
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    53
  without caring about signature morphisms ourselves.  Further
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    54
  eye-candy is provided by the independent concept of ``indexed
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    55
  concrete syntax'' for record selectors.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    56
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    57
  Operations for building up locale contexts from existing definitions
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    58
  cover common operations of \emph{merge} (disjunctive union in
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    59
  canonical order) and \emph{rename} (of term parameters; types are
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    60
  always inferred automatically).
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    61
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    62
  \medskip Note that the following further concepts are still
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    63
  \emph{absent}:
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    64
  \begin{itemize}
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    65
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    66
  \item Specific language elements for \emph{instantiation} of
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    67
  locales.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    68
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    69
  Currently users may simulate this to some extend by having primitive
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    70
  Isabelle/Isar operations (@{text of} for substitution and @{text OF}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    71
  for composition, \cite{Wenzel:2001:isar-ref}) act on the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    72
  automatically exported results stemming from different contexts.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    73
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    74
  \item Interpretation of locales, analogous to ``functors'' in
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    75
  abstract algebra.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    76
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    77
  In principle one could directly work with functions over structures
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    78
  (extensible records), and predicates being derived from locale
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    79
  definitions.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    80
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    81
  \end{itemize}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    82
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    83
  \medskip Subsequently, we demonstrate some readily available
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    84
  concepts of Isabelle/Isar locales by some simple examples of
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
    85
  abstract algebraic reasoning.
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    86
*}
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    87
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    88
subsection {* Local contexts as mathematical structures *}
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    89
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    90
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    91
  The following definitions of @{text group} and @{text abelian_group}
12105
wenzelm
parents: 12099
diff changeset
    92
  merely encapsulate local parameters (with private syntax) and
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    93
  assumptions; local definitions may be given as well, but are not
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    94
  shown here.
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    95
*}
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    96
12574
wenzelm
parents: 12507
diff changeset
    97
locale group_context =
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    98
  fixes prod :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "\<cdot>" 70)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    99
    and inv :: "'a \<Rightarrow> 'a"    ("(_\<inv>)" [1000] 999)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   100
    and one :: 'a    ("\<one>")
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   101
  assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   102
    and left_inv: "x\<inv> \<cdot> x = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   103
    and left_one: "\<one> \<cdot> x = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   104
12574
wenzelm
parents: 12507
diff changeset
   105
locale abelian_group_context = group_context +
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   106
  assumes commute: "x \<cdot> y = y \<cdot> x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   107
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   108
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   109
  \medskip We may now prove theorems within a local context, just by
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   110
  including a directive ``@{text "(\<IN> name)"}'' in the goal
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   111
  specification.  The final result will be stored within the named
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   112
  locale; a second copy is exported to the enclosing theory context.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   113
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   114
12574
wenzelm
parents: 12507
diff changeset
   115
theorem (in group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   116
  right_inv: "x \<cdot> x\<inv> = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   117
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   118
  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
   119
  also have "\<dots> = \<one> \<cdot> x \<cdot> x\<inv>" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   120
  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
   121
  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
   122
  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
   123
  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
   124
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> x\<inv>" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   125
  also have "\<dots> = \<one>" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   126
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   127
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   128
12574
wenzelm
parents: 12507
diff changeset
   129
theorem (in group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   130
  right_one: "x \<cdot> \<one> = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   131
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   132
  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
   133
  also have "\<dots> = x \<cdot> x\<inv> \<cdot> x" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   134
  also have "\<dots> = \<one> \<cdot> x" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   135
  also have "\<dots> = x" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   136
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   137
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   138
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   139
text {*
12105
wenzelm
parents: 12099
diff changeset
   140
  \medskip Apart from the named context we may also refer to further
wenzelm
parents: 12099
diff changeset
   141
  context elements (parameters, assumptions, etc.) in a casual manner;
wenzelm
parents: 12099
diff changeset
   142
  these are discharged when the proof is finished.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   143
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   144
12574
wenzelm
parents: 12507
diff changeset
   145
theorem (in group_context)
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   146
  assumes eq: "e \<cdot> x = x"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   147
  shows one_equality: "\<one> = e"
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   148
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   149
  have "\<one> = x \<cdot> x\<inv>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   150
  also have "\<dots> = (e \<cdot> x) \<cdot> x\<inv>" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   151
  also have "\<dots> = e \<cdot> (x \<cdot> x\<inv>)" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   152
  also have "\<dots> = e \<cdot> \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   153
  also have "\<dots> = e" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   154
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   155
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   156
12574
wenzelm
parents: 12507
diff changeset
   157
theorem (in group_context)
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   158
  assumes eq: "x' \<cdot> x = \<one>"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   159
  shows inv_equality: "x\<inv> = x'"
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   160
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   161
  have "x\<inv> = \<one> \<cdot> x\<inv>" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   162
  also have "\<dots> = (x' \<cdot> x) \<cdot> x\<inv>" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   163
  also have "\<dots> = x' \<cdot> (x \<cdot> x\<inv>)" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   164
  also have "\<dots> = x' \<cdot> \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   165
  also have "\<dots> = x'" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   166
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   167
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   168
12574
wenzelm
parents: 12507
diff changeset
   169
theorem (in group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   170
  inv_prod: "(x \<cdot> y)\<inv> = y\<inv> \<cdot> x\<inv>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   171
proof (rule inv_equality)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   172
  show "(y\<inv> \<cdot> x\<inv>) \<cdot> (x \<cdot> y) = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   173
  proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   174
    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
   175
    also have "\<dots> = (y\<inv> \<cdot> \<one>) \<cdot> y" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   176
    also have "\<dots> = y\<inv> \<cdot> y" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   177
    also have "\<dots> = \<one>" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   178
    finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   179
  qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   180
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   181
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   182
text {*
12105
wenzelm
parents: 12099
diff changeset
   183
  \medskip Established results are automatically propagated through
wenzelm
parents: 12099
diff changeset
   184
  the hierarchy of locales.  Below we establish a trivial fact in
wenzelm
parents: 12099
diff changeset
   185
  commutative groups, while referring both to theorems of @{text
wenzelm
parents: 12099
diff changeset
   186
  group} and the additional assumption of @{text abelian_group}.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   187
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   188
12574
wenzelm
parents: 12507
diff changeset
   189
theorem (in abelian_group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   190
  inv_prod': "(x \<cdot> y)\<inv> = x\<inv> \<cdot> y\<inv>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   191
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   192
  have "(x \<cdot> y)\<inv> = y\<inv> \<cdot> x\<inv>" by (rule inv_prod)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   193
  also have "\<dots> = x\<inv> \<cdot> y\<inv>" by (rule commute)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   194
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   195
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   196
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   197
text {*
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   198
  We see that the initial import of @{text group} within the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   199
  definition of @{text abelian_group} is actually evaluated
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   200
  dynamically.  Thus any results in @{text group} are made available
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   201
  to the derived context of @{text abelian_group} as well.  Note that
12965
c8a97eb1e3c7 renamed 'uses' to 'includes';
wenzelm
parents: 12955
diff changeset
   202
  the alternative context element @{text \<INCLUDES>} would import
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   203
  existing locales in a static fashion, without participating in
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   204
  further facts emerging later on.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   205
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   206
  \medskip Some more properties of inversion in general group theory
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   207
  follow.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   208
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   209
12574
wenzelm
parents: 12507
diff changeset
   210
theorem (in group_context)
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   211
  inv_inv: "(x\<inv>)\<inv> = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   212
proof (rule inv_equality)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   213
  show "x \<cdot> x\<inv> = \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   214
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   215
12574
wenzelm
parents: 12507
diff changeset
   216
theorem (in group_context)
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   217
  assumes eq: "x\<inv> = y\<inv>"
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   218
  shows inv_inject: "x = y"
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   219
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   220
  have "x = x \<cdot> \<one>" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   221
  also have "\<dots> = x \<cdot> (y\<inv> \<cdot> y)" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   222
  also have "\<dots> = x \<cdot> (x\<inv> \<cdot> y)" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   223
  also have "\<dots> = (x \<cdot> x\<inv>) \<cdot> y" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   224
  also have "\<dots> = \<one> \<cdot> y" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   225
  also have "\<dots> = y" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   226
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   227
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   228
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   229
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   230
  \bigskip We see that this representation of structures as local
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   231
  contexts is rather light-weight and convenient to use for abstract
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   232
  reasoning.  Here the ``components'' (the group operations) have been
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   233
  exhibited directly as context parameters; logically this corresponds
13383
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   234
  to a curried predicate definition:
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   235
13419
wenzelm
parents: 13383
diff changeset
   236
  @{thm [display] group_context_def [no_vars]}
wenzelm
parents: 13383
diff changeset
   237
wenzelm
parents: 13383
diff changeset
   238
  The corresponding introduction rule is as follows:
wenzelm
parents: 13383
diff changeset
   239
wenzelm
parents: 13383
diff changeset
   240
  @{thm [display] group_context.intro [no_vars]}
13383
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   241
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   242
  Occasionally, this ``externalized'' version of the informal idea of
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   243
  classes of tuple structures may cause some inconveniences,
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   244
  especially in meta-theoretical studies (involving functors from
041d78bf9403 adapted locales;
wenzelm
parents: 13107
diff changeset
   245
  groups to groups, for example).
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   246
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   247
  Another minor drawback of the naive approach above is that concrete
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   248
  syntax will get lost on any kind of operation on the locale itself
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   249
  (such as renaming, copying, or instantiation).  Whenever the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   250
  particular terminology of local parameters is affected the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   251
  associated syntax would have to be changed as well, which is hard to
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   252
  achieve formally.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   253
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   254
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   255
12105
wenzelm
parents: 12099
diff changeset
   256
subsection {* Explicit structures referenced implicitly *}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   257
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   258
text {*
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   259
  We introduce the same hierarchy of basic group structures as above,
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   260
  this time using extensible record types for the signature part,
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   261
  together with concrete syntax for selector functions.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   262
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   263
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   264
record 'a semigroup =
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   265
  prod :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "\<cdot>\<index>" 70)
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   266
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   267
record 'a group = "'a semigroup" +
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   268
  inv :: "'a \<Rightarrow> 'a"    ("(_\<inv>\<index>)" [1000] 999)
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   269
  one :: 'a    ("\<one>\<index>")
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   270
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   271
text {*
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   272
  The mixfix annotations above include a special ``structure index
12574
wenzelm
parents: 12507
diff changeset
   273
  indicator'' @{text \<index>} that makes gammer productions dependent on
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   274
  certain parameters that have been declared as ``structure'' in a
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   275
  locale context later on.  Thus we achieve casual notation as
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   276
  encountered in informal mathematics, e.g.\ @{text "x \<cdot> y"} for
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   277
  @{text "prod G x y"}.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   278
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   279
  \medskip The following locale definitions introduce operate on a
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   280
  single parameter declared as ``\isakeyword{structure}''.  Type
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   281
  inference takes care to fill in the appropriate record type schemes
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   282
  internally.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   283
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   284
12574
wenzelm
parents: 12507
diff changeset
   285
locale semigroup =
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   286
  fixes S :: "'a group"    (structure)
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   287
  assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   288
12574
wenzelm
parents: 12507
diff changeset
   289
locale group = semigroup G +
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   290
  assumes left_inv: "x\<inv> \<cdot> x = \<one>"
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   291
    and left_one: "\<one> \<cdot> x = x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   292
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   293
text {*
12507
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   294
  Note that we prefer to call the @{text group} record structure
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   295
  @{text G} rather than @{text S} inherited from @{text semigroup}.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   296
  This does not affect our concrete syntax, which is only dependent on
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   297
  the \emph{positional} arrangements of currently active structures
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   298
  (actually only one above), rather than names.  In fact, these
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   299
  parameter names rarely occur in the term language at all (due to the
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   300
  ``indexed syntax'' facility of Isabelle).  On the other hand, names
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   301
  of locale facts will get qualified accordingly, e.g. @{text S.assoc}
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   302
  versus @{text G.assoc}.
cc36d5da9bc0 updated;
wenzelm
parents: 12356
diff changeset
   303
12574
wenzelm
parents: 12507
diff changeset
   304
  \medskip We may now proceed to prove results within @{text group}
wenzelm
parents: 12507
diff changeset
   305
  just as before for @{text group}.  The subsequent proof texts are
wenzelm
parents: 12507
diff changeset
   306
  exactly the same as despite the more advanced internal arrangement.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   307
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   308
12574
wenzelm
parents: 12507
diff changeset
   309
theorem (in group)
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   310
  right_inv: "x \<cdot> x\<inv> = \<one>"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   311
proof -
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   312
  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
   313
  also have "\<dots> = \<one> \<cdot> x \<cdot> x\<inv>" by (simp only: assoc)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   314
  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
   315
  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
   316
  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
   317
  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
   318
  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
   319
  also have "\<dots> = \<one>" by (simp only: left_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   320
  finally show ?thesis .
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   321
qed
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   322
12574
wenzelm
parents: 12507
diff changeset
   323
theorem (in group)
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   324
  right_one: "x \<cdot> \<one> = x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   325
proof -
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   326
  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
   327
  also have "\<dots> = x \<cdot> x\<inv> \<cdot> x" by (simp only: assoc)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   328
  also have "\<dots> = \<one> \<cdot> x" by (simp only: right_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   329
  also have "\<dots> = x" by (simp only: left_one)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   330
  finally show ?thesis .
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   331
qed
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   332
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   333
text {*
12574
wenzelm
parents: 12507
diff changeset
   334
  \medskip Several implicit structures may be active at the same time.
wenzelm
parents: 12507
diff changeset
   335
  The concrete syntax facility for locales actually maintains indexed
wenzelm
parents: 12507
diff changeset
   336
  structures that may be references implicitly --- via mixfix
wenzelm
parents: 12507
diff changeset
   337
  annotations that have been decorated by an ``index argument''
wenzelm
parents: 12507
diff changeset
   338
  (@{text \<index>}).
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   339
12574
wenzelm
parents: 12507
diff changeset
   340
  The following synthetic example demonstrates how to refer to several
wenzelm
parents: 12507
diff changeset
   341
  structures of type @{text group} succinctly.  We work with two
wenzelm
parents: 12507
diff changeset
   342
  versions of the @{text group} locale above.
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   343
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   344
12937
0c4fd7529467 clarified syntax of ``long'' statements: fixes/assumes/shows;
wenzelm
parents: 12574
diff changeset
   345
lemma
12955
f4d60f358cb6 renamed "uses" to "includes";
wenzelm
parents: 12937
diff changeset
   346
  includes group G
f4d60f358cb6 renamed "uses" to "includes";
wenzelm
parents: 12937
diff changeset
   347
  includes group H
13107
8743cc847224 tuned presentation;
wenzelm
parents: 12965
diff changeset
   348
  shows "x \<cdot> y \<cdot> \<one> = prod G (prod G x y) (one G)"
8743cc847224 tuned presentation;
wenzelm
parents: 12965
diff changeset
   349
    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
   350
    and "x \<cdot> \<one>\<^sub>2 = prod G x (one H)"
8743cc847224 tuned presentation;
wenzelm
parents: 12965
diff changeset
   351
  by (rule refl)+
12574
wenzelm
parents: 12507
diff changeset
   352
wenzelm
parents: 12507
diff changeset
   353
text {*
wenzelm
parents: 12507
diff changeset
   354
  Note that the trivial statements above need to be given as a
wenzelm
parents: 12507
diff changeset
   355
  simultaneous goal in order to have type-inference make the implicit
wenzelm
parents: 12507
diff changeset
   356
  typing of structures @{text G} and @{text H} agree.
wenzelm
parents: 12507
diff changeset
   357
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   358
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   359
end