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