src/HOL/Hoare/Arith2.ML
author wenzelm
Mon, 22 Jun 1998 17:26:46 +0200
changeset 5069 3ea049f7979d
parent 4359 6f2986464280
child 5118 6b995dad8a9d
permissions -rw-r--r--
isatool fixgoal;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1335
diff changeset
     1
(*  Title:      HOL/Hoare/Arith2.ML
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1335
diff changeset
     3
    Author:     Norbert Galm
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     4
    Copyright   1995 TUM
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     5
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     6
More arithmetic lemmas.
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     7
*)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     8
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     9
open Arith2;
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    10
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    11
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    12
(*** HOL lemmas ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    13
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    14
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    15
val [prem1,prem2]=goal HOL.thy "[|~P ==> ~Q; Q|] ==> P";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    16
by (cut_facts_tac [prem1 COMP impI,prem2] 1);
1875
54c0462f8fb2 Classical tactics now use default claset.
berghofe
parents: 1714
diff changeset
    17
by (Fast_tac 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    18
val not_imp_swap=result();
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    19
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    20
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    21
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    22
(*** cd ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    23
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    24
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    25
val prems=goalw thy [cd_def] "0<n ==> cd n n n";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    26
by (cut_facts_tac prems 1);
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    27
by (Asm_simp_tac 1);
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    28
qed "cd_nnn";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    29
3372
6e472c8f0011 Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
paulson
parents: 3343
diff changeset
    30
val prems=goalw thy [cd_def] "[| cd x m n; 0<m; 0<n |] ==> x<=m & x<=n";
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    31
by (cut_facts_tac prems 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3842
diff changeset
    32
by (blast_tac (claset() addIs [dvd_imp_le]) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    33
qed "cd_le";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    34
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    35
val prems=goalw thy [cd_def] "cd x m n = cd x n m";
1875
54c0462f8fb2 Classical tactics now use default claset.
berghofe
parents: 1714
diff changeset
    36
by (Fast_tac 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    37
qed "cd_swap";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    38
3372
6e472c8f0011 Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
paulson
parents: 3343
diff changeset
    39
val prems=goalw thy [cd_def] "n<=m ==> cd x m n = cd x (m-n) n";
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    40
by (cut_facts_tac prems 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3842
diff changeset
    41
by (blast_tac (claset() addIs [dvd_diff] addDs [dvd_diffD]) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    42
qed "cd_diff_l";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    43
3372
6e472c8f0011 Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
paulson
parents: 3343
diff changeset
    44
val prems=goalw thy [cd_def] "m<=n ==> cd x m n = cd x m (n-m)";
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    45
by (cut_facts_tac prems 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3842
diff changeset
    46
by (blast_tac (claset() addIs [dvd_diff] addDs [dvd_diffD]) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    47
qed "cd_diff_r";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    48
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    49
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    50
(*** gcd ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    51
5069
3ea049f7979d isatool fixgoal;
wenzelm
parents: 4359
diff changeset
    52
Goalw [gcd_def] "!!n. 0<n ==> n = gcd n n";
3372
6e472c8f0011 Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
paulson
parents: 3343
diff changeset
    53
by (forward_tac [cd_nnn] 1);
2031
03a843f0f447 Ran expandshort
paulson
parents: 1875
diff changeset
    54
by (rtac (select_equality RS sym) 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3842
diff changeset
    55
by (blast_tac (claset() addDs [cd_le]) 1);
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3842
diff changeset
    56
by (blast_tac (claset() addIs [le_anti_sym] addDs [cd_le]) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    57
qed "gcd_nnn";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    58
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    59
val prems = goalw thy [gcd_def] "gcd m n = gcd n m";
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3842
diff changeset
    60
by (simp_tac (simpset() addsimps [cd_swap]) 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    61
qed "gcd_swap";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    62
3372
6e472c8f0011 Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
paulson
parents: 3343
diff changeset
    63
val prems=goalw thy [gcd_def] "n<=m ==> gcd m n = gcd (m-n) n";
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    64
by (cut_facts_tac prems 1);
3842
b55686a7b22c fixed dots;
wenzelm
parents: 3372
diff changeset
    65
by (subgoal_tac "n<=m ==> !x. cd x m n = cd x (m-n) n" 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    66
by (Asm_simp_tac 1);
2031
03a843f0f447 Ran expandshort
paulson
parents: 1875
diff changeset
    67
by (rtac allI 1);
03a843f0f447 Ran expandshort
paulson
parents: 1875
diff changeset
    68
by (etac cd_diff_l 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    69
qed "gcd_diff_l";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    70
3372
6e472c8f0011 Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
paulson
parents: 3343
diff changeset
    71
val prems=goalw thy [gcd_def] "m<=n ==> gcd m n = gcd m (n-m)";
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    72
by (cut_facts_tac prems 1);
3842
b55686a7b22c fixed dots;
wenzelm
parents: 3372
diff changeset
    73
by (subgoal_tac "m<=n ==> !x. cd x m n = cd x m (n-m)" 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    74
by (Asm_simp_tac 1);
2031
03a843f0f447 Ran expandshort
paulson
parents: 1875
diff changeset
    75
by (rtac allI 1);
03a843f0f447 Ran expandshort
paulson
parents: 1875
diff changeset
    76
by (etac cd_diff_r 1);
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    77
qed "gcd_diff_r";
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    78
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    79
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    80
(*** pow ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    81
4359
6f2986464280 Simplified proofs.
nipkow
parents: 4089
diff changeset
    82
val prems = goal Power.thy "m mod 2 = 0 ==> ((n::nat)*n)^(m div 2) = n^m";
6f2986464280 Simplified proofs.
nipkow
parents: 4089
diff changeset
    83
by (subgoal_tac "n*n=n^2" 1);
6f2986464280 Simplified proofs.
nipkow
parents: 4089
diff changeset
    84
by (etac ssubst 1);
6f2986464280 Simplified proofs.
nipkow
parents: 4089
diff changeset
    85
by (stac (power_mult RS sym) 1);
6f2986464280 Simplified proofs.
nipkow
parents: 4089
diff changeset
    86
by (stac mult_div_cancel 1);
6f2986464280 Simplified proofs.
nipkow
parents: 4089
diff changeset
    87
by (ALLGOALS(simp_tac (simpset() addsimps prems)));
6f2986464280 Simplified proofs.
nipkow
parents: 4089
diff changeset
    88
qed "sq_pow_div2";
6f2986464280 Simplified proofs.
nipkow
parents: 4089
diff changeset
    89
Addsimps [sq_pow_div2];