src/HOL/Integ/IntArith.ML
author paulson
Tue, 12 Dec 2000 11:58:44 +0100
changeset 10646 37b9897dbf3a
parent 10490 0054c785f495
child 10702 9e6898befad4
permissions -rw-r--r--
greater use of overloaded rules (order_less_imp_le not zless_imp_zle, ...)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9436
62bb04ab4b01 rearranged setup of arithmetic procedures, avoiding global reference values;
wenzelm
parents: 9269
diff changeset
     1
(*  Title:      HOL/Integ/IntArith.ML
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
     3
    Authors:    Larry Paulson and Tobias Nipkow
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
     4
*)
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
     5
9269
b62d5265b959 added zabs to arith_tac
nipkow
parents: 9214
diff changeset
     6
Goal "abs(abs(x::int)) = abs(x)";
b62d5265b959 added zabs to arith_tac
nipkow
parents: 9214
diff changeset
     7
by(arith_tac 1);
9214
9454f30eacc7 Defined abs on int.
nipkow
parents: 9079
diff changeset
     8
qed "abs_abs";
9454f30eacc7 Defined abs on int.
nipkow
parents: 9079
diff changeset
     9
Addsimps [abs_abs];
9454f30eacc7 Defined abs on int.
nipkow
parents: 9079
diff changeset
    10
9269
b62d5265b959 added zabs to arith_tac
nipkow
parents: 9214
diff changeset
    11
Goal "abs(-(x::int)) = abs(x)";
b62d5265b959 added zabs to arith_tac
nipkow
parents: 9214
diff changeset
    12
by(arith_tac 1);
9214
9454f30eacc7 Defined abs on int.
nipkow
parents: 9079
diff changeset
    13
qed "abs_minus";
9454f30eacc7 Defined abs on int.
nipkow
parents: 9079
diff changeset
    14
Addsimps [abs_minus];
9454f30eacc7 Defined abs on int.
nipkow
parents: 9079
diff changeset
    15
9269
b62d5265b959 added zabs to arith_tac
nipkow
parents: 9214
diff changeset
    16
Goal "abs(x+y) <= abs(x) + abs(y::int)";
b62d5265b959 added zabs to arith_tac
nipkow
parents: 9214
diff changeset
    17
by(arith_tac 1);
b62d5265b959 added zabs to arith_tac
nipkow
parents: 9214
diff changeset
    18
qed "triangle_ineq";
b62d5265b959 added zabs to arith_tac
nipkow
parents: 9214
diff changeset
    19
9214
9454f30eacc7 Defined abs on int.
nipkow
parents: 9079
diff changeset
    20
