src/HOL/ex/Locales.thy
author wenzelm
Thu, 08 Nov 2001 00:26:06 +0100
changeset 12099 8504c948fae2
parent 12091 08b4da78d1ad
child 12105 1e4451999200
permissions -rw-r--r--
more explanations on advanced syntax;
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$
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, LMU Muenchen
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
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
     7
header {* Basic use of 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
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    11
text {*
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    12
  Locales provide a mechanism for encapsulating local contexts.  While
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    13
  the original version by Florian Kamm\"uller refers to the raw
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    14
  meta-logic, the present one of Isabelle/Isar builds on top of the
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    15
  rich infrastructure of Isar proof contexts.  Subsequently, we
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    16
  demonstrate basic use of locales to model mathematical structures
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    17
  (by the inevitable group theory example).
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    18
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    19
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    20
text_raw {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    21
  \newcommand{\isasyminv}{\isasyminverse}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    22
  \newcommand{\isasymone}{\isamath{1}}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    23
  \newcommand{\isasymIN}{\isatext{\isakeyword{in}}}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    24
*}
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    25
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    26
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    27
subsection {* Local contexts as mathematical structures *}
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
    28
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    29
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    30
  The following definitions of @{text group} and @{text abelian_group}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    31
  simply encapsulate local parameters (with private syntax) and
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    32
  assumptions; local definitions may be given as well, but are not
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    33
  shown here.
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    34
*}
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    35
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    36
locale group =
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    37
  fixes prod :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "\<cdot>" 70)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    38
    and inv :: "'a \<Rightarrow> 'a"    ("(_\<inv>)" [1000] 999)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    39
    and one :: 'a    ("\<one>")
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    40
  assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    41
    and left_inv: "x\<inv> \<cdot> x = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    42
    and left_one: "\<one> \<cdot> x = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    43
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    44
locale abelian_group = group +
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    45
  assumes commute: "x \<cdot> y = y \<cdot> x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    46
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    47
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    48
  \medskip We may now prove theorems within a local context, just by
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    49
  including a directive ``@{text "(\<IN> name)"}'' in the goal
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    50
  specification.  The final result will be stored within the named
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    51
  locale; a second copy is exported to the enclosing theory context.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    52
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    53
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    54
theorem (in group)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    55
  right_inv: "x \<cdot> x\<inv> = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    56
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    57
  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
    58
  also have "\<dots> = \<one> \<cdot> x \<cdot> x\<inv>" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    59
  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
    60
  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
    61
  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
    62
  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
    63
  also have "\<dots> = (x\<inv>)\<inv> \<cdot> x\<inv>" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    64
  also have "\<dots> = \<one>" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    65
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    66
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    67
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    68
theorem (in group)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    69
  right_one: "x \<cdot> \<one> = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    70
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    71
  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
    72
  also have "\<dots> = x \<cdot> x\<inv> \<cdot> x" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    73
  also have "\<dots> = \<one> \<cdot> x" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    74
  also have "\<dots> = x" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    75
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    76
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    77
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    78
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    79
  \medskip Apart from the named locale context we may also refer to
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    80
  further ad-hoc elements (parameters, assumptions, etc.); these are
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    81
  discharged when the proof is finished.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    82
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
    83
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    84
theorem (in group)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    85
  (assumes eq: "e \<cdot> x = x")
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    86
  one_equality: "\<one> = e"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    87
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    88
  have "\<one> = x \<cdot> x\<inv>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    89
  also have "\<dots> = (e \<cdot> x) \<cdot> x\<inv>" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    90
  also have "\<dots> = e \<cdot> (x \<cdot> x\<inv>)" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    91
  also have "\<dots> = e \<cdot> \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    92
  also have "\<dots> = e" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    93
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    94
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    95
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    96
theorem (in group)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    97
  (assumes eq: "x' \<cdot> x = \<one>")
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    98
  inv_equality: "x\<inv> = x'"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
    99
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   100
  have "x\<inv> = \<one> \<cdot> x\<inv>" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   101
  also have "\<dots> = (x' \<cdot> x) \<cdot> x\<inv>" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   102
  also have "\<dots> = x' \<cdot> (x \<cdot> x\<inv>)" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   103
  also have "\<dots> = x' \<cdot> \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   104
  also have "\<dots> = x'" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   105
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   106
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   107
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   108
theorem (in group)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   109
  inv_prod: "(x \<cdot> y)\<inv> = y\<inv> \<cdot> x\<inv>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   110
