src/FOL/ex/Nat2.ML
author paulson
Fri, 03 Jan 1997 15:01:55 +0100
changeset 2469 b50b8c0eec01
parent 1959 58f8379eca73
child 4091 771b1f6422a8
permissions -rw-r--r--
Implicit simpsets and clasets for FOL and ZF
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1459
d12da312eff4 expanded tabs
clasohm
parents: 755
diff changeset
     1
(*  Title:      FOL/ex/nat2.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1459
d12da312eff4 expanded tabs
clasohm
parents: 755
diff changeset
     3
    Author:     Tobias Nipkow
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1991  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
For ex/nat.thy.  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
Examples of simplification and induction on the natural numbers
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
open Nat2;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    12
Addsimps [pred_0, pred_succ, plus_0, plus_succ, 
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    13
	  nat_distinct1, nat_distinct2, succ_inject,
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    14
	  leq_0, leq_succ_succ, leq_succ_0, 
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    15
	  lt_0_succ, lt_succ_succ, lt_0];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
val prems = goal Nat2.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
    "[| P(0);  !!x. P(succ(x)) |] ==> All(P)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
by (rtac nat_ind 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
by (REPEAT (resolve_tac (prems@[allI,impI]) 1));
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    22
qed "nat_exh";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
goal Nat2.thy "~ n=succ(n)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    25
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
goal Nat2.thy "~ succ(n)=n";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    29
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
goal Nat2.thy "~ succ(succ(n))=n";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    33
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
goal Nat2.thy "~ n=succ(succ(n))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    37
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
goal Nat2.thy "m+0 = m";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    41
by (IND_TAC nat_ind Simp_tac "m" 1);
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    42
qed "plus_0_right";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
goal Nat2.thy "m+succ(n) = succ(m+n)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    45
by (IND_TAC nat_ind Simp_tac "m" 1);
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    46
qed "plus_succ_right";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    48
Addsimps [plus_0_right, plus_succ_right];
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    49
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
goal Nat2.thy "~n=0 --> m+pred(n) = pred(m+n)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    51
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
goal Nat2.thy "~n=0 --> succ(pred(n))=n";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    55
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
goal Nat2.thy "m+n=0 <-> m=0 & n=0";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    59
by (IND_TAC nat_ind Simp_tac "m" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
goal Nat2.thy "m <= n --> m <= succ(n)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    63
by (IND_TAC nat_ind Simp_tac "m" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
by (rtac (impI RS allI) 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    65
by (ALL_IND_TAC nat_ind Simp_tac 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    66
by (Fast_tac 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    67
bind_thm("le_imp_le_succ", result() RS mp);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
goal Nat2.thy "n<succ(n)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    70
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
goal Nat2.thy "~ n<n";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    74
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
goal Nat2.thy "m < n --> m < succ(n)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    78
by (IND_TAC nat_ind Simp_tac "m" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
by (rtac (impI RS allI) 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    80
by (ALL_IND_TAC nat_ind Simp_tac 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    81
by (Fast_tac 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
goal Nat2.thy "m <= n --> m <= n+k";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    85
by (IND_TAC nat_ind (simp_tac (!simpset addsimps [le_imp_le_succ]))
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
     "k" 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
    87
qed "le_plus";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
goal Nat2.thy "succ(m) <= n --> m <= n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
by (res_inst_tac [("x","n")]spec 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    91
by (ALL_IND_TAC nat_exh (simp_tac (!simpset addsimps [le_imp_le_succ])) 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
    92
qed "succ_le";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
goal Nat2.thy "~m<n <-> n<=m";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    95
by (IND_TAC nat_ind Simp_tac "n" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
by (rtac (impI RS allI) 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
    97
by (ALL_IND_TAC nat_ind Asm_simp_tac 1);
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    98
qed "not_less";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
goal Nat2.thy "n<=m --> ~m<n";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   101
by (simp_tac (!simpset addsimps [not_less]) 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   102
qed "le_imp_not_less";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
goal Nat2.thy "m<n --> ~n<=m";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   105
by (cut_facts_tac [not_less] 1 THEN Fast_tac 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   106
qed "not_le";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
goal Nat2.thy "m+k<=n --> m<=n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
by (IND_TAC nat_ind (K all_tac) "k" 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   110
by (Simp_tac 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
by (rtac (impI RS allI) 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   112
by (Simp_tac 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
by (REPEAT (resolve_tac [allI,impI] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
by (cut_facts_tac [succ_le] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   115
by (Fast_tac 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   116
qed "plus_le";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
val prems = goal Nat2.thy "[| ~m=0;  m <= n |] ==> ~n=0";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
by (cut_facts_tac prems 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
by (REPEAT (etac rev_mp 1));
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   121
by (IND_TAC nat_exh Simp_tac "m" 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   122
by (ALL_IND_TAC nat_exh Simp_tac 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   123
qed "not0";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
goal Nat2.thy "a<=a' & b<=b' --> a+b<=a'+b'";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   126
by (IND_TAC nat_ind (simp_tac (!simpset addsimps [le_plus])) "b" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
by (resolve_tac [impI RS allI] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
by (resolve_tac [allI RS allI] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   129
by (ALL_IND_TAC nat_exh Asm_simp_tac 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   130
qed "plus_le_plus";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
goal Nat2.thy "i<=j --> j<=k --> i<=k";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
by (IND_TAC nat_ind (K all_tac) "i" 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   134
by (Simp_tac 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
by (resolve_tac [impI RS allI] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   136
by (ALL_IND_TAC nat_exh Simp_tac 1);
1959
58f8379eca73 Modified proof to work with miniscoping
paulson
parents: 1662
diff changeset
   137
by (resolve_tac [impI] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   138
by (ALL_IND_TAC nat_exh Simp_tac 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   139
by (Fast_tac 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   140
qed "le_trans";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
goal Nat2.thy "i < j --> j <=k --> i < k";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
by (IND_TAC nat_ind (K all_tac) "j" 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   144
by (Simp_tac 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
by (resolve_tac [impI RS allI] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   146
by (ALL_IND_TAC nat_exh Simp_tac 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   147
by (ALL_IND_TAC nat_exh Simp_tac 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   148
by (ALL_IND_TAC nat_exh Simp_tac 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   149
by (Fast_tac 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   150
qed "less_le_trans";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
goal Nat2.thy "succ(i) <= j <-> i < j";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   153
by (IND_TAC nat_ind Simp_tac "j" 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
by (resolve_tac [impI RS allI] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   155
by (ALL_IND_TAC nat_exh Asm_simp_tac 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   156
qed "succ_le2";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
goal Nat2.thy "i<succ(j) <-> i=j | i<j";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   159
by (IND_TAC nat_ind Simp_tac "j" 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   160
by (ALL_IND_TAC nat_exh Simp_tac 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
by (resolve_tac [impI RS allI] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   162
by (ALL_IND_TAC nat_exh Simp_tac 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1959
diff changeset
   163
by (Asm_simp_tac 1);
755
dfb3894d78e4 replaced "val ... = result()" by "qed ..."
clasohm
parents: 725
diff changeset
   164
qed "less_succ";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165