10228
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    21
(*** Intermediate value theorems ***)
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    22
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    23
Goal "(ALL i<n. abs(f(i+1) - f i) <= #1) --> \
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    24
\     f 0 <= k --> k <= f n --> (EX i <= n. f i = (k::int))";
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    25
by(induct_tac "n" 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    26
 by(Asm_simp_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    27
by(strip_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    28
by(etac impE 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    29
 by(Asm_full_simp_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    30
by(eres_inst_tac [("x","n")] allE 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    31
by(Asm_full_simp_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    32
by(case_tac "k = f(n+1)" 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    33
 by(Force_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    34
by(etac impE 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    35
 by(asm_full_simp_tac (simpset() addsimps [zabs_def] addsplits [split_if_asm]) 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    36
 by(arith_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    37
by(blast_tac (claset() addIs [le_SucI]) 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    38
val lemma = result();
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    39
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    40
bind_thm("nat0_intermed_int_val", rulify_no_asm lemma);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    41
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    42
Goal "[| !i. m <= i & i < n --> abs(f(i+1) - f i) <= #1; m < n; \
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    43
\        f m <= k; k <= f n |] ==> ? i. m <= i & i <= n & f i = (k::int)";
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    44
by(cut_inst_tac [("n","n-m"),("f", "%i. f(i+m)"),("k","k")]lemma 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    45
by(Asm_full_simp_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    46
by(etac impE 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    47
 by(strip_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    48
 by(eres_inst_tac [("x","i+m")] allE 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    49
 by(arith_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    50
by(etac exE 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    51
by(res_inst_tac [("x","i+m")] exI 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    52
by(arith_tac 1);
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    53
qed "nat_intermed_int_val";
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    54
e653cb933293 added intermediate value thms
nipkow
parents: 9633
diff changeset
    55
9063
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    56
(*** Some convenient biconditionals for products of signs ***)
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
    57
9063
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    58
Goal "[| (#0::int) < i; #0 < j |] ==> #0 < i*j";
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    59
by (dtac zmult_zless_mono1 1);
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    60
by Auto_tac; 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    61
qed "zmult_pos";
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
    62
9063
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    63
Goal "[| i < (#0::int); j < #0 |] ==> #0 < i*j";
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    64
by (dtac zmult_zless_mono1_neg 1);
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    65
by Auto_tac; 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    66
qed "zmult_neg";
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
    67
9063
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    68
Goal "[| (#0::int) < i; j < #0 |] ==> i*j < #0";
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    69
by (dtac zmult_zless_mono1_neg 1);
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    70
by Auto_tac; 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    71
qed "zmult_pos_neg";
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
    72
9063
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    73
Goal "((#0::int) < x*y) = (#0 < x & #0 < y | x < #0 & y < #0)";
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    74
by (auto_tac (claset(), 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    75
              simpset() addsimps [order_le_less, linorder_not_less,
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    76
	                          zmult_pos, zmult_neg]));
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    77
by (ALLGOALS (rtac ccontr)); 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    78
by (auto_tac (claset(), 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    79
	      simpset() addsimps [order_le_less, linorder_not_less]));
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    80
by (ALLGOALS (etac rev_mp)); 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    81
by (ALLGOALS (dtac zmult_pos_neg THEN' assume_tac));
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    82
by (auto_tac (claset() addDs [order_less_not_sym], 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    83
              simpset() addsimps [zmult_commute]));  
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    84
qed "int_0_less_mult_iff";
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
    85
9063
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    86
Goal "((#0::int) <= x*y) = (#0 <= x & #0 <= y | x <= #0 & y <= #0)";
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    87
by (auto_tac (claset(), 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    88
              simpset() addsimps [order_le_less, linorder_not_less,  
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    89
                                  int_0_less_mult_iff]));
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    90
qed "int_0_le_mult_iff";
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
    91
9063
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    92
Goal "(x*y < (#0::int)) = (#0 < x & y < #0 | x < #0 & #0 < y)";
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    93
by (auto_tac (claset(), 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    94
              simpset() addsimps [int_0_le_mult_iff, 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    95
                                  linorder_not_le RS sym]));
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    96
by (auto_tac (claset() addDs [order_less_not_sym],  
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    97
              simpset() addsimps [linorder_not_le]));
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
    98
qed "zmult_less_0_iff";
7707
1f4b67fdfdae simprocs now in IntArith;
wenzelm
parents:
diff changeset
    99
9063
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
   100
Goal "(x*y <= (#0::int)) = (#0 <= x & y <= #0 | x <= #0 & #0 <= y)";
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
   101
by (auto_tac (claset() addDs [order_less_not_sym], 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
   102
              simpset() addsimps [int_0_less_mult_iff, 
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
   103
                                  linorder_not_less RS sym]));
0d7628966069 new lemmas for signs of products
paulson
parents: 9000
diff changeset
   104
qed "zmult_le_0_iff";
9509
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   105
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   106
10476
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   107
Goal "abs (x * y) = abs x * abs (y::int)";
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   108
by (simp_tac (simpset () addsplits [zabs_split] addsimps [zmult_less_0_iff, zle_def]) 1);
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   109
qed "abs_mult";
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   110
10490
0054c785f495 abs_eq_0: #0 instead of 0;
wenzelm
parents: 10476
diff changeset
   111
Goal "(abs x = #0) = (x = (#0::int))";
10476
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   112
by (simp_tac (simpset () addsplits [zabs_split]) 1);
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   113
qed "abs_eq_0";
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   114
AddIffs [abs_eq_0];
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   115
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   116
Goal "#0 <= x * (x::int)";
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   117
by (subgoal_tac "(- x) * x <= #0" 1);
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   118
 by (Asm_full_simp_tac 1);
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   119
by (simp_tac (HOL_basic_ss addsimps [zmult_le_0_iff]) 1);
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   120
by Auto_tac;
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   121
qed "square_nonzero";
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   122
Addsimps [square_nonzero];
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   123
AddIs [square_nonzero];
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   124
dbc181a32702 added abs_mult, abs_eq_0, square_nonzero;
wenzelm
parents: 10228
diff changeset
   125
9509
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   126
(*** Products and 1, by T. M. Rasmussen ***)
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   127
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   128
Goal "(m = m*(n::int)) = (n = #1 | m = #0)";
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   129
by Auto_tac;
9633
a71a83253997 better rules for cancellation of common factors across comparisons
paulson
parents: 9509
diff changeset
   130
by (subgoal_tac "m*#1 = m*n" 1);
a71a83253997 better rules for cancellation of common factors across comparisons
paulson
parents: 9509
diff changeset
   131
by (dtac (zmult_cancel1 RS iffD1) 1); 
9509
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   132
by Auto_tac;
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   133
qed "zmult_eq_self_iff";
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   134
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   135
Goal "[| #1 < m; #1 < n |] ==> #1 < m*(n::int)";
10646
37b9897dbf3a greater use of overloaded rules (order_less_imp_le not zless_imp_zle, ...)
paulson
parents: 10490
diff changeset
   136
by (res_inst_tac [("y","#1*n")] order_less_trans 1);
9509
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   137
by (rtac zmult_zless_mono1 2);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   138
by (ALLGOALS Asm_simp_tac);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   139
qed "zless_1_zmult";
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   140
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   141
Goal "[| #0 < n; n ~= #1 |] ==> #1 < (n::int)";
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   142
by (arith_tac 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   143
val lemma = result();
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   144
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   145
Goal "#0 < (m::int) ==> (m * n = #1) = (m = #1 & n = #1)";
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   146
by Auto_tac;
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   147
by (case_tac "m=#1" 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   148
by (case_tac "n=#1" 2);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   149
by (case_tac "m=#1" 4);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   150
by (case_tac "n=#1" 5);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   151
by Auto_tac;
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   152
by distinct_subgoals_tac;
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   153
by (subgoal_tac "#1<m*n" 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   154
by (Asm_full_simp_tac 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   155
by (rtac zless_1_zmult 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   156
by (ALLGOALS (rtac lemma));
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   157
by Auto_tac;  
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   158
by (subgoal_tac "#0<m*n" 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   159
by (Asm_simp_tac 2);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   160
by (dtac (int_0_less_mult_iff RS iffD1) 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   161
by Auto_tac;  
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   162
qed "pos_zmult_eq_1_iff";
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   163
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   164
Goal "(m*n = (#1::int)) = ((m = #1 & n = #1) | (m = #-1 & n = #-1))";
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   165
by (case_tac "#0<m" 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   166
by (asm_simp_tac (simpset() addsimps [pos_zmult_eq_1_iff]) 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   167
by (case_tac "m=#0" 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   168
by (Asm_simp_tac 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   169
by (subgoal_tac "#0 < -m" 1);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   170
by (arith_tac 2);
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   171
by (dres_inst_tac [("n","-n")] pos_zmult_eq_1_iff 1); 
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   172
by Auto_tac;  
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   173
qed "zmult_eq_1_iff";
0f3ee1f89ca8 introduction of integer exponentiation
paulson
parents: 9436
diff changeset
   174