proof (rule inv_equality)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   111
  show "(y\<inv> \<cdot> x\<inv>) \<cdot> (x \<cdot> y) = \<one>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   112
  proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   113
    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
   114
    also have "\<dots> = (y\<inv> \<cdot> \<one>) \<cdot> y" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   115
    also have "\<dots> = y\<inv> \<cdot> y" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   116
    also have "\<dots> = \<one>" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   117
    finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   118
  qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   119
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   120
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   121
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   122
  \medskip Results are automatically propagated through the hierarchy
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   123
  of locales.  Below we establish a trivial fact of commutative
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   124
  groups, while referring both to theorems of @{text group} and the
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   125
  characteristic assumption of @{text abelian_group}.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   126
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   127
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   128
theorem (in abelian_group)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   129
  inv_prod': "(x \<cdot> y)\<inv> = x\<inv> \<cdot> y\<inv>"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   130
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   131
  have "(x \<cdot> y)\<inv> = y\<inv> \<cdot> x\<inv>" by (rule inv_prod)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   132
  also have "\<dots> = x\<inv> \<cdot> y\<inv>" by (rule commute)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   133
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   134
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   135
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   136
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   137
  \medskip Some further facts of general group theory follow.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   138
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   139
12075
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   140
theorem (in group)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   141
  inv_inv: "(x\<inv>)\<inv> = x"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   142
