src/ZF/Resid/Reduction.ML
author wenzelm
Tue, 20 Oct 1998 16:26:20 +0200
changeset 5686 1f053d05f571
parent 5527 38928c4a8eb2
child 6141 a6922171b396
permissions -rw-r--r--
Symtab.foldl;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1048
diff changeset
     1
(*  Title:      Reduction.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 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
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    25
AddIs (Sred1.intrs@[Sred.one_step, Sred.refl]@Spar_red1.intrs@
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    26
       [Spar_red.one_step, lambda.dom_subset RS subsetD,
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    27
	unmark_type]@lambda.intrs@bool_typechecks);
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    28
AddSEs [Spar_red1.mk_cases redexes.con_defs "Fun(t) =1=> Fun(u)"];
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    29
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    30
Addsimps (Sred1.intrs@[Sred.one_step, Sred.refl]@Spar_red1.intrs@
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    31
	  [Spar_red.one_step, substL_type, redD1, redD2, par_redD1, 
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    32
	   par_redD2, par_red1D2, unmark_type]);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    33
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    34
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    35
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    36
(*     Lemmas for reduction                                                  *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    37
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    38
5137
60205b0de9b9 Huge tidy-up: removal of leading \!\!
paulson
parents: 5068
diff changeset
    39
Goal  "m--->n ==> Fun(m) ---> Fun(n)";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
    40
by (etac Sred.induct 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    41
by (resolve_tac [Sred.trans] 3);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    42
by (ALLGOALS (Asm_simp_tac ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    43
qed "red_Fun";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    44
5147
825877190618 More tidying and removal of "\!\!... from Goal commands
paulson
parents: 5137
diff changeset
    45
Goal "[|n:lambda; m ---> m'|]==> Apl(m,n)--->Apl(m',n)";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
    46
by (etac Sred.induct 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    47
by (resolve_tac [Sred.trans] 3);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    48
by (ALLGOALS (Asm_simp_tac ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    49
qed "red_Apll";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    50
5147
825877190618 More tidying and removal of "\!\!... from Goal commands
paulson
parents: 5137
diff changeset
    51
Goal "[|n:lambda; m ---> m'|]==> Apl(n,m)--->Apl(n,m')";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
    52
by (etac Sred.induct 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    53
by (resolve_tac [Sred.trans] 3);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    54
by (ALLGOALS (Asm_simp_tac ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    55
qed "red_Aplr";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    56
5147
825877190618 More tidying and removal of "\!\!... from Goal commands
paulson
parents: 5137
diff changeset
    57
Goal "[|m ---> m'; n--->n'|]==> Apl(m,n)--->Apl(m',n')";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    58
by (res_inst_tac [("n","Apl(m',n)")] Sred.trans 1);
4091
771b1f6422a8 isatool fixclasimp;
wenzelm
parents: 3840
diff changeset
    59
by (ALLGOALS (asm_simp_tac (simpset() addsimps [red_Apll,red_Aplr]) ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    60
qed "red_Apl";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    61
5147
825877190618 More tidying and removal of "\!\!... from Goal commands
paulson
parents: 5137
diff changeset
    62
Goal "[|m:lambda; m':lambda; n:lambda; n':lambda; m ---> m'; n--->n'|]==> \
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    63
\              Apl(Fun(m),n)---> n'/m'";
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    64
by (res_inst_tac [("n","Apl(Fun(m'),n')")] Sred.trans 1);
4091
771b1f6422a8 isatool fixclasimp;
wenzelm
parents: 3840
diff changeset
    65
by (ALLGOALS (asm_simp_tac (simpset() addsimps [red_Apl,red_Fun]) ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    66
qed "red_beta";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    67
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    68
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    69
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    70
(*      Lemmas for parallel reduction                                        *)
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
5137
60205b0de9b9 Huge tidy-up: removal of leading \!\!
paulson
parents: 5068
diff changeset
    74
Goal "m:lambda==> m =1=> m";
5527
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
    75
by (etac lambda.induct 1);
2469
b50b8c0eec01 Implicit simpsets and clasets for FOL and ZF
paulson
parents: 1732
diff changeset
    76
by (ALLGOALS (Asm_simp_tac ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    77
qed "refl_par_red1";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    78
5137
60205b0de9b9 Huge tidy-up: removal of leading \!\!
paulson
parents: 5068
diff changeset
    79
Goal "m-1->n ==> m=1=>n";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
    80
by (etac Sred1.induct 1);
4091
771b1f6422a8 isatool fixclasimp;
wenzelm
parents: 3840
diff changeset
    81
by (ALLGOALS (asm_simp_tac (simpset() addsimps [refl_par_red1]) ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    82
qed "red1_par_red1";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    83
5137
60205b0de9b9 Huge tidy-up: removal of leading \!\!
paulson
parents: 5068
diff changeset
    84
Goal "m--->n ==> m===>n";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
    85
by (etac Sred.induct 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    86
by (resolve_tac [Spar_red.trans] 3);
4091
771b1f6422a8 isatool fixclasimp;
wenzelm
parents: 3840
diff changeset
    87
by (ALLGOALS (asm_simp_tac (simpset() addsimps [refl_par_red1,red1_par_red1]) ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    88
qed "red_par_red";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    89
5137
60205b0de9b9 Huge tidy-up: removal of leading \!\!
paulson
parents: 5068
diff changeset
    90
Goal "m===>n ==> m--->n";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
    91
by (etac Spar_red.induct 1);
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
    92
by (etac Spar_red1.induct 1);
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    93
by (resolve_tac [Sred.trans] 5);
4091
771b1f6422a8 isatool fixclasimp;
wenzelm
parents: 3840
diff changeset
    94
by (ALLGOALS (asm_simp_tac (simpset() addsimps [red_Fun,red_beta,red_Apl]) ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
    95
qed "par_red_red";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    96
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    97
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    98
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
    99
(*      Simulation                                                           *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   100
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   101
5147
825877190618 More tidying and removal of "\!\!... from Goal commands
paulson
parents: 5137
diff changeset
   102
Goal "m=1=>n ==> EX v. m|>v = n & m~v & regular(v)";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
   103
by (etac Spar_red1.induct 1);
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
   104
by Safe_tac;
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   105
by (ALLGOALS (REPEAT o (resolve_tac [exI,conjI])));
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   106
by (TRYALL(resolve_tac [res_redex,res_App,res_Fun,res_Var]));
4091
771b1f6422a8 isatool fixclasimp;
wenzelm
parents: 3840
diff changeset
   107
by (ALLGOALS (asm_simp_tac (simpset())));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
   108
qed "simulation";
1048
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
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   112
(*           commuting of unmark and subst                                   *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   113
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   114
5527
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   115
Goal "u:redexes ==> ALL k:nat. unmark(lift_rec(u,k)) = lift_rec(unmark(u),k)";
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   116
by (etac redexes.induct 1);
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   117
by (ALLGOALS (asm_simp_tac (simpset() addsimps [lift_rec_Var])));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
   118
qed "unmmark_lift_rec";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   119
5147
825877190618 More tidying and removal of "\!\!... from Goal commands
paulson
parents: 5137
diff changeset
   120
Goal "v:redexes ==> ALL k:nat. ALL u:redexes.  \
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   121
\         unmark(subst_rec(u,v,k)) = subst_rec(unmark(u),unmark(v),k)";
5527
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   122
by (etac redexes.induct 1);
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   123
by (ALLGOALS (asm_simp_tac 
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   124
	      (simpset() addsimps [unmmark_lift_rec, subst_Var])));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
   125
qed "unmmark_subst_rec";
1048
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
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   129
(*        Completeness                                                       *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   130
(* ------------------------------------------------------------------------- *)
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   131
5147
825877190618 More tidying and removal of "\!\!... from Goal commands
paulson
parents: 5137
diff changeset
   132
Goal "u~v ==> regular(v) --> unmark(u) =1=> unmark(u|>v)";
1732
38776e927da8 Updated for new form of induction rules
paulson
parents: 1461
diff changeset
   133
by (etac Scomp.induct 1);
5527
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   134
by (auto_tac (claset(),
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   135
	      simpset() addsimps [unmmark_subst_rec]));
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   136
by (dres_inst_tac [("psi", "Fun(?u) =1=> ?w")] asm_rl 1);
5527
38928c4a8eb2 big tidying of simpsets, etc
paulson
parents: 5147
diff changeset
   137
by Auto_tac;
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
   138
qed_spec_mp "completeness_l";
1048
5ba0314f8214 New example by Ole Rasmussen
lcp
parents:
diff changeset
   139
5147
825877190618 More tidying and removal of "\!\!... from Goal commands
paulson
parents: 5137
diff changeset
   140
Goal "[|u:lambda; u~v; regular(v)|]==> u =1=> unmark(u|>v)";
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
   141
by (dtac completeness_l 1);
4091
771b1f6422a8 isatool fixclasimp;
wenzelm
parents: 3840
diff changeset
   142
by (ALLGOALS (asm_full_simp_tac (simpset() addsimps [lambda_unmark]) ));
3734
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
   143
qed "completeness";
33f355f56f82 Much tidying including "qed" instead of result(), and even qed_spec_mp,
paulson
parents: 2469
diff changeset
   144