Nominal/Ex/ExTySch.thy
changeset 1773 c0eac04ae3b4
parent 1677 ba3f6e33d647
equal deleted inserted replaced
1772:48c2eb84d5ce 1773:c0eac04ae3b4
       
     1 theory ExTySch
       
     2 imports "../Parser"
       
     3 begin
       
     4 
       
     5 (* Type Schemes *)
       
     6 atom_decl name
       
     7 
       
     8 ML {* val _ = alpha_type := AlphaRes *}
       
     9 nominal_datatype t =
       
    10   Var "name"
       
    11 | Fun "t" "t"
       
    12 and tyS =
       
    13   All xs::"name fset" ty::"t" bind xs in ty
       
    14 
       
    15 lemmas t_tyS_supp = t_tyS.fv[simplified t_tyS.supp]
       
    16 
       
    17 lemma size_eqvt_raw:
       
    18   "size (pi \<bullet> t :: t_raw) = size t"
       
    19   "size (pi \<bullet> ts :: tyS_raw) = size ts"
       
    20   apply (induct rule: t_raw_tyS_raw.inducts)
       
    21   apply simp_all
       
    22   done
       
    23 
       
    24 instantiation t and tyS :: size begin
       
    25 
       
    26 quotient_definition
       
    27   "size_t :: t \<Rightarrow> nat"
       
    28 is
       
    29   "size :: t_raw \<Rightarrow> nat"
       
    30 
       
    31 quotient_definition
       
    32   "size_tyS :: tyS \<Rightarrow> nat"
       
    33 is
       
    34   "size :: tyS_raw \<Rightarrow> nat"
       
    35 
       
    36 lemma size_rsp:
       
    37   "alpha_t_raw x y \<Longrightarrow> size x = size y"
       
    38   "alpha_tyS_raw a b \<Longrightarrow> size a = size b"
       
    39   apply (induct rule: alpha_t_raw_alpha_tyS_raw.inducts)
       
    40   apply (simp_all only: t_raw_tyS_raw.size)
       
    41   apply (simp_all only: alphas)
       
    42   apply clarify
       
    43   apply (simp_all only: size_eqvt_raw)
       
    44   done
       
    45 
       
    46 lemma [quot_respect]:
       
    47   "(alpha_t_raw ===> op =) size size"
       
    48   "(alpha_tyS_raw ===> op =) size size"
       
    49   by (simp_all add: size_rsp)
       
    50 
       
    51 lemma [quot_preserve]:
       
    52   "(rep_t ---> id) size = size"
       
    53   "(rep_tyS ---> id) size = size"
       
    54   by (simp_all add: size_t_def size_tyS_def)
       
    55 
       
    56 instance
       
    57   by default
       
    58 
       
    59 end
       
    60 
       
    61 thm t_raw_tyS_raw.size(4)[quot_lifted]
       
    62 thm t_raw_tyS_raw.size(5)[quot_lifted]
       
    63 thm t_raw_tyS_raw.size(6)[quot_lifted]
       
    64 
       
    65 
       
    66 thm t_tyS.fv
       
    67 thm t_tyS.eq_iff
       
    68 thm t_tyS.bn
       
    69 thm t_tyS.perm
       
    70 thm t_tyS.inducts
       
    71 thm t_tyS.distinct
       
    72 ML {* Sign.of_sort @{theory} (@{typ t}, @{sort fs}) *}
       
    73 
       
    74 lemma induct:
       
    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)"
       
    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 "
       
    79 proof -
       
    80   have " (\<forall>p a. P a (p \<bullet> t)) \<and> (\<forall>p d. P' d (p \<bullet> ts))"
       
    81     apply (rule t_tyS.induct)
       
    82     apply (simp add: a1)
       
    83     apply (simp)
       
    84     apply (rule allI)+
       
    85     apply (rule a2)
       
    86     apply simp
       
    87     apply simp
       
    88     apply (rule allI)
       
    89     apply (rule allI)
       
    90     apply(subgoal_tac "\<exists>pa. ((pa \<bullet> (fset_to_set (fmap atom (p \<bullet> fset)))) \<sharp>* d \<and> supp (p \<bullet> All fset t) \<sharp>* pa)")
       
    91     apply clarify
       
    92     apply(rule_tac t="p \<bullet> All fset t" and 
       
    93                    s="pa \<bullet> (p \<bullet> All fset t)" in subst)
       
    94     apply (rule supp_perm_eq)
       
    95     apply assumption
       
    96     apply (simp only: t_tyS.perm)
       
    97     apply (rule a3)
       
    98     apply(erule_tac x="(pa + p)" in allE)
       
    99     apply simp
       
   100     apply (simp add: eqvts eqvts_raw)
       
   101     apply (rule at_set_avoiding2)
       
   102     apply (simp add: fin_fset_to_set)
       
   103     apply (simp add: finite_supp)
       
   104     apply (simp add: eqvts finite_supp)
       
   105     apply (subst atom_eqvt_raw[symmetric])
       
   106     apply (subst fmap_eqvt[symmetric])
       
   107     apply (subst fset_to_set_eqvt[symmetric])
       
   108     apply (simp only: fresh_star_permute_iff)
       
   109     apply (simp add: fresh_star_def)
       
   110     apply clarify
       
   111     apply (simp add: fresh_def)
       
   112     apply (simp add: t_tyS_supp)
       
   113     done
       
   114   then have "P a (0 \<bullet> t) \<and> P' d (0 \<bullet> ts)" by blast
       
   115   then show ?thesis by simp
       
   116 qed
       
   117 
       
   118 lemma
       
   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)
       
   121   apply(rule_tac x="0::perm" in exI)
       
   122   apply(simp add: alphas)
       
   123   apply(simp add: fresh_star_def fresh_zero_perm)
       
   124   done
       
   125 
       
   126 lemma
       
   127   shows "All {|a, b|} (Fun (Var a) (Var b)) = All {|a, b|} (Fun (Var b) (Var a))"
       
   128   apply(simp add: t_tyS.eq_iff)
       
   129   apply(rule_tac x="(atom a \<rightleftharpoons> atom b)" in exI)
       
   130   apply(simp add: alphas fresh_star_def eqvts)
       
   131   done
       
   132 
       
   133 lemma
       
   134   shows "All {|a, b, c|} (Fun (Var a) (Var b)) = All {|a, b|} (Fun (Var a) (Var b))"
       
   135   apply(simp add: t_tyS.eq_iff)
       
   136   apply(rule_tac x="0::perm" in exI)
       
   137   apply(simp add: alphas fresh_star_def eqvts t_tyS.eq_iff)
       
   138 done
       
   139 
       
   140 lemma
       
   141   assumes a: "a \<noteq> b"
       
   142   shows "\<not>(All {|a, b|} (Fun (Var a) (Var b)) = All {|c|} (Fun (Var c) (Var c)))"
       
   143   using a
       
   144   apply(simp add: t_tyS.eq_iff)
       
   145   apply(clarify)
       
   146   apply(simp add: alphas fresh_star_def eqvts t_tyS.eq_iff)
       
   147   apply auto
       
   148   done
       
   149 
       
   150 (* PROBLEM:
       
   151 Type schemes with separate datatypes
       
   152 
       
   153 nominal_datatype T =
       
   154   TVar "name"
       
   155 | TFun "T" "T"
       
   156 nominal_datatype TyS =
       
   157   TAll xs::"name list" ty::"T" bind xs in ty
       
   158 
       
   159 *** exception Datatype raised
       
   160 *** (line 218 of "/usr/local/src/Isabelle_16-Mar-2010/src/HOL/Tools/Datatype/datatype_aux.ML")
       
   161 *** At command "nominal_datatype".
       
   162 *)
       
   163 
       
   164 
       
   165 end