src/FOL/ex/Nat2.ML
author clasohm
Mon, 21 Nov 1994 14:11:21 +0100
changeset 725 d9c629fbacc6
parent 0 a5a9c433f639
child 755 dfb3894d78e4
permissions -rw-r--r--
replaced 'val ... = result();' by 'qed "...";'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	FOL/ex/nat2.ML
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Tobias Nipkow
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
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
val nat_rews = [pred_0, pred_succ, plus_0, plus_succ, 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
		    nat_distinct1, nat_distinct2, succ_inject,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
		    leq_0,leq_succ_succ,leq_succ_0, 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
		    lt_0_succ,lt_succ_succ,lt_0];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
val nat_ss = FOL_ss addsimps nat_rews;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
val prems = goal Nat2.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
    "[| P(0);  !!x. P(succ(x)) |] ==> All(P)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
by (rtac nat_ind 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
by (REPEAT (resolve_tac (prems@[allI,impI]) 1));
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    23
qed "nat_exh";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
goal Nat2.thy "~ n=succ(n)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
by (IND_TAC nat_ind (simp_tac nat_ss) "n" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
goal Nat2.thy "~ succ(n)=n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
by (IND_TAC nat_ind (simp_tac nat_ss) "n" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
goal Nat2.thy "~ succ(succ(n))=n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
by (IND_TAC nat_ind (simp_tac nat_ss) "n" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
goal Nat2.thy "~ n=succ(succ(n))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
by (IND_TAC nat_ind (simp_tac nat_ss) "n" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
goal Nat2.thy "m+0 = m";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
by (IND_TAC nat_ind (simp_tac nat_ss) "m" 1);
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    43
qed "plus_0_right";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
goal Nat2.thy "m+succ(n) = succ(m+n)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
by (IND_TAC nat_ind (simp_tac nat_ss) "m" 1);
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    47
qed "plus_succ_right";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
goal Nat2.thy "~n=0 --> m+pred(n) = pred(m+n)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
by (IND_TAC nat_ind (simp_tac (nat_ss addsimps [plus_succ_right])) "n" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
goal Nat2.thy "~n=0 --> succ(pred(n))=n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
by (IND_TAC nat_ind (simp_tac nat_ss) "n" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
goal Nat2.thy "m+n=0 <-> m=0 & n=0";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
by (IND_TAC nat_ind (simp_tac nat_ss) "m" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
goal Nat2.thy "m <= n --> m <= succ(n)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
by (IND_TAC nat_ind (simp_tac nat_ss) "m" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
by (rtac (impI RS allI) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
by (ALL_IND_TAC nat_ind (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
by (fast_tac FOL_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
val le_imp_le_succ = result() RS mp;
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    67
store_thm("le_imp_le_succ", le_imp_le_succ);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
goal Nat2.thy "n<succ(n)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
by (IND_TAC nat_ind (simp_tac nat_ss) "n" 1);
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";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
by (IND_TAC nat_ind (simp_tac nat_ss) "n" 1);
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)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
by (IND_TAC nat_ind (simp_tac nat_ss) "m" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
by (rtac (impI RS allI) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
by (ALL_IND_TAC nat_ind (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
by (fast_tac FOL_cs 1);
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";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
by (IND_TAC nat_ind 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
    (simp_tac (nat_ss addsimps [plus_0_right, plus_succ_right, le_imp_le_succ]))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
     "k" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
val le_plus = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
goal Nat2.thy "succ(m) <= n --> m <= n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
by (res_inst_tac [("x","n")]spec 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
by (ALL_IND_TAC nat_exh (simp_tac (nat_ss addsimps [le_imp_le_succ])) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
val succ_le = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
goal Nat2.thy "~m<n <-> n<=m";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
by (IND_TAC nat_ind (simp_tac nat_ss) "n" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
by (rtac (impI RS allI) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
by (ALL_IND_TAC nat_ind (asm_simp_tac nat_ss) 1);
725
d9c629fbacc6 replaced 'val ... = result();' by 'qed "...";'
clasohm
parents: 0
diff changeset
    99
qed "not_less";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
goal Nat2.thy "n<=m --> ~m<n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
by (simp_tac (nat_ss addsimps [not_less]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
val le_imp_not_less = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
goal Nat2.thy "m<n --> ~n<=m";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
by (cut_facts_tac [not_less] 1 THEN fast_tac FOL_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
val not_le = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
goal Nat2.thy "m+k<=n --> m<=n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
by (IND_TAC nat_ind (K all_tac) "k" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
by (simp_tac (nat_ss addsimps [plus_0_right]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
by (rtac (impI RS allI) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
by (simp_tac (nat_ss addsimps [plus_succ_right]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
by (REPEAT (resolve_tac [allI,impI] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
by (cut_facts_tac [succ_le] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
by (fast_tac FOL_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
val plus_le = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
val prems = goal Nat2.thy "[| ~m=0;  m <= n |] ==> ~n=0";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
by (cut_facts_tac prems 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
by (REPEAT (etac rev_mp 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
by (IND_TAC nat_exh (simp_tac nat_ss) "m" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
by (ALL_IND_TAC nat_exh (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
val not0 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
goal Nat2.thy "a<=a' & b<=b' --> a+b<=a'+b'";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
by (IND_TAC nat_ind (simp_tac (nat_ss addsimps [plus_0_right,le_plus])) "b" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
by (resolve_tac [impI RS allI] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
by (resolve_tac [allI RS allI] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
by (ALL_IND_TAC nat_exh (asm_simp_tac (nat_ss addsimps [plus_succ_right])) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
val plus_le_plus = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
goal Nat2.thy "i<=j --> j<=k --> i<=k";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
by (IND_TAC nat_ind (K all_tac) "i" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
by (simp_tac nat_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
by (resolve_tac [impI RS allI] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
by (ALL_IND_TAC nat_exh (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
by (ALL_IND_TAC nat_exh (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
by (fast_tac FOL_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
val le_trans = result();
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);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
by (simp_tac nat_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
by (resolve_tac [impI RS allI] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
by (ALL_IND_TAC nat_exh (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
by (ALL_IND_TAC nat_exh (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
by (ALL_IND_TAC nat_exh (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
by (fast_tac FOL_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
val less_le_trans = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
goal Nat2.thy "succ(i) <= j <-> i < j";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
by (IND_TAC nat_ind (simp_tac nat_ss) "j" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
by (resolve_tac [impI RS allI] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
by (ALL_IND_TAC nat_exh (asm_simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
val succ_le = result();
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";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
by (IND_TAC nat_ind (simp_tac nat_ss) "j" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
by (ALL_IND_TAC nat_exh (simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
by (resolve_tac [impI RS allI] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
by (ALL_IND_TAC nat_exh (asm_simp_tac nat_ss) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
val less_succ = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164