proof (rule inv_equality)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   143
  show "x \<cdot> x\<inv> = \<one>" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   144
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   145
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   146
theorem (in group)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   147
  (assumes eq: "x\<inv> = y\<inv>")
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   148
  inv_inject: "x = y"
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   149
proof -
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   150
  have "x = x \<cdot> \<one>" by (simp only: right_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   151
  also have "\<dots> = x \<cdot> (y\<inv> \<cdot> y)" by (simp only: left_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   152
  also have "\<dots> = x \<cdot> (x\<inv> \<cdot> y)" by (simp only: eq)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   153
  also have "\<dots> = (x \<cdot> x\<inv>) \<cdot> y" by (simp only: assoc)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   154
  also have "\<dots> = \<one> \<cdot> y" by (simp only: right_inv)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   155
  also have "\<dots> = y" by (simp only: left_one)
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   156
  finally show ?thesis .
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   157
qed
8d65dd96381f Locales and simple mathematical structures;
wenzelm
parents:
diff changeset
   158
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   159
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   160
  \bigskip We see that this representation of structures as local
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   161
  contexts is rather light-weight and convenient to use for abstract
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   162
  reasoning.  Here the ``components'' (the group operations) have been
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   163
  exhibited directly as context parameters; logically this corresponds
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   164
  to a curried predicate definition.  Occasionally, this
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   165
  ``externalized'' version of the informal idea of classes of tuple
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   166
  structures may cause some inconveniences, especially in
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   167
  meta-theoretical studies (involving functors from groups to groups,
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   168
  for example).
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   169
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   170
  Another drawback of the naive approach above is that concrete syntax
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   171
  will get lost on any kind of operation on the locale itself (such as
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   172
  renaming, copying, or instantiation).  Whenever the particular
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   173
  terminology of local parameters is affected the associated syntax
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   174
  would have to be changed as well, which is hard to achieve formally.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   175
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   176
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   177
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   178
subsection {* Referencing explicit structures implicitly *}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   179
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   180
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   181
  The issue of multiple parameters raised above may be easily
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   182
  addressed by stating properties over a record of group operations,
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   183
  instead of the individual constituents.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   184
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   185
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   186
record 'a group =
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   187
  prod :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   188
  inv :: "'a \<Rightarrow> 'a"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   189
  one :: 'a
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   190
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   191
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   192
  Now concrete syntax essentially needs refer to record selections;
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   193
  this is possible by giving defined operations with private syntax
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   194
  within the locale (e.g.\ see appropriate examples by Kamm\"uller).
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   195
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   196
  In the subsequent formulation of group structures we go one step
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   197
  further by using \emph{implicit} references to the underlying
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   198
  abstract entity.  To this end we define global syntax, which is
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   199
  translated to refer to the ``current'' structure at hand, denoted by
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   200
  the dummy item ``@{text \<struct>}'' according to the builtin syntax
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   201
  mechanism for locales.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   202
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   203
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   204
syntax
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   205
  "_prod" :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "\<cdot>" 70)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   206
  "_inv" :: "'a \<Rightarrow> 'a"    ("(_\<inv>)" [1000] 999)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   207
  "_one" :: 'a    ("\<one>")
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   208
translations
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   209
  "x \<cdot> y"  \<rightleftharpoons>  "prod \<struct> x y"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   210
  "x\<inv>"  \<rightleftharpoons>  "inv \<struct> x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   211
  "\<one>"  \<rightleftharpoons>  "one \<struct>"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   212
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   213
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   214
  The following locale definition introduces a single parameter, which
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   215
  is declared as ``\isakeyword{structure}''.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   216
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   217
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   218
locale group_struct =
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   219
  fixes G :: "'a group"    (structure)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   220
  assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   221
    and left_inv: "x\<inv> \<cdot> x = \<one>"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   222
    and left_one: "\<one> \<cdot> x = x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   223
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   224
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   225
  In its context the dummy ``@{text \<struct>}'' refers to this very
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   226
  parameter, independently of the present naming.  We may now proceed
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   227
  to prove results within @{text group_struct} just as before for
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   228
  @{text group}.  Proper treatment of ``@{text \<struct>}'' is hidden in
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   229
  concrete syntax, so the proof text is exactly the same as for @{text
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   230
  group} given before.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   231
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   232
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   233
theorem (in group_struct)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   234
  right_inv: "x \<cdot> x\<inv> = \<one>"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   235
proof -
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   236
  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
   237
  also have "\<dots> = \<one> \<cdot> x \<cdot> x\<inv>" by (simp only: assoc)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   238
  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
   239
  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
   240
  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
   241
  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
   242
  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
   243
  also have "\<dots> = \<one>" by (simp only: left_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   244
  finally show ?thesis .
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   245
qed
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   246
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   247
theorem (in group_struct)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   248
  right_one: "x \<cdot> \<one> = x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   249
proof -
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   250
  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
   251
  also have "\<dots> = x \<cdot> x\<inv> \<cdot> x" by (simp only: assoc)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   252
  also have "\<dots> = \<one> \<cdot> x" by (simp only: right_inv)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   253
  also have "\<dots> = x" by (simp only: left_one)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   254
  finally show ?thesis .
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   255
qed
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   256
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   257
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   258
  \medskip Several implicit structures may be active at the same time
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   259
  (say up to 3 in practice).  The concrete syntax facility for locales
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   260
  actually maintains indexed dummies @{text "\<struct>\<^sub>1"}, @{text
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   261
  "\<struct>\<^sub>2"}, @{text "\<struct>\<^sub>3"}, \dots (@{text \<struct>} is the same as
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   262
  @{text "\<struct>\<^sub>1"}).  So we are able to provide concrete syntax to
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   263
  cover the 2nd and 3rd group structure as well.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   264
*}
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   265
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   266
syntax
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   267
  "_prod'" :: "'a \<Rightarrow> index \<Rightarrow> 'a \<Rightarrow> 'a"    ("(_ \<cdot>_/ _)" [70, 1000, 71] 70)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   268
  "_inv'" :: "'a \<Rightarrow> index \<Rightarrow> 'a"    ("(_\<inv>_)" [1000] 999)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   269
  "_one'" :: "index \<Rightarrow> 'a"    ("\<one>_")
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   270
translations
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   271
  "x \<cdot>\<^sub>2 y"  \<rightleftharpoons>  "prod \<struct>\<^sub>2 x y"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   272
  "x \<cdot>\<^sub>3 y"  \<rightleftharpoons>  "prod \<struct>\<^sub>3 x y"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   273
  "x\<inv>\<^sub>2"  \<rightleftharpoons>  "inv \<struct>\<^sub>2 x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   274
  "x\<inv>\<^sub>3"  \<rightleftharpoons>  "inv \<struct>\<^sub>3 x"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   275
  "\<one>\<^sub>2"  \<rightleftharpoons>  "one \<struct>\<^sub>2"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   276
  "\<one>\<^sub>3"  \<rightleftharpoons>  "one \<struct>\<^sub>3"
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   277
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   278
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   279
  \medskip The following synthetic example demonstrates how to refer
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   280
  to several structures of type @{text group} succinctly; one might
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   281
  also think of working with renamed versions of the @{text
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   282
  group_struct} locale above.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   283
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   284
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   285
lemma
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   286
  (fixes G :: "'a group" (structure)
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   287
    and H :: "'a group" (structure))
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   288
  True
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   289
proof
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   290
  have "x \<cdot> y \<cdot> \<one> = prod G (prod G x y) (one G)" ..
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   291
  have "x \<cdot>\<^sub>2 y \<cdot>\<^sub>2 \<one>\<^sub>2 = prod H (prod H x y) (one H)" ..
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   292
  have "x \<cdot> \<one>\<^sub>2 = prod G x (one H)" ..
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   293
qed
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   294
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   295
text {*
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   296
  \medskip As a minor drawback of this advanced technique we require
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   297
  slightly more work to setup abstract and concrete syntax properly
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   298
  (but only once in the beginning).  The resulting casual mode of
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   299
  writing @{text "x \<cdot> y"} for @{text "prod G x y"} etc.\ mimics common
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   300
  practice of informal mathematics quite nicely, while using a simple
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   301
  and robust formal representation.
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   302
*}
12091
08b4da78d1ad added structures;
wenzelm
parents: 12075
diff changeset
   303
12099
8504c948fae2 more explanations on advanced syntax;
wenzelm
parents: 12091
diff changeset
   304
end