src/HOL/Lambda/InductTermi.ML
changeset 5276 dd99b958b306
parent 5269 3155ccd9a506
child 5318 72bf8039b53f
equal deleted inserted replaced
5275:de5d5e5eb692 5276:dd99b958b306
       
     1 (*  Title:      HOL/Lambda/InductTermi.ML
       
     2     ID:         $Id$
       
     3     Author:     Tobias Nipkow
       
     4     Copyright   1998 TU Muenchen
       
     5 *)
       
     6 
     1 (*** Every term in IT terminates ***)
     7 (*** Every term in IT terminates ***)
     2 
     8 
     3 Goal "s : termi beta ==> !t. t : termi beta --> \
     9 Goal "s : termi beta ==> !t. t : termi beta --> \
     4 \     (!r ss. t = r[s/0]$$ss --> Abs r $ s $$ ss : termi beta)";
    10 \     (!r ss. t = r[s/0]$$ss --> Abs r $ s $$ ss : termi beta)";
     5 be acc_induct 1;
    11 be acc_induct 1;
    44    hd(tl(get_thms List.thy "foldl.simps")) RS sym ]
    50    hd(tl(get_thms List.thy "foldl.simps")) RS sym ]
    45   @ dB.simps @ list.simps))
    51   @ dB.simps @ list.simps))
    46     ["Var n $$ ss : IT", "Abs t : IT", "Abs r $ s $$ ts : IT"];
    52     ["Var n $$ ss : IT", "Abs t : IT", "Abs r $ s $$ ts : IT"];
    47 AddSEs IT_cases;
    53 AddSEs IT_cases;
    48 
    54 
       
    55 (* Turned out to be redundant:
    49 Goal "t : termi beta ==> \
    56 Goal "t : termi beta ==> \
    50 \     !r rs. t = r$$rs --> r : termi beta & rs : termi(step1 beta)";
    57 \     !r rs. t = r$$rs --> r : termi beta & rs : termi(step1 beta)";
    51 be acc_induct 1;
    58 be acc_induct 1;
    52 by(force_tac (claset()
    59 by(force_tac (claset()
    53      addIs [apps_preserves_beta,apps_preserves_betas,accI],simpset()) 1);
    60      addIs [apps_preserves_beta,apps_preserves_betas,accI],simpset()) 1);
    75 
    82 
    76 Goal "r$s : termi beta ==> r : termi beta & s : termi beta";
    83 Goal "r$s : termi beta ==> r : termi beta & s : termi beta";
    77 bd lemma 1;
    84 bd lemma 1;
    78 by(Blast_tac 1);
    85 by(Blast_tac 1);
    79 qed "App_in_termi_betaD";
    86 qed "App_in_termi_betaD";
    80 
    87 *)
    81 
    88 
    82 Goal "r : termi beta ==> r : IT";
    89 Goal "r : termi beta ==> r : IT";
    83 be acc_induct 1;
    90 be acc_induct 1;
    84 by(rename_tac "r" 1);
    91 by(rename_tac "r" 1);
    85 be rev_mp 1;
    92 be thin_rl 1;
    86 be rev_mp 1;
    93 be rev_mp 1;
    87 by(Simp_tac 1);
    94 by(Simp_tac 1);
    88 by(res_inst_tac [("t","r")] Apps_dB_induct 1);
    95 by(res_inst_tac [("t","r")] Apps_dB_induct 1);
    89  by(rename_tac "n ts" 1);
    96  by(rename_tac "n ts" 1);
    90  by(Clarify_tac 1);
    97  by(Clarify_tac 1);
    91  brs IT.intrs 1;
    98  brs IT.intrs 1;
    92  by(Clarify_tac 1);
    99  by(Clarify_tac 1);
    93  by(EVERY1[dtac bspec, atac]);
   100  by(EVERY1[dtac bspec, atac]);
    94  by(EVERY[etac impE 1, etac mp 2]);
   101  be mp 1;
    95   by(Clarify_tac 1);
   102   by(Clarify_tac 1);
    96   bd converseI 1;
   103   bd converseI 1;
    97   by(EVERY1[dtac ex_step1I, atac]);
   104   by(EVERY1[dtac ex_step1I, atac]);
    98   by(Clarify_tac 1);
   105   by(Clarify_tac 1);
    99   by(rename_tac "us" 1);
   106   by(rename_tac "us" 1);
   100   by(eres_inst_tac [("x","Var n $$ us")] allE 1);
   107   by(eres_inst_tac [("x","Var n $$ us")] allE 1);
   101   by(Force_tac 1);
   108   by(Force_tac 1);
   102  bd apps_in_termi_betaD 1;
       
   103  by(asm_full_simp_tac (simpset() delsimps [step1_converse]
       
   104                                  addsimps [step1_converse RS sym]) 1);
       
   105  by(blast_tac (claset() addDs [lists_accI]) 1);
       
   106 by(rename_tac "u ts" 1);
   109 by(rename_tac "u ts" 1);
   107 by(exhaust_tac "ts" 1);
   110 by(exhaust_tac "ts" 1);
   108  by(Asm_full_simp_tac 1);
   111  by(Asm_full_simp_tac 1);
   109  by(Clarify_tac 1);
   112  by(blast_tac (claset() addIs IT.intrs) 1);
   110  brs IT.intrs 1;
       
   111  by(blast_tac (claset() addDs [Abs_in_termi_betaD]) 1);
       
   112 by(rename_tac "s ss" 1);
   113 by(rename_tac "s ss" 1);
   113 by(Asm_full_simp_tac 1);
   114 by(Asm_full_simp_tac 1);
   114 by(Clarify_tac 1);
   115 by(Clarify_tac 1);
   115 brs IT.intrs 1;
   116 brs IT.intrs 1;
   116  by(blast_tac (claset() addIs [apps_preserves_beta]) 1);
   117  by(blast_tac (claset() addIs [apps_preserves_beta]) 1);
   117 by(EVERY[etac impE 1, etac mp 2]);
   118 be mp 1;
   118  by(Clarify_tac 1);
   119  by(Clarify_tac 1);
   119  by(rename_tac "t" 1);
   120  by(rename_tac "t" 1);
   120  by(eres_inst_tac [("x","Abs u $ t $$ ss")] allE 1);
   121  by(eres_inst_tac [("x","Abs u $ t $$ ss")] allE 1);
   121  by(Force_tac 1);
   122  by(Force_tac 1);
   122 by(blast_tac (claset() addSDs [apps_in_termi_betaD, App_in_termi_betaD]) 1);
       
   123 qed "termi_implies_IT";
   123 qed "termi_implies_IT";