src/HOL/Lambda/ParRed.ML
author nipkow
Tue, 02 Jan 1996 14:08:04 +0100
changeset 1431 be7c6d77e19c
parent 1288 6eb89a693e05
child 1465 5d7a7e439cec
permissions -rw-r--r--
Polished proofs.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1288
6eb89a693e05 Improved a few proofs.
nipkow
parents: 1269
diff changeset
     1
(*  Title:      HOL/Lambda/ParRed.ML
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
     3
    Author:     Tobias Nipkow
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
     4
    Copyright   1995 TU Muenchen
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
     5
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
     6
Properties of => and cd, in particular the diamond property of => and
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
     7
confluence of beta.
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
     8
*)
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
     9
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    10
open ParRed;
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    11
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    12
Addsimps par_beta.intrs;
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    13
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    14
val par_beta_cases = map (par_beta.mk_cases db.simps)
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    15
    ["Var n => t", "Fun s => Fun t",
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    16
     "(Fun s) @ t => u", "s @ t => u", "Fun s => t"];
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    17
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    18
val parred_cs = lambda_cs addSIs par_beta.intrs addSEs par_beta_cases;
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    19
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    20
(*** beta <= par_beta <= beta^* ***)
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    21
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    22
goal ParRed.thy "(Var n => t) = (t = Var n)";
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    23
by(fast_tac parred_cs 1);
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    24
qed "par_beta_varL";
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    25
Addsimps [par_beta_varL];
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    26
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    27
goal ParRed.thy "t => t";
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    28
by(db.induct_tac "t" 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    29
by(ALLGOALS Asm_simp_tac);
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    30
qed"par_beta_refl";
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    31
Addsimps [par_beta_refl];
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    32
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    33
goal ParRed.thy "beta <= par_beta";
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    34
br subsetI 1;
1431
be7c6d77e19c Polished proofs.
nipkow
parents: 1288
diff changeset
    35
by (split_all_tac 1);
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    36
be (beta.mutual_induct RS spec RS spec RSN (2,rev_mp)) 1;
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    37
by (ALLGOALS(fast_tac (parred_cs addSIs [par_beta_refl])));
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    38
qed "beta_subset_par_beta";
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    39
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    40
goal ParRed.thy "par_beta <= beta^*";
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    41
br subsetI 1;
1431
be7c6d77e19c Polished proofs.
nipkow
parents: 1288
diff changeset
    42
by (split_all_tac 1);
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    43
be (par_beta.mutual_induct RS spec RS spec RSN (2,rev_mp)) 1;
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    44
by (ALLGOALS(fast_tac (parred_cs addIs
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    45
       [rtrancl_beta_Fun,rtrancl_beta_App,rtrancl_refl,
1124
a6233ea105a4 Polished the presentation making it completely definitional.
nipkow
parents: 1120
diff changeset
    46
        rtrancl_into_rtrancl] addEs [rtrancl_trans])));
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    47
qed "par_beta_subset_beta";
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    48
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    49
(*** => ***)
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    50
1172
ab725b698cb2 Renamed some vars.
nipkow
parents: 1156
diff changeset
    51
goal ParRed.thy "!t' n. t => t' --> lift t n => lift t' n";
ab725b698cb2 Renamed some vars.
nipkow
parents: 1156
diff changeset
    52
by(db.induct_tac "t" 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    53
by(ALLGOALS(fast_tac (parred_cs addss (!simpset))));
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    54
bind_thm("par_beta_lift", result() RS spec RS spec RS mp);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    55
Addsimps [par_beta_lift];
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    56
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    57
goal ParRed.thy
1124
a6233ea105a4 Polished the presentation making it completely definitional.
nipkow
parents: 1120
diff changeset
    58
  "!s s' t' n. s => s' --> t => t' --> t[s/n] => t'[s'/n]";
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    59
by(db.induct_tac "t" 1);
1269
ee011b365770 New version with eta reduction.
nipkow
parents: 1266
diff changeset
    60
  by(asm_simp_tac (addsplit(!simpset)) 1);
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    61
 by(strip_tac 1);
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    62
 bes par_beta_cases 1;
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    63
  by(Asm_simp_tac 1);
1288
6eb89a693e05 Improved a few proofs.
nipkow
parents: 1269
diff changeset
    64
 by(asm_simp_tac (!simpset addsimps [subst_subst RS sym]) 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    65
 by(fast_tac (parred_cs addSIs [par_beta_lift] addss (!simpset)) 1);
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    66
by(fast_tac (parred_cs addss (!simpset)) 1);
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    67
bind_thm("par_beta_subst",
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    68
         result()  RS spec RS spec RS spec RS spec RS mp RS mp);
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    69
1156
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    70
(*** Confluence (directly) ***)
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    71
1269
ee011b365770 New version with eta reduction.
nipkow
parents: 1266
diff changeset
    72
goalw ParRed.thy [diamond_def,commute_def,square_def] "diamond(par_beta)";
1288
6eb89a693e05 Improved a few proofs.
nipkow
parents: 1269
diff changeset
    73
br par_beta.mutual_induct 1;
1156
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    74
by(ALLGOALS(fast_tac (parred_cs addSIs [par_beta_subst])));
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    75
qed "diamond_par_beta";
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    76
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    77
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    78
(*** cd ***)
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    79
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    80
goal ParRed.thy "!t. s => t --> t => cd s";
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    81
by(db.induct_tac "s" 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    82
  by(Simp_tac 1);
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    83
 be rev_mp 1;
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    84
 by(db.induct_tac "db1" 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    85
 by(ALLGOALS(fast_tac (parred_cs addSIs [par_beta_subst] addss (!simpset))));
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    86
bind_thm("par_beta_cd", result() RS spec RS mp);
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    87
1156
b373cb33352f Put in direct proof of C-R w/o detour via cd.
nipkow
parents: 1124
diff changeset
    88
(*** Confluence (via cd) ***)
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    89
1269
ee011b365770 New version with eta reduction.
nipkow
parents: 1266
diff changeset
    90
goalw ParRed.thy [diamond_def,commute_def,square_def] "diamond(par_beta)";
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    91
by(fast_tac (HOL_cs addIs [par_beta_cd]) 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    92
qed "diamond_par_beta2";
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    93
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    94
goal ParRed.thy "confluent(beta)";
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 1172
diff changeset
    95
by(fast_tac (HOL_cs addIs [diamond_par_beta2,diamond_to_confluence,
1120
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    96
                           par_beta_subset_beta,beta_subset_par_beta]) 1);
ff7dd80513e6 Lambda calculus in de Bruijn notation.
nipkow
parents:
diff changeset
    97
qed"beta_confluent";