| author | berghofe |
| Wed, 29 Aug 2007 10:20:22 +0200 | |
| changeset 24469 | 01fd2863d7c8 |
| parent 24423 | ae9cd0e92423 |
| child 24657 | 185502d54c3d |
| permissions | -rw-r--r-- |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
1 |
(* ID: $Id$ |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
2 |
Author: Florian Haftmann, TU Muenchen |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
3 |
*) |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
4 |
|
| 22424 | 5 |
header {* Test and examples for Isar class package *}
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
6 |
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
7 |
theory Classpackage |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
8 |
imports Main |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
9 |
begin |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
10 |
|
| 22473 | 11 |
class semigroup = type + |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
12 |
fixes mult :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "\<^loc>\<otimes>" 70) |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
13 |
assumes assoc: "x \<^loc>\<otimes> y \<^loc>\<otimes> z = x \<^loc>\<otimes> (y \<^loc>\<otimes> z)" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
14 |
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
15 |
instance nat :: semigroup |
| 20178 | 16 |
"m \<otimes> n \<equiv> m + n" |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
17 |
proof |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
18 |
fix m n q :: nat |
| 21924 | 19 |
from mult_nat_def show "m \<otimes> n \<otimes> q = m \<otimes> (n \<otimes> q)" by simp |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
20 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
21 |
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
22 |
instance int :: semigroup |
| 20178 | 23 |
"k \<otimes> l \<equiv> k + l" |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
24 |
proof |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
25 |
fix k l j :: int |
| 21924 | 26 |
from mult_int_def show "k \<otimes> l \<otimes> j = k \<otimes> (l \<otimes> j)" by simp |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
27 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
28 |
|
| 23952 | 29 |
instance * :: (semigroup, semigroup) semigroup |
30 |
mult_prod_def: "x \<otimes> y \<equiv> let (x1, x2) = x; (y1, y2) = y in |
|
31 |
(x1 \<otimes> y1, x2 \<otimes> y2)" |
|
32 |
by default (simp_all add: split_paired_all mult_prod_def assoc) |
|
33 |
||
| 20597 | 34 |
instance list :: (type) semigroup |
| 20178 | 35 |
"xs \<otimes> ys \<equiv> xs @ ys" |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
36 |
proof |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
37 |
fix xs ys zs :: "'a list" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
38 |
show "xs \<otimes> ys \<otimes> zs = xs \<otimes> (ys \<otimes> zs)" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
39 |
proof - |
| 21924 | 40 |
from mult_list_def have "\<And>xs ys\<Colon>'a list. xs \<otimes> ys \<equiv> xs @ ys" . |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
41 |
thus ?thesis by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
42 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
43 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
44 |
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
45 |
class monoidl = semigroup + |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
46 |
fixes one :: 'a ("\<^loc>\<one>")
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
47 |
assumes neutl: "\<^loc>\<one> \<^loc>\<otimes> x = x" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
48 |
|
| 21924 | 49 |
instance nat :: monoidl and int :: monoidl |
| 20178 | 50 |
"\<one> \<equiv> 0" |
51 |
"\<one> \<equiv> 0" |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
52 |
proof |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
53 |
fix n :: nat |
| 21924 | 54 |
from mult_nat_def one_nat_def show "\<one> \<otimes> n = n" by simp |
| 20178 | 55 |
next |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
56 |
fix k :: int |
| 21924 | 57 |
from mult_int_def one_int_def show "\<one> \<otimes> k = k" by simp |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
58 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
59 |
|
| 23952 | 60 |
instance * :: (monoidl, monoidl) monoidl |
61 |
one_prod_def: "\<one> \<equiv> (\<one>, \<one>)" |
|
62 |
by default (simp_all add: split_paired_all mult_prod_def one_prod_def neutl) |
|
63 |
||
| 20597 | 64 |
instance list :: (type) monoidl |
| 20178 | 65 |
"\<one> \<equiv> []" |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
66 |
proof |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
67 |
fix xs :: "'a list" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
68 |
show "\<one> \<otimes> xs = xs" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
69 |
proof - |
| 20178 | 70 |
from mult_list_def have "\<And>xs ys\<Colon>'a list. xs \<otimes> ys \<equiv> xs @ ys" . |
| 21924 | 71 |
moreover from one_list_def have "\<one> \<equiv> []\<Colon>'a list" by simp |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
72 |
ultimately show ?thesis by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
73 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
74 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
75 |
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
76 |
class monoid = monoidl + |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
77 |
assumes neutr: "x \<^loc>\<otimes> \<^loc>\<one> = x" |
| 21707 | 78 |
begin |
79 |
||
80 |
definition |
|
|
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21125
diff
changeset
|
81 |
units :: "'a set" where |
| 21707 | 82 |
"units = {y. \<exists>x. x \<^loc>\<otimes> y = \<^loc>\<one> \<and> y \<^loc>\<otimes> x = \<^loc>\<one>}"
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
83 |
|
| 23952 | 84 |
end context monoid begin |
|
22384
33a46e6c7f04
prefix of class interpretation not mandatory any longer
haftmann
parents:
22321
diff
changeset
|
85 |
|
| 21707 | 86 |
lemma inv_obtain: |
87 |
assumes "x \<in> units" |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
88 |
obtains y where "y \<^loc>\<otimes> x = \<^loc>\<one>" and "x \<^loc>\<otimes> y = \<^loc>\<one>" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
89 |
proof - |
| 21707 | 90 |
from assms units_def obtain y |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
91 |
where "y \<^loc>\<otimes> x = \<^loc>\<one>" and "x \<^loc>\<otimes> y = \<^loc>\<one>" by auto |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
92 |
thus ?thesis .. |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
93 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
94 |
|
| 21707 | 95 |
lemma inv_unique: |
96 |
assumes "y \<^loc>\<otimes> x = \<^loc>\<one>" "x \<^loc>\<otimes> y' = \<^loc>\<one>" |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
97 |
shows "y = y'" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
98 |
proof - |
| 21707 | 99 |
from assms neutr have "y = y \<^loc>\<otimes> (x \<^loc>\<otimes> y')" by simp |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
100 |
also with assoc have "... = (y \<^loc>\<otimes> x) \<^loc>\<otimes> y'" by simp |
| 21707 | 101 |
also with assms neutl have "... = y'" by simp |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
102 |
finally show ?thesis . |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
103 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
104 |
|
| 21707 | 105 |
lemma units_inv_comm: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
106 |
assumes inv: "x \<^loc>\<otimes> y = \<^loc>\<one>" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
107 |
and G: "x \<in> units" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
108 |
shows "y \<^loc>\<otimes> x = \<^loc>\<one>" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
109 |
proof - |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
110 |
from G inv_obtain obtain z |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
111 |
where z_choice: "z \<^loc>\<otimes> x = \<^loc>\<one>" by blast |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
112 |
from inv neutl neutr have "x \<^loc>\<otimes> y \<^loc>\<otimes> x = x \<^loc>\<otimes> \<^loc>\<one>" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
113 |
with assoc have "z \<^loc>\<otimes> x \<^loc>\<otimes> y \<^loc>\<otimes> x = z \<^loc>\<otimes> x \<^loc>\<otimes> \<^loc>\<one>" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
114 |
with neutl z_choice show ?thesis by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
115 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
116 |
|
| 23952 | 117 |
fun |
118 |
npow :: "nat \<Rightarrow> 'a \<Rightarrow> 'a" |
|
119 |
where |
|
120 |
"npow 0 x = \<^loc>\<one>" |
|
121 |
| "npow (Suc n) x = x \<^loc>\<otimes> npow n x" |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
122 |
|
| 23952 | 123 |
end context monoid begin |
|
22384
33a46e6c7f04
prefix of class interpretation not mandatory any longer
haftmann
parents:
22321
diff
changeset
|
124 |
|
| 21707 | 125 |
abbreviation |
126 |
npow_syn :: "'a \<Rightarrow> nat \<Rightarrow> 'a" (infix "\<^loc>\<up>" 75) where |
|
| 20178 | 127 |
"x \<^loc>\<up> n \<equiv> npow n x" |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
128 |
|
| 21707 | 129 |
lemma nat_pow_one: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
130 |
"\<^loc>\<one> \<^loc>\<up> n = \<^loc>\<one>" |
| 23952 | 131 |
using neutl by (induct n) simp_all |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
132 |
|
| 21707 | 133 |
lemma nat_pow_mult: "x \<^loc>\<up> n \<^loc>\<otimes> x \<^loc>\<up> m = x \<^loc>\<up> (n + m)" |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
134 |
proof (induct n) |
| 23952 | 135 |
case 0 with neutl show ?case by simp |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
136 |
next |
| 23952 | 137 |
case (Suc n) with Suc.hyps assoc show ?case by simp |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
138 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
139 |
|
| 21707 | 140 |
lemma nat_pow_pow: "(x \<^loc>\<up> m) \<^loc>\<up> n = x \<^loc>\<up> (n * m)" |
| 23952 | 141 |
using nat_pow_mult by (induct n) simp_all |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
142 |
|
| 21707 | 143 |
end |
144 |
||
| 23952 | 145 |
instance * :: (monoid, monoid) monoid |
| 24282 | 146 |
by default (simp_all add: split_paired_all mult_prod_def one_prod_def neutr) |
| 23952 | 147 |
|
148 |
instance list :: (type) monoid |
|
149 |
proof |
|
150 |
fix xs :: "'a list" |
|
151 |
show "xs \<otimes> \<one> = xs" |
|
152 |
proof - |
|
153 |
from mult_list_def have "\<And>xs ys\<Colon>'a list. xs \<otimes> ys \<equiv> xs @ ys" . |
|
154 |
moreover from one_list_def have "\<one> \<equiv> []\<Colon>'a list" by simp |
|
155 |
ultimately show ?thesis by simp |
|
156 |
qed |
|
157 |
qed |
|
158 |
||
159 |
class monoid_comm = monoid + |
|
160 |
assumes comm: "x \<^loc>\<otimes> y = y \<^loc>\<otimes> x" |
|
161 |
||
162 |
instance nat :: monoid_comm and int :: monoid_comm |
|
163 |
proof |
|
164 |
fix n :: nat |
|
165 |
from mult_nat_def one_nat_def show "n \<otimes> \<one> = n" by simp |
|
166 |
next |
|
167 |
fix n m :: nat |
|
168 |
from mult_nat_def show "n \<otimes> m = m \<otimes> n" by simp |
|
169 |
next |
|
170 |
fix k :: int |
|
171 |
from mult_int_def one_int_def show "k \<otimes> \<one> = k" by simp |
|
172 |
next |
|
173 |
fix k l :: int |
|
174 |
from mult_int_def show "k \<otimes> l = l \<otimes> k" by simp |
|
175 |
qed |
|
176 |
||
177 |
instance * :: (monoid_comm, monoid_comm) monoid_comm |
|
178 |
by default (simp_all add: split_paired_all mult_prod_def comm) |
|
179 |
||
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
180 |
class group = monoidl + |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
181 |
fixes inv :: "'a \<Rightarrow> 'a" ("\<^loc>\<div> _" [81] 80)
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
182 |
assumes invl: "\<^loc>\<div> x \<^loc>\<otimes> x = \<^loc>\<one>" |
| 23952 | 183 |
begin |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
184 |
|
| 23952 | 185 |
lemma cancel: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
186 |
"(x \<^loc>\<otimes> y = x \<^loc>\<otimes> z) = (y = z)" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
187 |
proof |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
188 |
fix x y z :: 'a |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
189 |
assume eq: "x \<^loc>\<otimes> y = x \<^loc>\<otimes> z" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
190 |
hence "\<^loc>\<div> x \<^loc>\<otimes> (x \<^loc>\<otimes> y) = \<^loc>\<div> x \<^loc>\<otimes> (x \<^loc>\<otimes> z)" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
191 |
with assoc have "\<^loc>\<div> x \<^loc>\<otimes> x \<^loc>\<otimes> y = \<^loc>\<div> x \<^loc>\<otimes> x \<^loc>\<otimes> z" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
192 |
with neutl invl show "y = z" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
193 |
next |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
194 |
fix x y z :: 'a |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
195 |
assume eq: "y = z" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
196 |
thus "x \<^loc>\<otimes> y = x \<^loc>\<otimes> z" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
197 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
198 |
|
| 23952 | 199 |
lemma neutr: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
200 |
"x \<^loc>\<otimes> \<^loc>\<one> = x" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
201 |
proof - |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
202 |
from invl have "\<^loc>\<div> x \<^loc>\<otimes> x = \<^loc>\<one>" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
203 |
with assoc [symmetric] neutl invl have "\<^loc>\<div> x \<^loc>\<otimes> (x \<^loc>\<otimes> \<^loc>\<one>) = \<^loc>\<div> x \<^loc>\<otimes> x" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
204 |
with cancel show ?thesis by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
205 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
206 |
|
| 23952 | 207 |
lemma invr: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
208 |
"x \<^loc>\<otimes> \<^loc>\<div> x = \<^loc>\<one>" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
209 |
proof - |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
210 |
from neutl invl have "\<^loc>\<div> x \<^loc>\<otimes> x \<^loc>\<otimes> \<^loc>\<div> x = \<^loc>\<div> x" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
211 |
with neutr have "\<^loc>\<div> x \<^loc>\<otimes> x \<^loc>\<otimes> \<^loc>\<div> x = \<^loc>\<div> x \<^loc>\<otimes> \<^loc>\<one> " by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
212 |
with assoc have "\<^loc>\<div> x \<^loc>\<otimes> (x \<^loc>\<otimes> \<^loc>\<div> x) = \<^loc>\<div> x \<^loc>\<otimes> \<^loc>\<one> " by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
213 |
with cancel show ?thesis .. |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
214 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
215 |
|
| 23952 | 216 |
end |
217 |
||
| 22321 | 218 |
instance advanced group < monoid |
| 22179 | 219 |
proof unfold_locales |
| 20383 | 220 |
fix x |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
221 |
from neutr show "x \<^loc>\<otimes> \<^loc>\<one> = x" . |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
222 |
qed |
| 24282 | 223 |
|
224 |
hide const npow (*FIXME*) |
|
225 |
lemmas neutr = monoid_class.mult_one.neutr |
|
226 |
lemmas inv_obtain = monoid_class.inv_obtain |
|
227 |
lemmas inv_unique = monoid_class.inv_unique |
|
228 |
lemmas nat_pow_mult = monoid_class.nat_pow_mult |
|
229 |
lemmas nat_pow_one = monoid_class.nat_pow_one |
|
230 |
lemmas nat_pow_pow = monoid_class.nat_pow_pow |
|
231 |
lemmas units_def = monoid_class.units_def |
|
232 |
lemmas mult_one_def = monoid_class.units_inv_comm |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
233 |
|
| 23952 | 234 |
context group |
235 |
begin |
|
236 |
||
237 |
lemma all_inv [intro]: |
|
238 |
"(x\<Colon>'a) \<in> units" |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
239 |
unfolding units_def |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
240 |
proof - |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
241 |
fix x :: "'a" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
242 |
from invl invr have "\<^loc>\<div> x \<^loc>\<otimes> x = \<^loc>\<one>" and "x \<^loc>\<otimes> \<^loc>\<div> x = \<^loc>\<one>" . |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
243 |
then obtain y where "y \<^loc>\<otimes> x = \<^loc>\<one>" and "x \<^loc>\<otimes> y = \<^loc>\<one>" .. |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
244 |
hence "\<exists>y\<Colon>'a. y \<^loc>\<otimes> x = \<^loc>\<one> \<and> x \<^loc>\<otimes> y = \<^loc>\<one>" by blast |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
245 |
thus "x \<in> {y\<Colon>'a. \<exists>x\<Colon>'a. x \<^loc>\<otimes> y = \<^loc>\<one> \<and> y \<^loc>\<otimes> x = \<^loc>\<one>}" by simp
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
246 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
247 |
|
| 23952 | 248 |
lemma cancer: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
249 |
"(y \<^loc>\<otimes> x = z \<^loc>\<otimes> x) = (y = z)" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
250 |
proof |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
251 |
assume eq: "y \<^loc>\<otimes> x = z \<^loc>\<otimes> x" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
252 |
with assoc [symmetric] have "y \<^loc>\<otimes> (x \<^loc>\<otimes> \<^loc>\<div> x) = z \<^loc>\<otimes> (x \<^loc>\<otimes> \<^loc>\<div> x)" by (simp del: invr) |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
253 |
with invr neutr show "y = z" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
254 |
next |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
255 |
assume eq: "y = z" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
256 |
thus "y \<^loc>\<otimes> x = z \<^loc>\<otimes> x" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
257 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
258 |
|
| 23952 | 259 |
lemma inv_one: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
260 |
"\<^loc>\<div> \<^loc>\<one> = \<^loc>\<one>" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
261 |
proof - |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
262 |
from neutl have "\<^loc>\<div> \<^loc>\<one> = \<^loc>\<one> \<^loc>\<otimes> (\<^loc>\<div> \<^loc>\<one>)" .. |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
263 |
moreover from invr have "... = \<^loc>\<one>" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
264 |
finally show ?thesis . |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
265 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
266 |
|
| 23952 | 267 |
lemma inv_inv: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
268 |
"\<^loc>\<div> (\<^loc>\<div> x) = x" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
269 |
proof - |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
270 |
from invl invr neutr |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
271 |
have "\<^loc>\<div> (\<^loc>\<div> x) \<^loc>\<otimes> \<^loc>\<div> x \<^loc>\<otimes> x = x \<^loc>\<otimes> \<^loc>\<div> x \<^loc>\<otimes> x" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
272 |
with assoc [symmetric] |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
273 |
have "\<^loc>\<div> (\<^loc>\<div> x) \<^loc>\<otimes> (\<^loc>\<div> x \<^loc>\<otimes> x) = x \<^loc>\<otimes> (\<^loc>\<div> x \<^loc>\<otimes> x)" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
274 |
with invl neutr show ?thesis by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
275 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
276 |
|
| 23952 | 277 |
lemma inv_mult_group: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
278 |
"\<^loc>\<div> (x \<^loc>\<otimes> y) = \<^loc>\<div> y \<^loc>\<otimes> \<^loc>\<div> x" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
279 |
proof - |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
280 |
from invl have "\<^loc>\<div> (x \<^loc>\<otimes> y) \<^loc>\<otimes> (x \<^loc>\<otimes> y) = \<^loc>\<one>" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
281 |
with assoc have "\<^loc>\<div> (x \<^loc>\<otimes> y) \<^loc>\<otimes> x \<^loc>\<otimes> y = \<^loc>\<one>" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
282 |
with neutl have "\<^loc>\<div> (x \<^loc>\<otimes> y) \<^loc>\<otimes> x \<^loc>\<otimes> y \<^loc>\<otimes> \<^loc>\<div> y \<^loc>\<otimes> \<^loc>\<div> x = \<^loc>\<div> y \<^loc>\<otimes> \<^loc>\<div> x" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
283 |
with assoc have "\<^loc>\<div> (x \<^loc>\<otimes> y) \<^loc>\<otimes> (x \<^loc>\<otimes> (y \<^loc>\<otimes> \<^loc>\<div> y) \<^loc>\<otimes> \<^loc>\<div> x) = \<^loc>\<div> y \<^loc>\<otimes> \<^loc>\<div> x" by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
284 |
with invr neutr show ?thesis by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
285 |
qed |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
286 |
|
| 23952 | 287 |
lemma inv_comm: |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
288 |
"x \<^loc>\<otimes> \<^loc>\<div> x = \<^loc>\<div> x \<^loc>\<otimes> x" |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
289 |
using invr invl by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
290 |
|
| 23952 | 291 |
definition |
292 |
pow :: "int \<Rightarrow> 'a \<Rightarrow> 'a" |
|
293 |
where |
|
294 |
"pow k x = (if k < 0 then \<^loc>\<div> (npow (nat (-k)) x) |
|
295 |
else (npow (nat k) x))" |
|
296 |
||
| 24282 | 297 |
end |
298 |
||
299 |
(*FIXME*) |
|
300 |
lemmas pow_def [code func] = pow_def [folded monoid_class.npow] |
|
301 |
||
302 |
context group begin |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
303 |
|
| 23952 | 304 |
abbreviation |
305 |
pow_syn :: "'a \<Rightarrow> int \<Rightarrow> 'a" (infix "\<^loc>\<up>\<up>" 75) |
|
306 |
where |
|
307 |
"x \<^loc>\<up>\<up> k \<equiv> pow k x" |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
308 |
|
| 23952 | 309 |
lemma int_pow_zero: |
310 |
"x \<^loc>\<up>\<up> (0\<Colon>int) = \<^loc>\<one>" |
|
311 |
using pow_def by simp |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
312 |
|
| 23952 | 313 |
lemma int_pow_one: |
314 |
"\<^loc>\<one> \<^loc>\<up>\<up> (k\<Colon>int) = \<^loc>\<one>" |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
315 |
using pow_def nat_pow_one inv_one by simp |
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
316 |
|
| 23952 | 317 |
end |
| 20427 | 318 |
|
| 21924 | 319 |
instance * :: (group, group) group |
| 20427 | 320 |
inv_prod_def: "\<div> x \<equiv> let (x1, x2) = x in (\<div> x1, \<div> x2)" |
|
22384
33a46e6c7f04
prefix of class interpretation not mandatory any longer
haftmann
parents:
22321
diff
changeset
|
321 |
by default (simp_all add: split_paired_all mult_prod_def one_prod_def inv_prod_def invl) |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
322 |
|
| 23952 | 323 |
class group_comm = group + monoid_comm |
324 |
||
325 |
instance int :: group_comm |
|
326 |
"\<div> k \<equiv> - (k\<Colon>int)" |
|
327 |
proof |
|
328 |
fix k :: int |
|
329 |
from mult_int_def one_int_def inv_int_def show "\<div> k \<otimes> k = \<one>" by simp |
|
330 |
qed |
|
331 |
||
| 21924 | 332 |
instance * :: (group_comm, group_comm) group_comm |
|
22384
33a46e6c7f04
prefix of class interpretation not mandatory any longer
haftmann
parents:
22321
diff
changeset
|
333 |
by default (simp_all add: split_paired_all mult_prod_def comm) |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
334 |
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
335 |
definition |
| 23952 | 336 |
"X a b c = (a \<otimes> \<one> \<otimes> b, a \<otimes> \<one> \<otimes> b, npow 3 [a, b] \<otimes> \<one> \<otimes> [a, b, c])" |
337 |
||
|
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21125
diff
changeset
|
338 |
definition |
| 24282 | 339 |
"Y a b c = (a, \<div> a) \<otimes> \<one> \<otimes> \<div> (b, \<div> pow (-3) c)" |
| 20383 | 340 |
|
|
21404
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21125
diff
changeset
|
341 |
definition "x1 = X (1::nat) 2 3" |
|
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21125
diff
changeset
|
342 |
definition "x2 = X (1::int) 2 3" |
|
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
wenzelm
parents:
21125
diff
changeset
|
343 |
definition "y2 = Y (1::int) 2 3" |
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
344 |
|
|
24423
ae9cd0e92423
overloaded definitions accompanied by explicit constants
haftmann
parents:
24348
diff
changeset
|
345 |
export_code mult x1 x2 y2 in SML module_name Classpackage |
| 23810 | 346 |
in OCaml file - |
347 |
in Haskell file - |
|
|
19281
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
348 |
|
|
b411f25fff25
added example for operational classes and code generator
haftmann
parents:
diff
changeset
|
349 |
end |