src/HOL/Nominal/nominal_atoms.ML
changeset 21289 920b7b893d9c
parent 20377 3baf326b2b5f
child 21377 c29146dc14f1
equal deleted inserted replaced
21288:2c7d3d120418 21289:920b7b893d9c
    52     val thy1 = TypedefPackage.add_typedecls (map (fn x => (x,[],NoSyn)) ak_names) thy;
    52     val thy1 = TypedefPackage.add_typedecls (map (fn x => (x,[],NoSyn)) ak_names) thy;
    53     
    53     
    54     (* produces a list consisting of pairs:         *)
    54     (* produces a list consisting of pairs:         *)
    55     (*  fst component is the atom-kind name         *)
    55     (*  fst component is the atom-kind name         *)
    56     (*  snd component is its type                   *)
    56     (*  snd component is its type                   *)
    57     val full_ak_names = map (Sign.intern_type (sign_of thy1)) ak_names;
    57     val full_ak_names = map (Sign.intern_type thy1) ak_names;
    58     val ak_names_types = ak_names ~~ map (Type o rpair []) full_ak_names;
    58     val ak_names_types = ak_names ~~ map (Type o rpair []) full_ak_names;
    59      
    59      
    60     (* adds for every atom-kind an axiom             *)
    60     (* adds for every atom-kind an axiom             *)
    61     (* <ak>_infinite: infinite (UNIV::<ak_type> set) *)
    61     (* <ak>_infinite: infinite (UNIV::<ak_type> set) *)
    62     val (inf_axs,thy2) = PureThy.add_axioms_i (map (fn (ak_name, T) =>
    62     val (inf_axs,thy2) = PureThy.add_axioms_i (map (fn (ak_name, T) =>
    74     (* swap_<ak> (a,b) c = (if a=c then b (else if b=c then a else c)) *)
    74     (* swap_<ak> (a,b) c = (if a=c then b (else if b=c then a else c)) *)
    75     (* overloades then the general swap-function                       *) 
    75     (* overloades then the general swap-function                       *) 
    76     val (swap_eqs, thy3) = fold_map (fn (ak_name, T) => fn thy =>
    76     val (swap_eqs, thy3) = fold_map (fn (ak_name, T) => fn thy =>
    77       let
    77       let
    78         val swapT = HOLogic.mk_prodT (T, T) --> T --> T;
    78         val swapT = HOLogic.mk_prodT (T, T) --> T --> T;
    79         val swap_name = Sign.full_name (sign_of thy) ("swap_" ^ ak_name);
    79         val swap_name = Sign.full_name thy ("swap_" ^ ak_name);
    80         val a = Free ("a", T);
    80         val a = Free ("a", T);
    81         val b = Free ("b", T);
    81         val b = Free ("b", T);
    82         val c = Free ("c", T);
    82         val c = Free ("c", T);
    83         val ab = Free ("ab", HOLogic.mk_prodT (T, T))
    83         val ab = Free ("ab", HOLogic.mk_prodT (T, T))
    84         val cif = Const ("HOL.If", HOLogic.boolT --> T --> T --> T);
    84         val cif = Const ("HOL.If", HOLogic.boolT --> T --> T --> T);
   103     (* <ak>_prm_<ak> []     a = a                                  *)
   103     (* <ak>_prm_<ak> []     a = a                                  *)
   104     (* <ak>_prm_<ak> (x#xs) a = swap_<ak> x (perm xs a)            *)
   104     (* <ak>_prm_<ak> (x#xs) a = swap_<ak> x (perm xs a)            *)
   105     val (prm_eqs, thy4) = fold_map (fn (ak_name, T) => fn thy =>
   105     val (prm_eqs, thy4) = fold_map (fn (ak_name, T) => fn thy =>
   106       let
   106       let
   107         val swapT = HOLogic.mk_prodT (T, T) --> T --> T;
   107         val swapT = HOLogic.mk_prodT (T, T) --> T --> T;
   108         val swap_name = Sign.full_name (sign_of thy) ("swap_" ^ ak_name)
   108         val swap_name = Sign.full_name thy ("swap_" ^ ak_name)
   109         val prmT = mk_permT T --> T --> T;
   109         val prmT = mk_permT T --> T --> T;
   110         val prm_name = ak_name ^ "_prm_" ^ ak_name;
   110         val prm_name = ak_name ^ "_prm_" ^ ak_name;
   111         val qu_prm_name = Sign.full_name (sign_of thy) prm_name;
   111         val qu_prm_name = Sign.full_name thy prm_name;
   112         val x  = Free ("x", HOLogic.mk_prodT (T, T));
   112         val x  = Free ("x", HOLogic.mk_prodT (T, T));
   113         val xs = Free ("xs", mk_permT T);
   113         val xs = Free ("xs", mk_permT T);
   114         val a  = Free ("a", T) ;
   114         val a  = Free ("a", T) ;
   115 
   115 
   116         val cnil  = Const ("List.list.Nil", mk_permT T);
   116         val cnil  = Const ("List.list.Nil", mk_permT T);
   139         let
   139         let
   140           val perm_def_name = ak_name ^ "_prm_" ^ ak_name';
   140           val perm_def_name = ak_name ^ "_prm_" ^ ak_name';
   141           val pi = Free ("pi", mk_permT T);
   141           val pi = Free ("pi", mk_permT T);
   142           val a  = Free ("a", T');
   142           val a  = Free ("a", T');
   143           val cperm = Const ("Nominal.perm", mk_permT T --> T' --> T');
   143           val cperm = Const ("Nominal.perm", mk_permT T --> T' --> T');
   144           val cperm_def = Const (Sign.full_name (sign_of thy') perm_def_name, mk_permT T --> T' --> T');
   144           val cperm_def = Const (Sign.full_name thy' perm_def_name, mk_permT T --> T' --> T');
   145 
   145 
   146           val name = ak_name ^ "_prm_" ^ ak_name' ^ "_def";
   146           val name = ak_name ^ "_prm_" ^ ak_name' ^ "_def";
   147           val def = Logic.mk_equals
   147           val def = Logic.mk_equals
   148                     (cperm $ pi $ a, if ak_name = ak_name' then cperm_def $ pi $ a else a)
   148                     (cperm $ pi $ a, if ak_name = ak_name' then cperm_def $ pi $ a else a)
   149         in
   149         in
   154     (* lemma at_<ak>_inst:                              *)
   154     (* lemma at_<ak>_inst:                              *)
   155     (* at TYPE(<ak>)                                    *)
   155     (* at TYPE(<ak>)                                    *)
   156     val (prm_cons_thms,thy6) = 
   156     val (prm_cons_thms,thy6) = 
   157       thy5 |> PureThy.add_thms (map (fn (ak_name, T) =>
   157       thy5 |> PureThy.add_thms (map (fn (ak_name, T) =>
   158       let
   158       let
   159         val ak_name_qu = Sign.full_name (sign_of thy5) (ak_name);
   159         val ak_name_qu = Sign.full_name thy5 (ak_name);
   160         val i_type = Type(ak_name_qu,[]);
   160         val i_type = Type(ak_name_qu,[]);
   161 	val cat = Const ("Nominal.at",(Term.itselfT i_type)  --> HOLogic.boolT);
   161 	val cat = Const ("Nominal.at",(Term.itselfT i_type)  --> HOLogic.boolT);
   162         val at_type = Logic.mk_type i_type;
   162         val at_type = Logic.mk_type i_type;
   163         val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy5
   163         val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy5
   164                                   [Name "at_def",
   164                                   [Name "at_def",
   215     (* lemma pt_<ak>_inst:                                    *)
   215     (* lemma pt_<ak>_inst:                                    *)
   216     (* pt TYPE('x::pt_<ak>) TYPE(<ak>)                        *)
   216     (* pt TYPE('x::pt_<ak>) TYPE(<ak>)                        *)
   217     val (prm_inst_thms,thy8) = 
   217     val (prm_inst_thms,thy8) = 
   218       thy7 |> PureThy.add_thms (map (fn (ak_name, T) =>
   218       thy7 |> PureThy.add_thms (map (fn (ak_name, T) =>
   219       let
   219       let
   220         val ak_name_qu = Sign.full_name (sign_of thy7) (ak_name);
   220         val ak_name_qu = Sign.full_name thy7 ak_name;
   221         val pt_name_qu = Sign.full_name (sign_of thy7) ("pt_"^ak_name);
   221         val pt_name_qu = Sign.full_name thy7 ("pt_"^ak_name);
   222         val i_type1 = TFree("'x",[pt_name_qu]);
   222         val i_type1 = TFree("'x",[pt_name_qu]);
   223         val i_type2 = Type(ak_name_qu,[]);
   223         val i_type2 = Type(ak_name_qu,[]);
   224 	val cpt = Const ("Nominal.pt",(Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);
   224 	val cpt = Const ("Nominal.pt",(Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);
   225         val pt_type = Logic.mk_type i_type1;
   225         val pt_type = Logic.mk_type i_type1;
   226         val at_type = Logic.mk_type i_type2;
   226         val at_type = Logic.mk_type i_type2;
   242      (* axclass fs_<ak>                                  *)
   242      (* axclass fs_<ak>                                  *)
   243      (* fs_<ak>1: finite ((supp x)::<ak> set)            *)
   243      (* fs_<ak>1: finite ((supp x)::<ak> set)            *)
   244      val (fs_ax_classes,thy11) =  fold_map (fn (ak_name, T) => fn thy =>
   244      val (fs_ax_classes,thy11) =  fold_map (fn (ak_name, T) => fn thy =>
   245        let 
   245        let 
   246 	  val cl_name = "fs_"^ak_name;
   246 	  val cl_name = "fs_"^ak_name;
   247 	  val pt_name = Sign.full_name (sign_of thy) ("pt_"^ak_name);
   247 	  val pt_name = Sign.full_name thy ("pt_"^ak_name);
   248           val ty = TFree("'a",["HOL.type"]);
   248           val ty = TFree("'a",["HOL.type"]);
   249           val x   = Free ("x", ty);
   249           val x   = Free ("x", ty);
   250           val csupp    = Const ("Nominal.supp", ty --> HOLogic.mk_setT T);
   250           val csupp    = Const ("Nominal.supp", ty --> HOLogic.mk_setT T);
   251           val cfinites = Const ("Finite_Set.Finites", HOLogic.mk_setT (HOLogic.mk_setT T))
   251           val cfinites = Const ("Finite_Set.Finites", HOLogic.mk_setT (HOLogic.mk_setT T))
   252           
   252           
   261      (* lemma abst_<ak>_inst:                                    *)
   261      (* lemma abst_<ak>_inst:                                    *)
   262      (* fs TYPE('x::pt_<ak>) TYPE (<ak>)                         *)
   262      (* fs TYPE('x::pt_<ak>) TYPE (<ak>)                         *)
   263      val (fs_inst_thms,thy12) = 
   263      val (fs_inst_thms,thy12) = 
   264        thy11 |> PureThy.add_thms (map (fn (ak_name, T) =>
   264        thy11 |> PureThy.add_thms (map (fn (ak_name, T) =>
   265        let
   265        let
   266          val ak_name_qu = Sign.full_name (sign_of thy11) (ak_name);
   266          val ak_name_qu = Sign.full_name thy11 ak_name;
   267          val fs_name_qu = Sign.full_name (sign_of thy11) ("fs_"^ak_name);
   267          val fs_name_qu = Sign.full_name thy11 ("fs_"^ak_name);
   268          val i_type1 = TFree("'x",[fs_name_qu]);
   268          val i_type1 = TFree("'x",[fs_name_qu]);
   269          val i_type2 = Type(ak_name_qu,[]);
   269          val i_type2 = Type(ak_name_qu,[]);
   270  	 val cfs = Const ("Nominal.fs", 
   270  	 val cfs = Const ("Nominal.fs", 
   271                                  (Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);
   271                                  (Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);
   272          val fs_type = Logic.mk_type i_type1;
   272          val fs_type = Logic.mk_type i_type1;
   309         (* lemma cp_<ak1>_<ak2>_inst:                                           *)
   309         (* lemma cp_<ak1>_<ak2>_inst:                                           *)
   310         (* cp TYPE('a::cp_<ak1>_<ak2>) TYPE(<ak1>) TYPE(<ak2>)                  *)
   310         (* cp TYPE('a::cp_<ak1>_<ak2>) TYPE(<ak1>) TYPE(<ak2>)                  *)
   311         val (cp_thms,thy12c) = fold_map (fn (ak_name, T) => fn thy =>
   311         val (cp_thms,thy12c) = fold_map (fn (ak_name, T) => fn thy =>
   312 	 fold_map (fn (ak_name', T') => fn thy' =>
   312 	 fold_map (fn (ak_name', T') => fn thy' =>
   313            let
   313            let
   314              val ak_name_qu  = Sign.full_name (sign_of thy') (ak_name);
   314              val ak_name_qu  = Sign.full_name thy' (ak_name);
   315 	     val ak_name_qu' = Sign.full_name (sign_of thy') (ak_name');
   315 	     val ak_name_qu' = Sign.full_name thy' (ak_name');
   316              val cp_name_qu  = Sign.full_name (sign_of thy') ("cp_"^ak_name^"_"^ak_name');
   316              val cp_name_qu  = Sign.full_name thy' ("cp_"^ak_name^"_"^ak_name');
   317              val i_type0 = TFree("'a",[cp_name_qu]);
   317              val i_type0 = TFree("'a",[cp_name_qu]);
   318              val i_type1 = Type(ak_name_qu,[]);
   318              val i_type1 = Type(ak_name_qu,[]);
   319              val i_type2 = Type(ak_name_qu',[]);
   319              val i_type2 = Type(ak_name_qu',[]);
   320 	     val ccp = Const ("Nominal.cp",
   320 	     val ccp = Const ("Nominal.cp",
   321                              (Term.itselfT i_type0)-->(Term.itselfT i_type1)-->
   321                              (Term.itselfT i_type0)-->(Term.itselfT i_type1)-->
   342         val (dj_thms, thy12d) = fold_map (fn (ak_name,T) => fn thy =>
   342         val (dj_thms, thy12d) = fold_map (fn (ak_name,T) => fn thy =>
   343 	  fold_map (fn (ak_name',T') => fn thy' =>
   343 	  fold_map (fn (ak_name',T') => fn thy' =>
   344           (if not (ak_name = ak_name') 
   344           (if not (ak_name = ak_name') 
   345            then 
   345            then 
   346 	       let
   346 	       let
   347 		 val ak_name_qu  = Sign.full_name (sign_of thy') (ak_name);
   347 		 val ak_name_qu  = Sign.full_name thy' ak_name;
   348 	         val ak_name_qu' = Sign.full_name (sign_of thy') (ak_name');
   348 	         val ak_name_qu' = Sign.full_name thy' ak_name';
   349                  val i_type1 = Type(ak_name_qu,[]);
   349                  val i_type1 = Type(ak_name_qu,[]);
   350                  val i_type2 = Type(ak_name_qu',[]);
   350                  val i_type2 = Type(ak_name_qu',[]);
   351 	         val cdj = Const ("Nominal.disjoint",
   351 	         val cdj = Const ("Nominal.disjoint",
   352                            (Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);
   352                            (Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);
   353                  val at_type  = Logic.mk_type i_type1;
   353                  val at_type  = Logic.mk_type i_type1;
   388      (* every <ak> is an instance of pt_<ak'>; the proof for       *)
   388      (* every <ak> is an instance of pt_<ak'>; the proof for       *)
   389      (* ak!=ak' is by definition; the case ak=ak' uses at_pt_inst. *)
   389      (* ak!=ak' is by definition; the case ak=ak' uses at_pt_inst. *)
   390      val thy13 = fold (fn ak_name => fn thy =>
   390      val thy13 = fold (fn ak_name => fn thy =>
   391 	fold (fn ak_name' => fn thy' =>
   391 	fold (fn ak_name' => fn thy' =>
   392          let
   392          let
   393            val qu_name =  Sign.full_name (sign_of thy') ak_name';
   393            val qu_name =  Sign.full_name thy' ak_name';
   394            val cls_name = Sign.full_name (sign_of thy') ("pt_"^ak_name);
   394            val cls_name = Sign.full_name thy' ("pt_"^ak_name);
   395            val at_inst  = PureThy.get_thm thy' (Name ("at_"^ak_name'^"_inst")); 
   395            val at_inst  = PureThy.get_thm thy' (Name ("at_"^ak_name'^"_inst")); 
   396 
   396 
   397            val proof1 = EVERY [ClassPackage.intro_classes_tac [],
   397            val proof1 = EVERY [ClassPackage.intro_classes_tac [],
   398                                  rtac ((at_inst RS at_pt_inst) RS pt1) 1,
   398                                  rtac ((at_inst RS at_pt_inst) RS pt1) 1,
   399                                  rtac ((at_inst RS at_pt_inst) RS pt2) 1,
   399                                  rtac ((at_inst RS at_pt_inst) RS pt2) 1,
   419      (*      unit                       *)
   419      (*      unit                       *)
   420      (*      set(pt_<ak>)               *)
   420      (*      set(pt_<ak>)               *)
   421      (* are instances of pt_<ak>        *)
   421      (* are instances of pt_<ak>        *)
   422      val thy18 = fold (fn ak_name => fn thy =>
   422      val thy18 = fold (fn ak_name => fn thy =>
   423        let
   423        let
   424           val cls_name = Sign.full_name (sign_of thy) ("pt_"^ak_name);
   424           val cls_name = Sign.full_name thy ("pt_"^ak_name);
   425           val at_thm   = PureThy.get_thm thy (Name ("at_"^ak_name^"_inst"));
   425           val at_thm   = PureThy.get_thm thy (Name ("at_"^ak_name^"_inst"));
   426           val pt_inst  = PureThy.get_thm thy (Name ("pt_"^ak_name^"_inst"));
   426           val pt_inst  = PureThy.get_thm thy (Name ("pt_"^ak_name^"_inst"));
   427 
   427 
   428           fun pt_proof thm = 
   428           fun pt_proof thm = 
   429               EVERY [ClassPackage.intro_classes_tac [],
   429               EVERY [ClassPackage.intro_classes_tac [],
   465        (* shows that <ak> is an instance of fs_<ak>     *)
   465        (* shows that <ak> is an instance of fs_<ak>     *)
   466        (* uses the theorem at_<ak>_inst                 *)
   466        (* uses the theorem at_<ak>_inst                 *)
   467        val thy20 = fold (fn ak_name => fn thy =>
   467        val thy20 = fold (fn ak_name => fn thy =>
   468         fold (fn ak_name' => fn thy' =>
   468         fold (fn ak_name' => fn thy' =>
   469         let
   469         let
   470            val qu_name =  Sign.full_name (sign_of thy') ak_name';
   470            val qu_name =  Sign.full_name thy' ak_name';
   471            val qu_class = Sign.full_name (sign_of thy') ("fs_"^ak_name);
   471            val qu_class = Sign.full_name thy' ("fs_"^ak_name);
   472            val proof =
   472            val proof =
   473                (if ak_name = ak_name'
   473                (if ak_name = ak_name'
   474                 then
   474                 then
   475                   let val at_thm = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst"));
   475                   let val at_thm = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst"));
   476                   in  EVERY [ClassPackage.intro_classes_tac [],
   476                   in  EVERY [ClassPackage.intro_classes_tac [],
   491        (*    option(fs_<ak>)          *) 
   491        (*    option(fs_<ak>)          *) 
   492        (* are instances of fs_<ak>    *)
   492        (* are instances of fs_<ak>    *)
   493 
   493 
   494        val thy24 = fold (fn ak_name => fn thy => 
   494        val thy24 = fold (fn ak_name => fn thy => 
   495         let
   495         let
   496           val cls_name = Sign.full_name (sign_of thy) ("fs_"^ak_name);
   496           val cls_name = Sign.full_name thy ("fs_"^ak_name);
   497           val fs_inst  = PureThy.get_thm thy (Name ("fs_"^ak_name^"_inst"));
   497           val fs_inst  = PureThy.get_thm thy (Name ("fs_"^ak_name^"_inst"));
   498           fun fs_proof thm = EVERY [ClassPackage.intro_classes_tac [], rtac (thm RS fs1) 1];
   498           fun fs_proof thm = EVERY [ClassPackage.intro_classes_tac [], rtac (thm RS fs1) 1];
   499 
   499 
   500           val fs_thm_unit  = fs_unit_inst;
   500           val fs_thm_unit  = fs_unit_inst;
   501           val fs_thm_prod  = fs_inst RS (fs_inst RS fs_prod_inst);
   501           val fs_thm_prod  = fs_inst RS (fs_inst RS fs_prod_inst);
   531        (* for every  <ak>/<ai>-combination                *)
   531        (* for every  <ak>/<ai>-combination                *)
   532        val thy25 = fold (fn ak_name => fn thy =>
   532        val thy25 = fold (fn ak_name => fn thy =>
   533          fold (fn ak_name' => fn thy' =>
   533          fold (fn ak_name' => fn thy' =>
   534           fold (fn ak_name'' => fn thy'' =>
   534           fold (fn ak_name'' => fn thy'' =>
   535             let
   535             let
   536               val name =  Sign.full_name (sign_of thy'') ak_name;
   536               val name =  Sign.full_name thy'' ak_name;
   537               val cls_name = Sign.full_name (sign_of thy'') ("cp_"^ak_name'^"_"^ak_name'');
   537               val cls_name = Sign.full_name thy'' ("cp_"^ak_name'^"_"^ak_name'');
   538               val proof =
   538               val proof =
   539                 (if (ak_name'=ak_name'') then 
   539                 (if (ak_name'=ak_name'') then 
   540                   (let
   540                   (let
   541                     val pt_inst  = PureThy.get_thm thy'' (Name ("pt_"^ak_name''^"_inst"));
   541                     val pt_inst  = PureThy.get_thm thy'' (Name ("pt_"^ak_name''^"_inst"));
   542                     val at_inst  = PureThy.get_thm thy'' (Name ("at_"^ak_name''^"_inst"));
   542                     val at_inst  = PureThy.get_thm thy'' (Name ("at_"^ak_name''^"_inst"));
   568        (*      noptions                                                 *)
   568        (*      noptions                                                 *)
   569        (* are instances of cp_<ak>_<ai> for every <ak>/<ai>-combination *)
   569        (* are instances of cp_<ak>_<ai> for every <ak>/<ai>-combination *)
   570        val thy26 = fold (fn ak_name => fn thy =>
   570        val thy26 = fold (fn ak_name => fn thy =>
   571 	fold (fn ak_name' => fn thy' =>
   571 	fold (fn ak_name' => fn thy' =>
   572         let
   572         let
   573             val cls_name = Sign.full_name (sign_of thy') ("cp_"^ak_name^"_"^ak_name');
   573             val cls_name = Sign.full_name thy' ("cp_"^ak_name^"_"^ak_name');
   574             val cp_inst  = PureThy.get_thm thy' (Name ("cp_"^ak_name^"_"^ak_name'^"_inst"));
   574             val cp_inst  = PureThy.get_thm thy' (Name ("cp_"^ak_name^"_"^ak_name'^"_inst"));
   575             val pt_inst  = PureThy.get_thm thy' (Name ("pt_"^ak_name^"_inst"));
   575             val pt_inst  = PureThy.get_thm thy' (Name ("pt_"^ak_name^"_inst"));
   576             val at_inst  = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst"));
   576             val at_inst  = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst"));
   577 
   577 
   578             fun cp_proof thm  = EVERY [ClassPackage.intro_classes_tac [],rtac (thm RS cp1) 1];
   578             fun cp_proof thm  = EVERY [ClassPackage.intro_classes_tac [],rtac (thm RS cp1) 1];
   600      val thy32 =
   600      val thy32 =
   601         let
   601         let
   602 	  fun discrete_pt_inst discrete_ty defn =
   602 	  fun discrete_pt_inst discrete_ty defn =
   603 	     fold (fn ak_name => fn thy =>
   603 	     fold (fn ak_name => fn thy =>
   604 	     let
   604 	     let
   605 	       val qu_class = Sign.full_name (sign_of thy) ("pt_"^ak_name);
   605 	       val qu_class = Sign.full_name thy ("pt_"^ak_name);
   606 	       val simp_s = HOL_basic_ss addsimps [defn];
   606 	       val simp_s = HOL_basic_ss addsimps [defn];
   607                val proof = EVERY [ClassPackage.intro_classes_tac [], REPEAT (asm_simp_tac simp_s 1)];
   607                val proof = EVERY [ClassPackage.intro_classes_tac [], REPEAT (asm_simp_tac simp_s 1)];
   608              in 
   608              in 
   609 	       AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy
   609 	       AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy
   610              end) ak_names;
   610              end) ak_names;
   611 
   611 
   612           fun discrete_fs_inst discrete_ty defn = 
   612           fun discrete_fs_inst discrete_ty defn = 
   613 	     fold (fn ak_name => fn thy =>
   613 	     fold (fn ak_name => fn thy =>
   614 	     let
   614 	     let
   615 	       val qu_class = Sign.full_name (sign_of thy) ("fs_"^ak_name);
   615 	       val qu_class = Sign.full_name thy ("fs_"^ak_name);
   616 	       val supp_def = thm "Nominal.supp_def";
   616 	       val supp_def = thm "Nominal.supp_def";
   617                val simp_s = HOL_ss addsimps [supp_def,Collect_const,Finites.emptyI,defn];
   617                val simp_s = HOL_ss addsimps [supp_def,Collect_const,Finites.emptyI,defn];
   618                val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1];
   618                val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1];
   619              in 
   619              in 
   620 	       AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy
   620 	       AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy
   621              end) ak_names;
   621              end) ak_names;
   622 
   622 
   623           fun discrete_cp_inst discrete_ty defn = 
   623           fun discrete_cp_inst discrete_ty defn = 
   624 	     fold (fn ak_name' => (fold (fn ak_name => fn thy =>
   624 	     fold (fn ak_name' => (fold (fn ak_name => fn thy =>
   625 	     let
   625 	     let
   626 	       val qu_class = Sign.full_name (sign_of thy) ("cp_"^ak_name^"_"^ak_name');
   626 	       val qu_class = Sign.full_name thy ("cp_"^ak_name^"_"^ak_name');
   627 	       val supp_def = thm "Nominal.supp_def";
   627 	       val supp_def = thm "Nominal.supp_def";
   628                val simp_s = HOL_ss addsimps [defn];
   628                val simp_s = HOL_ss addsimps [defn];
   629                val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1];
   629                val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1];
   630              in
   630              in
   631 	       AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy
   631 	       AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy