| author | berghofe | 
| Thu, 08 Dec 2005 10:17:21 +0100 | |
| changeset 18366 | 78b4f225b640 | 
| parent 17472 | bcbf48d59059 | 
| child 18648 | 22f96cd085d5 | 
| permissions | -rw-r--r-- | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
1  | 
(* Title: Parity.thy  | 
| 14450 | 2  | 
ID: $Id$  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
3  | 
Author: Jeremy Avigad  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
4  | 
*)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
5  | 
|
| 17472 | 6  | 
header {* Even and Odd for ints and nats*}
 | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
7  | 
|
| 15131 | 8  | 
theory Parity  | 
| 15140 | 9  | 
imports Divides IntDiv NatSimprocs  | 
| 15131 | 10  | 
begin  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
11  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
12  | 
axclass even_odd < type  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
13  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
14  | 
instance int :: even_odd ..  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
15  | 
instance nat :: even_odd ..  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
16  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
17  | 
consts  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
18  | 
even :: "'a::even_odd => bool"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
19  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
20  | 
syntax  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
21  | 
odd :: "'a::even_odd => bool"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
22  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
23  | 
translations  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
24  | 
"odd x" == "~even x"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
25  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
26  | 
defs (overloaded)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
27  | 
even_def: "even (x::int) == x mod 2 = 0"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
28  | 
even_nat_def: "even (x::nat) == even (int x)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
29  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
30  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
31  | 
subsection {* Even and odd are mutually exclusive *}
 | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
32  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
33  | 
lemma int_pos_lt_two_imp_zero_or_one:  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
34  | 
"0 <= x ==> (x::int) < 2 ==> x = 0 | x = 1"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
35  | 
by auto  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
36  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
37  | 
lemma neq_one_mod_two [simp]: "((x::int) mod 2 ~= 0) = (x mod 2 = 1)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
38  | 
apply (subgoal_tac "x mod 2 = 0 | x mod 2 = 1", force)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
39  | 
apply (rule int_pos_lt_two_imp_zero_or_one, auto)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
40  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
41  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
42  | 
subsection {* Behavior under integer arithmetic operations *}
 | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
43  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
44  | 
lemma even_times_anything: "even (x::int) ==> even (x * y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
45  | 
by (simp add: even_def zmod_zmult1_eq')  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
46  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
47  | 
lemma anything_times_even: "even (y::int) ==> even (x * y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
48  | 
by (simp add: even_def zmod_zmult1_eq)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
49  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
50  | 
lemma odd_times_odd: "odd (x::int) ==> odd y ==> odd (x * y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
51  | 
by (simp add: even_def zmod_zmult1_eq)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
52  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
53  | 
lemma even_product: "even((x::int) * y) = (even x | even y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
54  | 
apply (auto simp add: even_times_anything anything_times_even)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
55  | 
apply (rule ccontr)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
56  | 
apply (auto simp add: odd_times_odd)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
57  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
58  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
59  | 
lemma even_plus_even: "even (x::int) ==> even y ==> even (x + y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
60  | 
by (simp add: even_def zmod_zadd1_eq)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
61  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
62  | 
lemma even_plus_odd: "even (x::int) ==> odd y ==> odd (x + y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
63  | 
by (simp add: even_def zmod_zadd1_eq)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
64  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
65  | 
lemma odd_plus_even: "odd (x::int) ==> even y ==> odd (x + y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
66  | 
by (simp add: even_def zmod_zadd1_eq)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
67  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
68  | 
lemma odd_plus_odd: "odd (x::int) ==> odd y ==> even (x + y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
69  | 
by (simp add: even_def zmod_zadd1_eq)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
70  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
71  | 
lemma even_sum: "even ((x::int) + y) = ((even x & even y) | (odd x & odd y))"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
72  | 
apply (auto intro: even_plus_even odd_plus_odd)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
73  | 
apply (rule ccontr, simp add: even_plus_odd)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
74  | 
apply (rule ccontr, simp add: odd_plus_even)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
75  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
76  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
77  | 
lemma even_neg: "even (-(x::int)) = even x"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
78  | 
by (auto simp add: even_def zmod_zminus1_eq_if)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
79  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
80  | 
lemma even_difference:  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
81  | 
"even ((x::int) - y) = ((even x & even y) | (odd x & odd y))"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
82  | 
by (simp only: diff_minus even_sum even_neg)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
83  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
84  | 
lemma even_pow_gt_zero [rule_format]:  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
85  | 
"even (x::int) ==> 0 < n --> even (x^n)"  | 
| 15251 | 86  | 
apply (induct n)  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
87  | 
apply (auto simp add: even_product)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
88  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
89  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
90  | 
lemma odd_pow: "odd x ==> odd((x::int)^n)"  | 
| 15251 | 91  | 
apply (induct n)  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
92  | 
apply (simp add: even_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
93  | 
apply (simp add: even_product)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
94  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
95  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
96  | 
lemma even_power: "even ((x::int)^n) = (even x & 0 < n)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
97  | 
apply (auto simp add: even_pow_gt_zero)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
98  | 
apply (erule contrapos_pp, erule odd_pow)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
99  | 
apply (erule contrapos_pp, simp add: even_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
100  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
101  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
102  | 
lemma even_zero: "even (0::int)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
103  | 
by (simp add: even_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
104  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
105  | 
lemma odd_one: "odd (1::int)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
106  | 
by (simp add: even_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
107  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
108  | 
lemmas even_odd_simps [simp] = even_def[of "number_of v",standard] even_zero  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
109  | 
odd_one even_product even_sum even_neg even_difference even_power  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
110  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
111  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
112  | 
subsection {* Equivalent definitions *}
 | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
113  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
114  | 
lemma two_times_even_div_two: "even (x::int) ==> 2 * (x div 2) = x"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
115  | 
by (auto simp add: even_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
116  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
117  | 
lemma two_times_odd_div_two_plus_one: "odd (x::int) ==>  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
118  | 
2 * (x div 2) + 1 = x"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
119  | 
apply (insert zmod_zdiv_equality [of x 2, THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
120  | 
by (simp add: even_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
121  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
122  | 
lemma even_equiv_def: "even (x::int) = (EX y. x = 2 * y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
123  | 
apply auto  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
124  | 
apply (rule exI)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
125  | 
by (erule two_times_even_div_two [THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
126  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
127  | 
lemma odd_equiv_def: "odd (x::int) = (EX y. x = 2 * y + 1)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
128  | 
apply auto  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
129  | 
apply (rule exI)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
130  | 
by (erule two_times_odd_div_two_plus_one [THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
131  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
132  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
133  | 
subsection {* even and odd for nats *}
 | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
134  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
135  | 
lemma pos_int_even_equiv_nat_even: "0 \<le> x ==> even x = even (nat x)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
136  | 
by (simp add: even_nat_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
137  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
138  | 
lemma even_nat_product: "even((x::nat) * y) = (even x | even y)"  | 
| 16413 | 139  | 
by (simp add: even_nat_def int_mult)  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
140  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
141  | 
lemma even_nat_sum: "even ((x::nat) + y) =  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
142  | 
((even x & even y) | (odd x & odd y))"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
143  | 
by (unfold even_nat_def, simp)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
144  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
145  | 
lemma even_nat_difference:  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
146  | 
"even ((x::nat) - y) = (x < y | (even x & even y) | (odd x & odd y))"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
147  | 
apply (auto simp add: even_nat_def zdiff_int [THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
148  | 
apply (case_tac "x < y", auto simp add: zdiff_int [THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
149  | 
apply (case_tac "x < y", auto simp add: zdiff_int [THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
150  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
151  | 
|
| 14436 | 152  | 
lemma even_nat_Suc: "even (Suc x) = odd x"  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
153  | 
by (simp add: even_nat_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
154  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
155  | 
lemma even_nat_power: "even ((x::nat)^y) = (even x & 0 < y)"  | 
| 16413 | 156  | 
by (simp add: even_nat_def int_power)  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
157  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
158  | 
lemma even_nat_zero: "even (0::nat)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
159  | 
by (simp add: even_nat_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
160  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
161  | 
lemmas even_odd_nat_simps [simp] = even_nat_def[of "number_of v",standard]  | 
| 14436 | 162  | 
even_nat_zero even_nat_Suc even_nat_product even_nat_sum even_nat_power  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
163  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
164  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
165  | 
subsection {* Equivalent definitions *}
 | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
166  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
167  | 
lemma nat_lt_two_imp_zero_or_one: "(x::nat) < Suc (Suc 0) ==>  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
168  | 
x = 0 | x = Suc 0"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
169  | 
by auto  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
170  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
171  | 
lemma even_nat_mod_two_eq_zero: "even (x::nat) ==> x mod (Suc (Suc 0)) = 0"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
172  | 
apply (insert mod_div_equality [of x "Suc (Suc 0)", THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
173  | 
apply (drule subst, assumption)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
174  | 
apply (subgoal_tac "x mod Suc (Suc 0) = 0 | x mod Suc (Suc 0) = Suc 0")  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
175  | 
apply force  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
176  | 
apply (subgoal_tac "0 < Suc (Suc 0)")  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
177  | 
apply (frule mod_less_divisor [of "Suc (Suc 0)" x])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
178  | 
apply (erule nat_lt_two_imp_zero_or_one, auto)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
179  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
180  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
181  | 
lemma odd_nat_mod_two_eq_one: "odd (x::nat) ==> x mod (Suc (Suc 0)) = Suc 0"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
182  | 
apply (insert mod_div_equality [of x "Suc (Suc 0)", THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
183  | 
apply (drule subst, assumption)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
184  | 
apply (subgoal_tac "x mod Suc (Suc 0) = 0 | x mod Suc (Suc 0) = Suc 0")  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
185  | 
apply force  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
186  | 
apply (subgoal_tac "0 < Suc (Suc 0)")  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
187  | 
apply (frule mod_less_divisor [of "Suc (Suc 0)" x])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
188  | 
apply (erule nat_lt_two_imp_zero_or_one, auto)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
189  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
190  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
191  | 
lemma even_nat_equiv_def: "even (x::nat) = (x mod Suc (Suc 0) = 0)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
192  | 
apply (rule iffI)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
193  | 
apply (erule even_nat_mod_two_eq_zero)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
194  | 
apply (insert odd_nat_mod_two_eq_one [of x], auto)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
195  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
196  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
197  | 
lemma odd_nat_equiv_def: "odd (x::nat) = (x mod Suc (Suc 0) = Suc 0)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
198  | 
apply (auto simp add: even_nat_equiv_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
199  | 
apply (subgoal_tac "x mod (Suc (Suc 0)) < Suc (Suc 0)")  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
200  | 
apply (frule nat_lt_two_imp_zero_or_one, auto)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
201  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
202  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
203  | 
lemma even_nat_div_two_times_two: "even (x::nat) ==>  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
204  | 
Suc (Suc 0) * (x div Suc (Suc 0)) = x"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
205  | 
apply (insert mod_div_equality [of x "Suc (Suc 0)", THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
206  | 
apply (drule even_nat_mod_two_eq_zero, simp)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
207  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
208  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
209  | 
lemma odd_nat_div_two_times_two_plus_one: "odd (x::nat) ==>  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
210  | 
Suc( Suc (Suc 0) * (x div Suc (Suc 0))) = x"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
211  | 
apply (insert mod_div_equality [of x "Suc (Suc 0)", THEN sym])  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
212  | 
apply (drule odd_nat_mod_two_eq_one, simp)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
213  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
214  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
215  | 
lemma even_nat_equiv_def2: "even (x::nat) = (EX y. x = Suc (Suc 0) * y)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
216  | 
apply (rule iffI, rule exI)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
217  | 
apply (erule even_nat_div_two_times_two [THEN sym], auto)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
218  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
219  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
220  | 
lemma odd_nat_equiv_def2: "odd (x::nat) = (EX y. x = Suc(Suc (Suc 0) * y))"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
221  | 
apply (rule iffI, rule exI)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
222  | 
apply (erule odd_nat_div_two_times_two_plus_one [THEN sym], auto)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
223  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
224  | 
|
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
225  | 
subsection {* Parity and powers *}
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
226  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
227  | 
lemma minus_one_even_odd_power:  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
228  | 
     "(even x --> (- 1::'a::{comm_ring_1,recpower})^x = 1) & 
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
229  | 
(odd x --> (- 1::'a)^x = - 1)"  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
230  | 
apply (induct x)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
231  | 
apply (rule conjI)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
232  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
233  | 
apply (insert even_nat_zero, blast)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
234  | 
apply (simp add: power_Suc)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
235  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
236  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
237  | 
lemma minus_one_even_power [simp]:  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
238  | 
     "even x ==> (- 1::'a::{comm_ring_1,recpower})^x = 1"
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
239  | 
by (rule minus_one_even_odd_power [THEN conjunct1, THEN mp], assumption)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
240  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
241  | 
lemma minus_one_odd_power [simp]:  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
242  | 
     "odd x ==> (- 1::'a::{comm_ring_1,recpower})^x = - 1"
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
243  | 
by (rule minus_one_even_odd_power [THEN conjunct2, THEN mp], assumption)  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
244  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
245  | 
lemma neg_one_even_odd_power:  | 
| 15003 | 246  | 
     "(even x --> (-1::'a::{number_ring,recpower})^x = 1) & 
 | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
247  | 
(odd x --> (-1::'a)^x = -1)"  | 
| 15251 | 248  | 
apply (induct x)  | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
249  | 
apply (simp, simp add: power_Suc)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
250  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
251  | 
|
| 14436 | 252  | 
lemma neg_one_even_power [simp]:  | 
| 15003 | 253  | 
     "even x ==> (-1::'a::{number_ring,recpower})^x = 1"
 | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
254  | 
by (rule neg_one_even_odd_power [THEN conjunct1, THEN mp], assumption)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
255  | 
|
| 14436 | 256  | 
lemma neg_one_odd_power [simp]:  | 
| 15003 | 257  | 
     "odd x ==> (-1::'a::{number_ring,recpower})^x = -1"
 | 
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
258  | 
by (rule neg_one_even_odd_power [THEN conjunct2, THEN mp], assumption)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
259  | 
|
| 
14443
 
75910c7557c5
generic theorems about exponentials; general tidying up
 
paulson 
parents: 
14436 
diff
changeset
 | 
260  | 
lemma neg_power_if:  | 
| 15003 | 261  | 
     "(-x::'a::{comm_ring_1,recpower}) ^ n = 
 | 
| 
14443
 
75910c7557c5
generic theorems about exponentials; general tidying up
 
paulson 
parents: 
14436 
diff
changeset
 | 
262  | 
(if even n then (x ^ n) else -(x ^ n))"  | 
| 
 
75910c7557c5
generic theorems about exponentials; general tidying up
 
paulson 
parents: 
14436 
diff
changeset
 | 
263  | 
by (induct n, simp_all split: split_if_asm add: power_Suc)  | 
| 
 
75910c7557c5
generic theorems about exponentials; general tidying up
 
paulson 
parents: 
14436 
diff
changeset
 | 
264  | 
|
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
265  | 
lemma zero_le_even_power: "even n ==>  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
266  | 
    0 <= (x::'a::{recpower,ordered_ring_strict}) ^ n"
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
267  | 
apply (simp add: even_nat_equiv_def2)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
268  | 
apply (erule exE)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
269  | 
apply (erule ssubst)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
270  | 
apply (subst power_add)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
271  | 
apply (rule zero_le_square)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
272  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
273  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
274  | 
lemma zero_le_odd_power: "odd n ==>  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
275  | 
    (0 <= (x::'a::{recpower,ordered_idom}) ^ n) = (0 <= x)"
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
276  | 
apply (simp add: odd_nat_equiv_def2)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
277  | 
apply (erule exE)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
278  | 
apply (erule ssubst)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
279  | 
apply (subst power_Suc)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
280  | 
apply (subst power_add)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
281  | 
apply (subst zero_le_mult_iff)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
282  | 
apply auto  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
283  | 
apply (subgoal_tac "x = 0 & 0 < y")  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
284  | 
apply (erule conjE, assumption)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
285  | 
apply (subst power_eq_0_iff [THEN sym])  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
286  | 
apply (subgoal_tac "0 <= x^y * x^y")  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
287  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
288  | 
apply (rule zero_le_square)+  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
289  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
290  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
291  | 
lemma zero_le_power_eq: "(0 <= (x::'a::{recpower,ordered_idom}) ^ n) = 
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
292  | 
(even n | (odd n & 0 <= x))"  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
293  | 
apply auto  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
294  | 
apply (subst zero_le_odd_power [THEN sym])  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
295  | 
apply assumption+  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
296  | 
apply (erule zero_le_even_power)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
297  | 
apply (subst zero_le_odd_power)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
298  | 
apply assumption+  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
299  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
300  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
301  | 
lemma zero_less_power_eq: "(0 < (x::'a::{recpower,ordered_idom}) ^ n) = 
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
302  | 
(n = 0 | (even n & x ~= 0) | (odd n & 0 < x))"  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
303  | 
apply (rule iffI)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
304  | 
apply clarsimp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
305  | 
apply (rule conjI)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
306  | 
apply clarsimp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
307  | 
apply (rule ccontr)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
308  | 
apply (subgoal_tac "~ (0 <= x^n)")  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
309  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
310  | 
apply (subst zero_le_odd_power)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
311  | 
apply assumption  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
312  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
313  | 
apply (rule notI)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
314  | 
apply (simp add: power_0_left)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
315  | 
apply (rule notI)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
316  | 
apply (simp add: power_0_left)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
317  | 
apply auto  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
318  | 
apply (subgoal_tac "0 <= x^n")  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
319  | 
apply (frule order_le_imp_less_or_eq)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
320  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
321  | 
apply (erule zero_le_even_power)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
322  | 
apply (subgoal_tac "0 <= x^n")  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
323  | 
apply (frule order_le_imp_less_or_eq)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
324  | 
apply auto  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
325  | 
apply (subst zero_le_odd_power)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
326  | 
apply assumption  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
327  | 
apply (erule order_less_imp_le)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
328  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
329  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
330  | 
lemma power_less_zero_eq: "((x::'a::{recpower,ordered_idom}) ^ n < 0) =
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
331  | 
(odd n & x < 0)"  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
332  | 
apply (subst linorder_not_le [THEN sym])+  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
333  | 
apply (subst zero_le_power_eq)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
334  | 
apply auto  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
335  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
336  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
337  | 
lemma power_le_zero_eq: "((x::'a::{recpower,ordered_idom}) ^ n <= 0) =
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
338  | 
(n ~= 0 & ((odd n & x <= 0) | (even n & x = 0)))"  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
339  | 
apply (subst linorder_not_less [THEN sym])+  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
340  | 
apply (subst zero_less_power_eq)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
341  | 
apply auto  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
342  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
343  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
344  | 
lemma power_even_abs: "even n ==>  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
345  | 
    (abs (x::'a::{recpower,ordered_idom}))^n = x^n"
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
346  | 
apply (subst power_abs [THEN sym])  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
347  | 
apply (simp add: zero_le_even_power)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
348  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
349  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
350  | 
lemma zero_less_power_nat_eq: "(0 < (x::nat) ^ n) = (n = 0 | 0 < x)"  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
351  | 
apply (induct n)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
352  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
353  | 
apply auto  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
354  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
355  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
356  | 
lemma power_minus_even [simp]: "even n ==>  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
357  | 
    (- x)^n = (x^n::'a::{recpower,comm_ring_1})"
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
358  | 
apply (subst power_minus)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
359  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
360  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
361  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
362  | 
lemma power_minus_odd [simp]: "odd n ==>  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
363  | 
    (- x)^n = - (x^n::'a::{recpower,comm_ring_1})"
 | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
364  | 
apply (subst power_minus)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
365  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
366  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
367  | 
|
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
368  | 
(* Simplify, when the exponent is a numeral *)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16413 
diff
changeset
 | 
369  | 
|
| 17085 | 370  | 
lemmas power_0_left_number_of = power_0_left [of "number_of w", standard]  | 
371  | 
declare power_0_left_number_of [simp]  | 
|
372  | 
||
373  | 
lemmas zero_le_power_eq_number_of =  | 
|
374  | 
zero_le_power_eq [of _ "number_of w", standard]  | 
|
375  | 
declare zero_le_power_eq_number_of [simp]  | 
|
376  | 
||
377  | 
lemmas zero_less_power_eq_number_of =  | 
|
378  | 
zero_less_power_eq [of _ "number_of w", standard]  | 
|
379  | 
declare zero_less_power_eq_number_of [simp]  | 
|
380  | 
||
381  | 
lemmas power_le_zero_eq_number_of =  | 
|
382  | 
power_le_zero_eq [of _ "number_of w", standard]  | 
|
383  | 
declare power_le_zero_eq_number_of [simp]  | 
|
384  | 
||
385  | 
lemmas power_less_zero_eq_number_of =  | 
|
386  | 
power_less_zero_eq [of _ "number_of w", standard]  | 
|
387  | 
declare power_less_zero_eq_number_of [simp]  | 
|
388  | 
||
389  | 
lemmas zero_less_power_nat_eq_number_of =  | 
|
390  | 
zero_less_power_nat_eq [of _ "number_of w", standard]  | 
|
391  | 
declare zero_less_power_nat_eq_number_of [simp]  | 
|
392  | 
||
393  | 
lemmas power_eq_0_iff_number_of = power_eq_0_iff [of _ "number_of w", standard]  | 
|
394  | 
declare power_eq_0_iff_number_of [simp]  | 
|
395  | 
||
396  | 
lemmas power_even_abs_number_of = power_even_abs [of "number_of w" _, standard]  | 
|
397  | 
declare power_even_abs_number_of [simp]  | 
|
398  | 
||
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
399  | 
|
| 17472 | 400  | 
subsection {* An Equivalence for @{term [source] "0 \<le> a^n"} *}
 | 
| 14450 | 401  | 
|
402  | 
lemma even_power_le_0_imp_0:  | 
|
| 15003 | 403  | 
     "a ^ (2*k) \<le> (0::'a::{ordered_idom,recpower}) ==> a=0"
 | 
| 14450 | 404  | 
apply (induct k)  | 
405  | 
apply (auto simp add: zero_le_mult_iff mult_le_0_iff power_Suc)  | 
|
406  | 
done  | 
|
407  | 
||
408  | 
lemma zero_le_power_iff:  | 
|
| 15003 | 409  | 
     "(0 \<le> a^n) = (0 \<le> (a::'a::{ordered_idom,recpower}) | even n)"
 | 
| 14450 | 410  | 
(is "?P n")  | 
411  | 
proof cases  | 
|
412  | 
assume even: "even n"  | 
|
| 14473 | 413  | 
then obtain k where "n = 2*k"  | 
| 14450 | 414  | 
by (auto simp add: even_nat_equiv_def2 numeral_2_eq_2)  | 
415  | 
thus ?thesis by (simp add: zero_le_even_power even)  | 
|
416  | 
next  | 
|
417  | 
assume odd: "odd n"  | 
|
| 14473 | 418  | 
then obtain k where "n = Suc(2*k)"  | 
| 14450 | 419  | 
by (auto simp add: odd_nat_equiv_def2 numeral_2_eq_2)  | 
420  | 
thus ?thesis  | 
|
421  | 
by (auto simp add: power_Suc zero_le_mult_iff zero_le_even_power  | 
|
422  | 
dest!: even_power_le_0_imp_0)  | 
|
423  | 
qed  | 
|
424  | 
||
| 
14430
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
425  | 
subsection {* Miscellaneous *}
 | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
426  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
427  | 
lemma even_plus_one_div_two: "even (x::int) ==> (x + 1) div 2 = x div 2"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
428  | 
apply (subst zdiv_zadd1_eq)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
429  | 
apply (simp add: even_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
430  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
431  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
432  | 
lemma odd_plus_one_div_two: "odd (x::int) ==> (x + 1) div 2 = x div 2 + 1"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
433  | 
apply (subst zdiv_zadd1_eq)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
434  | 
apply (simp add: even_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
435  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
436  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
437  | 
lemma div_Suc: "Suc a div c = a div c + Suc 0 div c +  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
438  | 
(a mod c + Suc 0 mod c) div c"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
439  | 
apply (subgoal_tac "Suc a = a + Suc 0")  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
440  | 
apply (erule ssubst)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
441  | 
apply (rule div_add1_eq, simp)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
442  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
443  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
444  | 
lemma even_nat_plus_one_div_two: "even (x::nat) ==>  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
445  | 
(Suc x) div Suc (Suc 0) = x div Suc (Suc 0)"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
446  | 
apply (subst div_Suc)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
447  | 
apply (simp add: even_nat_equiv_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
448  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
449  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
450  | 
lemma odd_nat_plus_one_div_two: "odd (x::nat) ==>  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
451  | 
(Suc x) div Suc (Suc 0) = Suc (x div Suc (Suc 0))"  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
452  | 
apply (subst div_Suc)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
453  | 
apply (simp add: odd_nat_equiv_def)  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
454  | 
done  | 
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
455  | 
|
| 
 
5cb24165a2e1
new material from Avigad, and simplified treatment of division by 0
 
paulson 
parents:  
diff
changeset
 | 
456  | 
end  |