src/ZF/Resid/Reduction.ML
author lcp
Thu, 13 Apr 1995 15:38:07 +0200
changeset 1048 5ba0314f8214
child 1461 6bcb44e4d6e5
permissions -rw-r--r--
New example by Ole Rasmussen
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     1
(*  Title: 	Reduction.ML
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     2
    ID:         $Id$
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
     3
    Author: 	Ole Rasmussen
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 Reduction;
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
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    12
(*     Setting up rulelists for reduction                                    *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    13
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    14
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    15
val red1D1     = Sred1.dom_subset RS subsetD RS SigmaD1;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    16
val red1D2     = Sred1.dom_subset RS subsetD RS SigmaD2;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    17
val redD1      = Sred.dom_subset RS subsetD RS SigmaD1;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    18
val redD2      = Sred.dom_subset RS subsetD RS SigmaD2;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    19
val par_red1D1 = Spar_red1.dom_subset RS subsetD RS SigmaD1;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    20
val par_red1D2 = Spar_red1.dom_subset RS subsetD RS SigmaD2;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    21
val par_redD1  = Spar_red.dom_subset RS subsetD RS SigmaD1;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    22
val par_redD2  = Spar_red.dom_subset RS subsetD RS SigmaD2;
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    23
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    24
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    25
val reduc_cs = res_cs 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    26
           addIs (Sred1.intrs@[Sred.one_step,Sred.refl]@Spar_red1.intrs@
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    27
		  [Spar_red.one_step,lambda.dom_subset RS subsetD,
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    28
		   unmark_type]@lambda.intrs@bool_typechecks)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    29
           addSEs [Spar_red1.mk_cases redexes.con_defs "Fun(t) =1=> Fun(u)"];
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    30
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    31
val reduc_ss = term_ss addsimps
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    32
                   (Sred1.intrs@[Sred.one_step,Sred.refl]@Spar_red1.intrs@
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    33
		    [Spar_red.one_step,substL_type,redD1,redD2,par_redD1,
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    34
		     par_redD2,par_red1D2,unmark_type]);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    35
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    36
val reducL_ss = reduc_ss setloop (SELECT_GOAL (safe_tac reduc_cs));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    37
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    38
val red1_induct     = Sred1.mutual_induct RS spec RS spec RSN (2,rev_mp);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    39
val red_induct      = Sred.mutual_induct RS spec RS spec RSN (2,rev_mp);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    40
val par_red1_induct = Spar_red1.mutual_induct RS spec RS spec RSN (2,rev_mp);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    41
val par_red_induct  = Spar_red.mutual_induct RS spec RS spec RSN (2,rev_mp);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    42
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    43
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    44
(*     Lemmas for reduction                                                  *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    45
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    46
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    47
goal Reduction.thy  "!!u. m--->n ==> Fun(m) ---> Fun(n)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    48
by (eresolve_tac [red_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    49
by (resolve_tac [Sred.trans] 3);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    50
by (ALLGOALS (asm_simp_tac reduc_ss ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    51
val red_Fun = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    52
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    53
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    54
    "!!u.[|n:lambda; m ---> m'|]==> Apl(m,n)--->Apl(m',n)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    55
by (eresolve_tac [red_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    56
by (resolve_tac [Sred.trans] 3);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    57
by (ALLGOALS (asm_simp_tac reduc_ss ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    58
val red_Apll = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    59
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    60
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    61
    "!!u.[|n:lambda; m ---> m'|]==> Apl(n,m)--->Apl(n,m')";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    62
by (eresolve_tac [red_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    63
by (resolve_tac [Sred.trans] 3);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    64
by (ALLGOALS (asm_simp_tac reduc_ss ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    65
val red_Aplr = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    66
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    67
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    68
    "!!u.[|m ---> m'; n--->n'|]==> Apl(m,n)--->Apl(m',n')";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    69
by (res_inst_tac [("n","Apl(m',n)")] Sred.trans 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    70
by (ALLGOALS (asm_simp_tac (reduc_ss addsimps [red_Apll,red_Aplr]) ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    71
val red_Apl = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    72
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    73
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    74
    "!!u.[|m:lambda; m':lambda; n:lambda; n':lambda; m ---> m'; n--->n'|]==> \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    75
\              Apl(Fun(m),n)---> n'/m'";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    76
by (res_inst_tac [("n","Apl(Fun(m'),n')")] Sred.trans 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    77
by (ALLGOALS (asm_simp_tac (reduc_ss addsimps [red_Apl,red_Fun]) ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    78
val red_beta = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    79
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    80
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    81
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    82
(*      Lemmas for parallel reduction                                        *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    83
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    84
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    85
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    86
goal Reduction.thy "!!u.m:lambda==> m =1=> m";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    87
by (eresolve_tac [lambda.induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    88
by (ALLGOALS (asm_simp_tac reduc_ss ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    89
val refl_par_red1 = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    90
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    91
goal Reduction.thy "!!u.m-1->n ==> m=1=>n";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    92
by (eresolve_tac [red1_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    93
by (ALLGOALS (asm_simp_tac (reduc_ss addsimps [refl_par_red1]) ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    94
val red1_par_red1 = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    95
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    96
goal Reduction.thy "!!u.m--->n ==> m===>n";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    97
by (eresolve_tac [red_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    98
by (resolve_tac [Spar_red.trans] 3);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    99
by (ALLGOALS (asm_simp_tac (reduc_ss addsimps [refl_par_red1,red1_par_red1]) ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   100
val red_par_red = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   101
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   102
goal Reduction.thy "!!u.m===>n ==> m--->n";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   103
by (eresolve_tac [par_red_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   104
by (eresolve_tac [par_red1_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   105
by (resolve_tac [Sred.trans] 5);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   106
by (ALLGOALS (asm_simp_tac (reduc_ss addsimps [red_Fun,red_beta,red_Apl]) ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   107
val par_red_red = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   108
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   109
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   110
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   111
(*      Simulation                                                           *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   112
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   113
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   114
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   115
    "!!u.m=1=>n ==> EX v. m|>v = n & m~v & regular(v)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   116
by (eresolve_tac [par_red1_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   117
by (step_tac ZF_cs 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   118
by (ALLGOALS (REPEAT o (resolve_tac [exI,conjI])));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   119
by (TRYALL(resolve_tac [res_redex,res_App,res_Fun,res_Var]));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   120
by (ALLGOALS (asm_simp_tac (reduc_ss)));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   121
val simulation = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   122
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   123
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   124
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   125
(*           commuting of unmark and subst                                   *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   126
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   127
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   128
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   129
    "!!u.u:redexes ==> \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   130
\           ALL k:nat. unmark(lift_rec(u,k)) = lift_rec(unmark(u),k)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   131
by (eresolve_tac [redexes.induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   132
by (ALLGOALS (asm_full_simp_tac (addsplit reduc_ss)));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   133
val unmmark_lift_rec = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   134
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   135
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   136
    "!!u.v:redexes ==> ALL k:nat.ALL u:redexes.  \
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   137
\         unmark(subst_rec(u,v,k)) = subst_rec(unmark(u),unmark(v),k)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   138
by (eresolve_tac [redexes.induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   139
by (ALLGOALS (asm_full_simp_tac 
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   140
	     ((addsplit reduc_ss) addsimps [unmmark_lift_rec])));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   141
val unmmark_subst_rec = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   142
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   143
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   144
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   145
(*        Completeness                                                       *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   146
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   147
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   148
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   149
    "!!u.u~v ==> regular(v) --> unmark(u) =1=> unmark(u|>v)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   150
by (eresolve_tac [comp_induct] 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   151
by (ALLGOALS (asm_full_simp_tac (reducL_ss addsimps [unmmark_subst_rec]) ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   152
by (dres_inst_tac [("psi", "Fun(?u) =1=> ?w")] asm_rl 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   153
by (asm_full_simp_tac reducL_ss 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   154
val completeness_l = result();
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   155
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   156
goal Reduction.thy  
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   157
    "!!u.[|u:lambda; u~v; regular(v)|]==> u =1=> unmark(u|>v)";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   158
by (dres_inst_tac [("u1","u")] (completeness_l RS mp) 1);
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   159
by (ALLGOALS (asm_full_simp_tac (reduc_ss addsimps [lambda_unmark]) ));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   160
val completeness = result();