Nominal/ExTySch.thy
changeset 1688 0b2535a72fd0
parent 1677 ba3f6e33d647
equal deleted inserted replaced
1687:51bc795b81fd 1688:0b2535a72fd0
     3 begin
     3 begin
     4 
     4 
     5 (* Type Schemes *)
     5 (* Type Schemes *)
     6 atom_decl name
     6 atom_decl name
     7 
     7 
     8 (*ML {* val _ = alpha_type := AlphaRes *}*)
     8 ML {* val _ = alpha_type := AlphaRes *}
     9 nominal_datatype t =
     9 nominal_datatype t =
    10   Var "name"
    10   Var "name"
    11 | Fun "t" "t"
    11 | Fun "t" "t"
    12 and tyS =
    12 and tyS =
    13   All xs::"name fset" ty::"t" bind xs in ty
    13   All xs::"name fset" ty::"t" bind xs in ty
       
    14 
       
    15 lemmas t_tyS_supp = t_tyS.fv[simplified t_tyS.supp]
    14 
    16 
    15 lemma size_eqvt_raw:
    17 lemma size_eqvt_raw:
    16   "size (pi \<bullet> t :: t_raw) = size t"
    18   "size (pi \<bullet> t :: t_raw) = size t"
    17   "size (pi \<bullet> ts :: tyS_raw) = size ts"
    19   "size (pi \<bullet> ts :: tyS_raw) = size ts"
    18   apply (induct rule: t_raw_tyS_raw.inducts)
    20   apply (induct rule: t_raw_tyS_raw.inducts)
    67 thm t_tyS.perm
    69 thm t_tyS.perm
    68 thm t_tyS.inducts
    70 thm t_tyS.inducts
    69 thm t_tyS.distinct
    71 thm t_tyS.distinct
    70 ML {* Sign.of_sort @{theory} (@{typ t}, @{sort fs}) *}
    72 ML {* Sign.of_sort @{theory} (@{typ t}, @{sort fs}) *}
    71 
    73 
    72 lemmas t_tyS_supp = t_tyS.fv[simplified t_tyS.supp]
       
    73 
       
    74 lemma induct:
    74 lemma induct:
    75   assumes a1: "\<And>name b. P b (Var name)"
    75   assumes a1: "\<And>name b. P b (Var name)"
    76   and     a2: "\<And>t1 t2 b. \<lbrakk>\<And>c. P c t1; \<And>c. P c t2\<rbrakk> \<Longrightarrow> P b (Fun t1 t2)"
    76   and     a2: "\<And>t1 t2 b. \<lbrakk>\<And>c. P c t1; \<And>c. P c t2\<rbrakk> \<Longrightarrow> P b (Fun t1 t2)"
    77   and     a3: "\<And>fset t b. \<lbrakk>\<And>c. P c t; fset_to_set (fmap atom fset) \<sharp>* b\<rbrakk> \<Longrightarrow> P' b (All fset t)"
    77   and     a3: "\<And>fset t b. \<lbrakk>\<And>c. P c t; fset_to_set (fmap atom fset) \<sharp>* b\<rbrakk> \<Longrightarrow> P' b (All fset t)"
    78   shows "P (a :: 'a :: pt) t \<and> P' (d :: 'b :: {fs}) ts "
    78   shows "P (a :: 'a :: pt) t \<and> P' (d :: 'b :: {fs}) ts "
   118 lemma
   118 lemma
   119   shows "All {|a, b|} (Fun (Var a) (Var b)) = All {|b, a|} (Fun (Var a) (Var b))"
   119   shows "All {|a, b|} (Fun (Var a) (Var b)) = All {|b, a|} (Fun (Var a) (Var b))"
   120   apply(simp add: t_tyS.eq_iff)
   120   apply(simp add: t_tyS.eq_iff)
   121   apply(rule_tac x="0::perm" in exI)
   121   apply(rule_tac x="0::perm" in exI)
   122   apply(simp add: alphas)
   122   apply(simp add: alphas)
   123   apply(auto)
       
   124   apply(simp add: fresh_star_def fresh_zero_perm)
   123   apply(simp add: fresh_star_def fresh_zero_perm)
   125   done
   124   done
   126 
   125 
   127 lemma
   126 lemma
   128   shows "All {|a, b|} (Fun (Var a) (Var b)) = All {|a, b|} (Fun (Var b) (Var a))"
   127   shows "All {|a, b|} (Fun (Var a) (Var b)) = All {|a, b|} (Fun (Var b) (Var a))"
   129   apply(simp add: t_tyS.eq_iff)
   128   apply(simp add: t_tyS.eq_iff)
   130   apply(rule_tac x="(atom a \<rightleftharpoons> atom b)" in exI)
   129   apply(rule_tac x="(atom a \<rightleftharpoons> atom b)" in exI)
   131   apply(simp add: alpha_gen fresh_star_def eqvts)
   130   apply(simp add: alphas fresh_star_def eqvts)
   132   apply auto
       
   133   done
   131   done
   134 
   132 
   135 lemma
   133 lemma
   136   shows "All {|a, b, c|} (Fun (Var a) (Var b)) = All {|a, b|} (Fun (Var a) (Var b))"
   134   shows "All {|a, b, c|} (Fun (Var a) (Var b)) = All {|a, b|} (Fun (Var a) (Var b))"
   137   apply(simp add: t_tyS.eq_iff)
   135   apply(simp add: t_tyS.eq_iff)
   138   apply(rule_tac x="0::perm" in exI)
   136   apply(rule_tac x="0::perm" in exI)
   139   apply(simp add: alpha_gen fresh_star_def eqvts t_tyS.eq_iff)
   137   apply(simp add: alphas fresh_star_def eqvts t_tyS.eq_iff)
   140 oops
   138 done
   141 
   139 
   142 lemma
   140 lemma
   143   assumes a: "a \<noteq> b"
   141   assumes a: "a \<noteq> b"
   144   shows "\<not>(All {|a, b|} (Fun (Var a) (Var b)) = All {|c|} (Fun (Var c) (Var c)))"
   142   shows "\<not>(All {|a, b|} (Fun (Var a) (Var b)) = All {|c|} (Fun (Var c) (Var c)))"
   145   using a
   143   using a
   146   apply(simp add: t_tyS.eq_iff)
   144   apply(simp add: t_tyS.eq_iff)
   147   apply(clarify)
   145   apply(clarify)
   148   apply(simp add: alpha_gen fresh_star_def eqvts t_tyS.eq_iff)
   146   apply(simp add: alphas fresh_star_def eqvts t_tyS.eq_iff)
   149   apply auto
   147   apply auto
   150   done
   148   done
   151 
   149 
   152 (* PROBLEM:
   150 (* PROBLEM:
   153 Type schemes with separate datatypes
   151 Type schemes with separate datatypes