Nominal/Ex/Lambda.thy
changeset 2630 8268b277d240
parent 2617 e44551d067e6
child 2634 3ce1089cdbf3
equal deleted inserted replaced
2629:ffb5a181844b 2630:8268b277d240
    18 thm lam.eq_iff
    18 thm lam.eq_iff
    19 thm lam.fv_bn_eqvt
    19 thm lam.fv_bn_eqvt
    20 thm lam.size_eqvt
    20 thm lam.size_eqvt
    21 
    21 
    22 
    22 
    23 section {* Strong Induction Lemma via Induct_schema *}
       
    24 
       
    25 
       
    26 lemma strong_induct:
       
    27   fixes c::"'a::fs"
       
    28   assumes a1: "\<And>name c. P c (Var name)"
       
    29   and     a2: "\<And>lam1 lam2 c. \<lbrakk>\<And>d. P d lam1; \<And>d. P d lam2\<rbrakk> \<Longrightarrow> P c (App lam1 lam2)"
       
    30   and     a3: "\<And>name lam c. \<lbrakk>{atom name} \<sharp>* c; \<And>d. P d lam\<rbrakk> \<Longrightarrow> P c (Lam name lam)"
       
    31   shows "P c lam"
       
    32 using assms
       
    33 apply(induction_schema)
       
    34 apply(rule_tac y="lam" in lam.strong_exhaust)
       
    35 apply(blast)
       
    36 apply(blast)
       
    37 apply(blast)
       
    38 apply(relation "measure (\<lambda>(x,y). size y)")
       
    39 apply(simp_all add: lam.size)
       
    40 done
       
    41 
       
    42 section {* Typing *}
    23 section {* Typing *}
    43 
    24 
    44 nominal_datatype ty =
    25 nominal_datatype ty =
    45   TVar string
    26   TVar string
    46 | TFun ty ty
    27 | TFun ty ty ("_ \<rightarrow> _") 
    47 
    28 
    48 notation
       
    49  TFun ("_ \<rightarrow> _") 
       
    50 
    29 
    51 (*
    30 (*
    52 declare ty.perm[eqvt]
    31 declare ty.perm[eqvt]
    53 
    32 
    54 inductive
    33 inductive