src/HOL/Nominal/Examples/Class.thy
changeset 19326 72e149c9caeb
parent 19319 7e1f85ceb1a2
child 19477 a95176d0f0dd
equal deleted inserted replaced
19325:35177b864f80 19326:72e149c9caeb
    19   | OrR2 "\<guillemotleft>coname\<guillemotright>trm" "coname"               ("OrR2 <_>._ _" [100,100,100] 100)
    19   | OrR2 "\<guillemotleft>coname\<guillemotright>trm" "coname"               ("OrR2 <_>._ _" [100,100,100] 100)
    20   | OrL "\<guillemotleft>name\<guillemotright>trm" "\<guillemotleft>name\<guillemotright>trm" "name"        ("OrL [_]._ [_]._ _" [100,100,100,100,100] 100)
    20   | OrL "\<guillemotleft>name\<guillemotright>trm" "\<guillemotleft>name\<guillemotright>trm" "name"        ("OrL [_]._ [_]._ _" [100,100,100,100,100] 100)
    21   | ImpR "\<guillemotleft>name\<guillemotright>(\<guillemotleft>coname\<guillemotright>trm)" "coname"       ("ImpR [_].<_>._ _" [100,100,100,100] 100)
    21   | ImpR "\<guillemotleft>name\<guillemotright>(\<guillemotleft>coname\<guillemotright>trm)" "coname"       ("ImpR [_].<_>._ _" [100,100,100,100] 100)
    22   | ImpL "\<guillemotleft>coname\<guillemotright>trm" "\<guillemotleft>name\<guillemotright>trm" "name"     ("ImpL <_>._ [_]._ _" [100,100,100,100,100] 100)
    22   | ImpL "\<guillemotleft>coname\<guillemotright>trm" "\<guillemotleft>name\<guillemotright>trm" "name"     ("ImpL <_>._ [_]._ _" [100,100,100,100,100] 100)
    23 
    23 
    24 thm trm_iter_set.intros[no_vars]
    24 thm trm_rec_set.intros[no_vars]
    25   
    25   
    26 lemma it_total:
    26 lemma rec_total:
    27   shows "\<exists>r. (t,r) \<in> trm_iter_set f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12"
    27   shows "\<exists>r. (t,r) \<in> trm_rec_set f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12"
    28   by (induct t rule: trm.induct_weak, auto intro: trm_iter_set.intros)
    28   by (induct t rule: trm.induct_weak, auto intro: trm_rec_set.intros)
    29 
    29 
    30 lemma it_prm_eq:
    30 lemma rec_prm_eq:
    31   assumes a: "(t,y) \<in> trm_iter_set f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12" 
    31   assumes a: "(t,y) \<in> trm_rec_set f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12" 
    32   and     b: "pi1 \<triangleq> pi2"
    32   and     b: "pi1 \<triangleq> pi2"
    33   and     c: "pi3 \<triangleq> pi4"
    33   and     c: "pi3 \<triangleq> pi4"
    34   shows "y pi1 pi3 = y pi2 pi4"
    34   shows "y pi1 pi3 = y pi2 pi4"
    35 using a b c
    35 using a b c
    36 apply(induct fixing: pi1 pi2 pi3 pi4)
    36 apply(induct fixing: pi1 pi2 pi3 pi4)
    42 apply(rule allI)
    42 apply(rule allI)
    43 apply(rule_tac f="fresh_fun" in arg_cong)
    43 apply(rule_tac f="fresh_fun" in arg_cong)
    44 apply(simp add: expand_fun_eq)
    44 apply(simp add: expand_fun_eq)
    45 apply(rule allI)
    45 apply(rule allI)
    46 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    46 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    47 apply(simp_all)
    47 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
    48                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
    48 apply(drule meta_spec)+
    49 apply(drule meta_spec)+
    49 apply(drule meta_mp, erule_tac [2] meta_mp)
    50 apply(drule meta_mp, erule_tac [2] meta_mp)
    50 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
    51 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
    51 apply(drule meta_spec)+
    52 apply(drule meta_spec)+
    52 apply(drule meta_mp, erule_tac [2] meta_mp)
    53 apply(drule meta_mp, erule_tac [2] meta_mp)
    54 (* NotR *)
    55 (* NotR *)
    55 apply(rule_tac f="fresh_fun" in arg_cong)
    56 apply(rule_tac f="fresh_fun" in arg_cong)
    56 apply(simp add: expand_fun_eq)
    57 apply(simp add: expand_fun_eq)
    57 apply(rule allI)
    58 apply(rule allI)
    58 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    59 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    59 apply(simp_all)
    60 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
    61                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
    60 apply(drule meta_spec)+
    62 apply(drule meta_spec)+
    61 apply(drule meta_mp, erule_tac [2] meta_mp)
    63 apply(drule meta_mp, erule_tac [2] meta_mp)
    62 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
    64 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
    63 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
    64 (* NotL *)
    65 (* NotL *)
    65 apply(rule_tac f="fresh_fun" in arg_cong)
    66 apply(rule_tac f="fresh_fun" in arg_cong)
    66 apply(simp add: expand_fun_eq)
    67 apply(simp add: expand_fun_eq)
    67 apply(rule allI)
    68 apply(rule allI)
    68 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    69 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    69 apply(simp_all)
    70 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
    71                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
    70 apply(drule meta_spec)+
    72 apply(drule meta_spec)+
    71 apply(drule meta_mp, erule_tac [2] meta_mp)
    73 apply(drule meta_mp, erule_tac [2] meta_mp)
    72 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
    74 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
    73 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
    74 (* AndR *)
    75 (* AndR *)
    75 apply(rule_tac f="fresh_fun" in arg_cong)
    76 apply(rule_tac f="fresh_fun" in arg_cong)
    76 apply(simp add: expand_fun_eq)
    77 apply(simp add: expand_fun_eq)
    77 apply(rule allI)
    78 apply(rule allI)
    78 apply(rule_tac f="fresh_fun" in arg_cong)
    79 apply(rule_tac f="fresh_fun" in arg_cong)
    79 apply(simp add: expand_fun_eq)
    80 apply(simp add: expand_fun_eq)
    80 apply(rule allI)
    81 apply(rule allI)
    81 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    82 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    82 apply(simp_all)
    83 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
    84                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
    83 apply(drule meta_spec)+
    85 apply(drule meta_spec)+
    84 apply(drule meta_mp, erule_tac [2] meta_mp)
    86 apply(drule meta_mp, erule_tac [2] meta_mp)
    85 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
    87 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
    86 apply(drule meta_spec)+
    88 apply(drule meta_spec)+
    87 apply(drule meta_mp, erule_tac [2] meta_mp)
    89 apply(drule meta_mp, erule_tac [2] meta_mp)
    88 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
    90 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
    89 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
    90 (* AndL1 *)
    91 (* AndL1 *)
    91 apply(rule_tac f="fresh_fun" in arg_cong)
    92 apply(rule_tac f="fresh_fun" in arg_cong)
    92 apply(simp add: expand_fun_eq)
    93 apply(simp add: expand_fun_eq)
    93 apply(rule allI)
    94 apply(rule allI)
    94 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    95 apply(tactic {* DatatypeAux.cong_tac 1 *})+
    95 apply(simp_all)
    96 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
    97                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
    96 apply(drule meta_spec)+
    98 apply(drule meta_spec)+
    97 apply(drule meta_mp, erule_tac [2] meta_mp)
    99 apply(drule meta_mp, erule_tac [2] meta_mp)
    98 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   100 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
    99 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
   100 (* AndL1 *)
   101 (* AndL1 *)
   101 apply(rule_tac f="fresh_fun" in arg_cong)
   102 apply(rule_tac f="fresh_fun" in arg_cong)
   102 apply(simp add: expand_fun_eq)
   103 apply(simp add: expand_fun_eq)
   103 apply(rule allI)
   104 apply(rule allI)
   104 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   105 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   105 apply(simp_all)
   106 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
   107                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
   106 apply(drule meta_spec)+
   108 apply(drule meta_spec)+
   107 apply(drule meta_mp, erule_tac [2] meta_mp)
   109 apply(drule meta_mp, erule_tac [2] meta_mp)
   108 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   110 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   109 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
   110 (* OrR1 *)
   111 (* OrR1 *)
   111 apply(rule_tac f="fresh_fun" in arg_cong)
   112 apply(rule_tac f="fresh_fun" in arg_cong)
   112 apply(simp add: expand_fun_eq)
   113 apply(simp add: expand_fun_eq)
   113 apply(rule allI)
   114 apply(rule allI)
   114 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   115 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   115 apply(simp_all)
   116 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
   117                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
   116 apply(drule meta_spec)+
   118 apply(drule meta_spec)+
   117 apply(drule meta_mp, erule_tac [2] meta_mp)
   119 apply(drule meta_mp, erule_tac [2] meta_mp)
   118 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
   120 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
   119 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
   120 (* OrR2 *)
   121 (* OrR2 *)
   121 apply(rule_tac f="fresh_fun" in arg_cong)
   122 apply(rule_tac f="fresh_fun" in arg_cong)
   122 apply(simp add: expand_fun_eq)
   123 apply(simp add: expand_fun_eq)
   123 apply(rule allI)
   124 apply(rule allI)
   124 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   125 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   125 apply(simp_all)
   126 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
   127                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
   126 apply(drule meta_spec)+
   128 apply(drule meta_spec)+
   127 apply(drule meta_mp, erule_tac [2] meta_mp)
   129 apply(drule meta_mp, erule_tac [2] meta_mp)
   128 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
   130 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
   129 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
   130 (* OrL *)
   131 (* OrL *)
   131 apply(rule_tac f="fresh_fun" in arg_cong)
   132 apply(rule_tac f="fresh_fun" in arg_cong)
   132 apply(simp add: expand_fun_eq)
   133 apply(simp add: expand_fun_eq)
   133 apply(rule allI)
   134 apply(rule allI)
   134 apply(rule_tac f="fresh_fun" in arg_cong)
   135 apply(rule_tac f="fresh_fun" in arg_cong)
   135 apply(simp add: expand_fun_eq)
   136 apply(simp add: expand_fun_eq)
   136 apply(rule allI)
   137 apply(rule allI)
   137 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   138 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   138 apply(simp_all)
   139 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
   140                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
   139 apply(drule meta_spec)+
   141 apply(drule meta_spec)+
   140 apply(drule meta_mp, erule_tac [2] meta_mp)
   142 apply(drule meta_mp, erule_tac [2] meta_mp)
   141 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   143 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   142 apply(drule meta_spec)+
   144 apply(drule meta_spec)+
   143 apply(drule meta_mp, erule_tac [2] meta_mp)
   145 apply(drule meta_mp, erule_tac [2] meta_mp)
   144 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   146 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   145 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
   146 (* ImpR *)
   147 (* ImpR *)
   147 apply(rule_tac f="fresh_fun" in arg_cong)
   148 apply(rule_tac f="fresh_fun" in arg_cong)
   148 apply(simp add: expand_fun_eq)
   149 apply(simp add: expand_fun_eq)
   149 apply(rule allI)
   150 apply(rule allI)
   150 apply(rule_tac f="fresh_fun" in arg_cong)
   151 apply(rule_tac f="fresh_fun" in arg_cong)
   151 apply(simp add: expand_fun_eq)
   152 apply(simp add: expand_fun_eq)
   152 apply(rule allI)
   153 apply(rule allI)
   153 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   154 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   154 apply(simp_all)
   155 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
   156                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
   155 apply(drule meta_spec)+
   157 apply(drule meta_spec)+
   156 apply(drule meta_mp, erule_tac [2] meta_mp)
   158 apply(drule meta_mp, erule_tac [2] meta_mp)
   157 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption)
   159 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption)
   158 apply(rule at_prm_eq_append'[OF at_name_inst], assumption)
   160 apply(rule at_prm_eq_append'[OF at_name_inst], assumption)
   159 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
   160 (* ImpL *)
   161 (* ImpL *)
   161 apply(rule_tac f="fresh_fun" in arg_cong)
   162 apply(rule_tac f="fresh_fun" in arg_cong)
   162 apply(simp add: expand_fun_eq)
   163 apply(simp add: expand_fun_eq)
   163 apply(rule allI)
   164 apply(rule allI)
   164 apply(rule_tac f="fresh_fun" in arg_cong)
   165 apply(rule_tac f="fresh_fun" in arg_cong)
   165 apply(simp add: expand_fun_eq)
   166 apply(simp add: expand_fun_eq)
   166 apply(rule allI)
   167 apply(rule allI)
   167 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   168 apply(tactic {* DatatypeAux.cong_tac 1 *})+
   168 apply(simp_all)
   169 apply(simp_all add: pt2[OF pt_name_inst] pt2[OF pt_coname_inst] 
       
   170                     pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
   169 apply(drule meta_spec)+
   171 apply(drule meta_spec)+
   170 apply(drule meta_mp, erule_tac [2] meta_mp)
   172 apply(drule meta_mp, erule_tac [2] meta_mp)
   171 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
   173 apply(rule at_prm_eq_append'[OF at_coname_inst], assumption, assumption)
   172 apply(drule meta_spec)+
   174 apply(drule meta_spec)+
   173 apply(drule meta_mp, erule_tac [2] meta_mp)
   175 apply(drule meta_mp, erule_tac [2] meta_mp)
   174 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   176 apply(assumption, rule at_prm_eq_append'[OF at_name_inst], assumption)
   175 apply(simp add: pt3[OF pt_name_inst] pt3[OF pt_coname_inst])
       
   176 done
   177 done
   177 
   178 
   178 text {* Induction principles *}
   179 text {* Induction principles *}
   179 
   180 
   180 thm trm.induct_weak --"weak"
   181 thm trm.induct_weak --"weak"