src/ZF/Resid/Substitution.ML
author paulson
Fri, 03 Jan 1997 15:01:55 +0100
changeset 2469 b50b8c0eec01
parent 1732 38776e927da8
child 3734 33f355f56f82
permissions -rw-r--r--
Implicit simpsets and clasets for FOL and ZF
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
     1
(*  Title:      Substitution.ML
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     2
    ID:         $Id$
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
     3
    Author:     Ole Rasmussen
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     4
    Copyright   1995  University of Cambridge
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     5
    Logic Image: ZF
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     6
*)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     7
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     8
open Substitution;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     9
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    10
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    11
(*   Arithmetic extensions                                                   *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    12
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    13
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    14
goal Arith.thy
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    15
    "!!m.[| p < n; n:nat|]==> n~=p";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    16
by (Fast_tac 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    17
val gt_not_eq = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    18
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    19
val succ_pred = prove_goal Arith.thy 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    20
    "!!i.[|j:nat; i:nat|]==> i < j --> succ(j #- 1) = j"
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    21
 (fn prems =>[(etac nat_induct 1),
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    22
              (Fast_tac 1),
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    23
              (Asm_simp_tac 1)]);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    24
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    25
goal Arith.thy 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    26
    "!!i.[|succ(x)<n; n:nat; x:nat|]==> x < n#-1 ";
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
    27
by (rtac succ_leE 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    28
by (forward_tac [nat_into_Ord RS le_refl RS lt_trans] 1 THEN assume_tac 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    29
by (asm_simp_tac (!simpset addsimps [succ_pred]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    30
val lt_pred = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    31
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    32
goal Arith.thy 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    33
    "!!i.[|n < succ(x); p<n; p:nat; n:nat; x:nat|]==> n#-1 < x ";
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
    34
by (rtac succ_leE 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    35
by (asm_simp_tac (!simpset addsimps [succ_pred]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    36
val gt_pred = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    37
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    38
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    39
Addsimps [nat_into_Ord, not_lt_iff_le, if_P, if_not_P];
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    40
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    41
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    42
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    43
(*     lift_rec equality rules                                               *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    44
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    45
goalw Substitution.thy [lift_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    46
    "!!n.[|n:nat; i:nat|]==> lift_rec(Var(i),n) =if(i<n,Var(i),Var(succ(i)))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    47
by (Asm_full_simp_tac 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    48
val lift_rec_Var = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    49
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    50
goalw Substitution.thy [lift_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    51
    "!!n.[|n:nat; i:nat; k:nat; k le i|]==> lift_rec(Var(i),k) = Var(succ(i))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    52
by (Asm_full_simp_tac 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    53
val lift_rec_le = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    54
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    55
goalw Substitution.thy [lift_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    56
    "!!n.[|i:nat; k:nat; i<k |]==> lift_rec(Var(i),k) = Var(i)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    57
by (Asm_full_simp_tac 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    58
val lift_rec_gt = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    59
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    60
goalw Substitution.thy [lift_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    61
    "!!n.[|n:nat; k:nat|]==>   \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    62
\        lift_rec(Fun(t),k) = Fun(lift_rec(t,succ(k)))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    63
by (Asm_full_simp_tac 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    64
val lift_rec_Fun = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    65
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    66
goalw Substitution.thy [lift_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    67
    "!!n.[|n:nat; k:nat|]==>   \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    68
\        lift_rec(App(b,f,a),k) = App(b,lift_rec(f,k),lift_rec(a,k))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    69
by (Asm_full_simp_tac 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    70
val lift_rec_App = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    71
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    72
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    73
(*    substitution quality rules                                             *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    74
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    75
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    76
goalw Substitution.thy [subst_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    77
    "!!n.[|i:nat; k:nat; u:redexes|]==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    78
\        subst_rec(u,Var(i),k) = if(k<i,Var(i#-1),if(k=i,u,Var(i)))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    79
by (asm_full_simp_tac (!simpset addsimps [gt_not_eq,leI]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    80
val subst_Var = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    81
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    82
goalw Substitution.thy [subst_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    83
    "!!n.[|n:nat; u:redexes|]==> subst_rec(u,Var(n),n) = u";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    84
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    85
val subst_eq = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    86
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    87
goalw Substitution.thy [subst_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    88
    "!!n.[|n:nat; u:redexes; p:nat; p<n|]==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    89
\        subst_rec(u,Var(n),p) = Var(n#-1)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    90
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    91
val subst_gt = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    92
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    93
goalw Substitution.thy [subst_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    94
    "!!n.[|n:nat; u:redexes; p:nat; n<p|]==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    95
\        subst_rec(u,Var(n),p) = Var(n)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    96
by (asm_full_simp_tac (!simpset addsimps [gt_not_eq,leI]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    97
val subst_lt = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    98
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    99
goalw Substitution.thy [subst_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   100
    "!!n.[|p:nat; u:redexes|]==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   101
\        subst_rec(u,Fun(t),p) = Fun(subst_rec(lift(u),t,succ(p))) ";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   102
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   103
val subst_Fun = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   104
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   105
goalw Substitution.thy [subst_rec_def] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   106
    "!!n.[|p:nat; u:redexes|]==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   107
\        subst_rec(u,App(b,f,a),p) = App(b,subst_rec(u,f,p),subst_rec(u,a,p))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   108
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   109
val subst_App = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   110
1723
286f9b6370ab Replaced split_tac by split_inside_tac.
berghofe
parents: 1461
diff changeset
   111
fun addsplit ss = (ss setloop (split_inside_tac [expand_if]) 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
   112
                addsimps [lift_rec_Var,subst_Var]);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   113
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   114
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   115
goal Substitution.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   116
    "!!n.u:redexes ==> ALL k:nat.lift_rec(u,k):redexes";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   117
by (eresolve_tac [redexes.induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   118
by (ALLGOALS(asm_full_simp_tac 
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   119
    ((addsplit (!simpset)) addsimps [lift_rec_Fun,lift_rec_App])));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   120
val lift_rec_type_a = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   121
val lift_rec_type = lift_rec_type_a RS bspec;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   122
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   123
goalw Substitution.thy [] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   124
    "!!n.v:redexes ==>  ALL n:nat.ALL u:redexes.subst_rec(u,v,n):redexes";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   125
by (eresolve_tac [redexes.induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   126
by (ALLGOALS(asm_full_simp_tac 
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   127
    ((addsplit (!simpset)) addsimps [subst_Fun,subst_App,
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
   128
                       lift_rec_type])));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   129
val subst_type_a = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   130
val subst_type = subst_type_a RS bspec RS bspec;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   131
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   132
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   133
Addsimps [subst_eq, subst_gt, subst_lt, subst_Fun, subst_App, subst_type,
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   134
	  lift_rec_le, lift_rec_gt, lift_rec_Fun, lift_rec_App,
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   135
	  lift_rec_type];
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   136
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   137
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   138
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   139
(*    lift and  substitution proofs                                          *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   140
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   141
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   142
goalw Substitution.thy [] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   143
    "!!n.u:redexes ==> ALL n:nat.ALL i:nat.i le n -->   \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   144
\       (lift_rec(lift_rec(u,i),succ(n)) = lift_rec(lift_rec(u,n),i))";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   145
by ((eresolve_tac [redexes.induct] 1)
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   146
    THEN (ALLGOALS Asm_simp_tac));
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   147
by (step_tac (!claset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   148
by (excluded_middle_tac "na < xa" 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   149
by ((forward_tac [lt_trans2] 2) THEN (assume_tac 2));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   150
by (ALLGOALS(asm_full_simp_tac 
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   151
    ((addsplit (!simpset)) addsimps [leI])));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   152
val lift_lift_rec = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   153
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   154
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   155
goalw Substitution.thy [] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   156
    "!!n.[|u:redexes; n:nat|]==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   157
\      lift_rec(lift(u),succ(n)) = lift(lift_rec(u,n))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   158
by (asm_simp_tac (!simpset addsimps [lift_lift_rec]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   159
val lift_lift = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   160
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   161
goal Substitution.thy 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   162
    "!!n.v:redexes ==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   163
\      ALL n:nat.ALL m:nat.ALL u:redexes.n le m-->\
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   164
\         lift_rec(subst_rec(u,v,n),m) = \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   165
\              subst_rec(lift_rec(u,m),lift_rec(v,succ(m)),n)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   166
by ((eresolve_tac [redexes.induct] 1)
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   167
    THEN (ALLGOALS(asm_simp_tac (!simpset addsimps [lift_lift]))));
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   168
by (step_tac (!claset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   169
by (excluded_middle_tac "na < x" 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   170
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   171
by (eres_inst_tac [("j","na")] leE 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   172
by (asm_full_simp_tac ((addsplit (!simpset)) 
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   173
                        addsimps [leI,gt_pred,succ_pred]) 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   174
by (hyp_subst_tac 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   175
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   176
by (forw_inst_tac [("j","x")] lt_trans2 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   177
by (assume_tac 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   178
by (asm_full_simp_tac (!simpset addsimps [leI]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   179
val lift_rec_subst_rec = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   180
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   181
goalw Substitution.thy [] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   182
    "!!n.[|v:redexes; u:redexes; n:nat|]==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   183
\        lift_rec(u/v,n) = lift_rec(u,n)/lift_rec(v,succ(n))";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   184
by (asm_full_simp_tac (!simpset addsimps [lift_rec_subst_rec]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   185
val lift_subst = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   186
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   187
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   188
goalw Substitution.thy [] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   189
    "!!n.v:redexes ==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   190
\      ALL n:nat.ALL m:nat.ALL u:redexes.m le n-->\
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   191
\         lift_rec(subst_rec(u,v,n),m) = \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   192
\              subst_rec(lift_rec(u,m),lift_rec(v,m),succ(n))";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   193
by ((eresolve_tac [redexes.induct] 1)
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   194
    THEN (ALLGOALS(asm_simp_tac (!simpset addsimps [lift_lift]))));
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   195
by (step_tac (!claset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   196
by (excluded_middle_tac "na < x" 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   197
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   198
by (eres_inst_tac [("i","x")] leE 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   199
by (forward_tac  [lt_trans1] 1 THEN assume_tac 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   200
by (ALLGOALS(asm_full_simp_tac 
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   201
             (!simpset addsimps [succ_pred,leI,gt_pred])));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   202
by (hyp_subst_tac 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   203
by (asm_full_simp_tac (!simpset addsimps [leI]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   204
by (excluded_middle_tac "na < xa" 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   205
by (asm_full_simp_tac (!simpset) 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   206
by (asm_full_simp_tac (!simpset addsimps [leI]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   207
val lift_rec_subst_rec_lt = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   208
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   209
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   210
goalw Substitution.thy [] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   211
    "!!n.u:redexes ==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   212
\       ALL n:nat.ALL v:redexes.subst_rec(v,lift_rec(u,n),n) =  u";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   213
by ((eresolve_tac [redexes.induct] 1)
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   214
    THEN (ALLGOALS Asm_simp_tac));
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   215
by (step_tac (!claset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   216
by (excluded_middle_tac "na < x" 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   217
(* x <= na  *)
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   218
by (asm_full_simp_tac (!simpset) 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   219
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   220
val subst_rec_lift_rec = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   221
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   222
goal Substitution.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   223
    "!!n.v:redexes ==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   224
\       ALL m:nat.ALL n:nat.ALL u:redexes.ALL w:redexes.m le  n --> \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   225
\    subst_rec(subst_rec(w,u,n),subst_rec(lift_rec(w,m),v,succ(n)),m)=\
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   226
\    subst_rec(w,subst_rec(u,v,m),n)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   227
by ((eresolve_tac [redexes.induct] 1) THEN 
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   228
     (ALLGOALS(asm_simp_tac (!simpset addsimps 
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   229
                             [lift_lift RS sym,lift_rec_subst_rec_lt]))));
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   230
by (step_tac (!claset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   231
by (excluded_middle_tac "na  le succ(xa)" 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   232
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   233
by (forward_tac [nat_into_Ord RS le_refl RS lt_trans] 1 THEN assume_tac 1);
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
   234
by (etac leE 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   235
by (asm_simp_tac (!simpset addsimps [succ_pred,lt_pred]) 2);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   236
by (forward_tac [succ_leI RS lt_trans] 1 THEN assume_tac 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   237
by (forw_inst_tac [("i","x")] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   238
    (nat_into_Ord RS le_refl RS lt_trans) 1 THEN assume_tac 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   239
by (asm_simp_tac (!simpset addsimps [succ_pred,lt_pred]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   240
by (eres_inst_tac [("i","na")] leE 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   241
by (asm_full_simp_tac 
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   242
    (!simpset addsimps [succ_pred,subst_rec_lift_rec,leI]) 2);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   243
by (excluded_middle_tac "na < x" 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   244
by (asm_full_simp_tac (!simpset) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   245
by (eres_inst_tac [("j","na")] leE 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   246
by (asm_simp_tac (!simpset addsimps [gt_pred]) 1);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   247
by (asm_simp_tac (!simpset addsimps [subst_rec_lift_rec]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   248
by (forward_tac [lt_trans2] 1 THEN assume_tac 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   249
by (asm_simp_tac (!simpset addsimps [gt_pred]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   250
val subst_rec_subst_rec = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   251
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   252
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   253
goalw Substitution.thy [] 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   254
    "!!n.[|v:redexes; u:redexes; w:redexes; n:nat|]==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   255
\       subst_rec(w,u,n)/subst_rec(lift(w),v,succ(n)) = subst_rec(w,u/v,n)";
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   256
by (asm_simp_tac (!simpset addsimps [subst_rec_subst_rec]) 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   257
val substitution = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   258
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   259
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   260
(*          Preservation lemmas                                              *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   261
(*          Substitution preserves comp and regular                          *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   262
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   263
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   264
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   265
goal Substitution.thy
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   266
    "!!n.[|n:nat; u ~ v|]==> ALL m:nat.lift_rec(u,m) ~ lift_rec(v,m)";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1723
diff changeset
   267
by (etac Scomp.induct 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   268
by (ALLGOALS(asm_simp_tac (!simpset addsimps [comp_refl])));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   269
val lift_rec_preserve_comp = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   270
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   271
goal Substitution.thy
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   272
    "!!n.u2 ~ v2 ==> ALL m:nat.ALL u1:redexes.ALL v1:redexes.\
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   273
\            u1 ~ v1--> subst_rec(u1,u2,m) ~ subst_rec(v1,v2,m)";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1723
diff changeset
   274
by (etac Scomp.induct 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   275
by (ALLGOALS(asm_full_simp_tac ((addsplit (!simpset)) addsimps 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
   276
            ([lift_rec_preserve_comp,comp_refl]))));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   277
val subst_rec_preserve_comp = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   278
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   279
goal Substitution.thy
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   280
    "!!n.regular(u) ==> ALL m:nat.regular(lift_rec(u,m))";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   281
by (eresolve_tac [Sreg.induct] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   282
by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset))));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   283
val lift_rec_preserve_reg = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   284
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   285
goal Substitution.thy
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   286
    "!!n.regular(v) ==>  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   287
\       ALL m:nat.ALL u:redexes.regular(u)-->regular(subst_rec(u,v,m))";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   288
by (eresolve_tac [Sreg.induct] 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
   289
by (ALLGOALS(asm_full_simp_tac ((addsplit (!simpset)) addsimps 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
   290
            [lift_rec_preserve_reg])));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   291
val subst_rec_preserve_reg = result();