21 |
21 |
22 class inverse = |
22 class inverse = |
23 fixes inverse :: "'a \<Rightarrow> 'a" |
23 fixes inverse :: "'a \<Rightarrow> 'a" |
24 and divide :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "'/" 70) |
24 and divide :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "'/" 70) |
25 |
25 |
|
26 setup {* Sign.add_const_constraint |
|
27 (@{const_name "divide"}, SOME @{typ "'a \<Rightarrow> 'a \<Rightarrow> 'a"}) *} |
|
28 |
|
29 |
|
30 context semiring |
|
31 begin |
|
32 |
|
33 lemma [field_simps]: |
|
34 shows distrib_left_NO_MATCH: "NO_MATCH a (x / y) \<Longrightarrow> a * (b + c) = a * b + a * c" |
|
35 and distrib_right_NO_MATCH: "NO_MATCH c (x / y) \<Longrightarrow> (a + b) * c = a * c + b * c" |
|
36 by (rule distrib_left distrib_right)+ |
|
37 |
|
38 end |
|
39 |
|
40 context ring |
|
41 begin |
|
42 |
|
43 lemma [field_simps]: |
|
44 shows left_diff_distrib_NO_MATCH: "NO_MATCH c (x / y) \<Longrightarrow> (a - b) * c = a * c - b * c" |
|
45 and right_diff_distrib_NO_MATCH: "NO_MATCH a (x / y) \<Longrightarrow> a * (b - c) = a * b - a * c" |
|
46 by (rule left_diff_distrib right_diff_distrib)+ |
|
47 |
|
48 end |
|
49 |
|
50 setup {* Sign.add_const_constraint |
|
51 (@{const_name "divide"}, SOME @{typ "'a::inverse \<Rightarrow> 'a \<Rightarrow> 'a"}) *} |
|
52 |
26 text{* Lemmas @{text divide_simps} move division to the outside and eliminates them on (in)equalities. *} |
53 text{* Lemmas @{text divide_simps} move division to the outside and eliminates them on (in)equalities. *} |
27 |
54 |
28 named_theorems divide_simps "rewrite rules to eliminate divisions" |
55 named_theorems divide_simps "rewrite rules to eliminate divisions" |
29 |
|
30 |
56 |
31 class division_ring = ring_1 + inverse + |
57 class division_ring = ring_1 + inverse + |
32 assumes left_inverse [simp]: "a \<noteq> 0 \<Longrightarrow> inverse a * a = 1" |
58 assumes left_inverse [simp]: "a \<noteq> 0 \<Longrightarrow> inverse a * a = 1" |
33 assumes right_inverse [simp]: "a \<noteq> 0 \<Longrightarrow> a * inverse a = 1" |
59 assumes right_inverse [simp]: "a \<noteq> 0 \<Longrightarrow> a * inverse a = 1" |
34 assumes divide_inverse: "a / b = a * inverse b" |
60 assumes divide_inverse: "a / b = a * inverse b" |