datatype.ML
changeset 146 85f62d491ff7
parent 143 3226f25f88e7
child 147 8ff6c8c95870
equal deleted inserted replaced
145:a9f7ff3a464c 146:85f62d491ff7
   232 		      ^ "   " ^ Sign.string_of_term (sign_of thy) eq);
   232 		      ^ "   " ^ Sign.string_of_term (sign_of thy) eq);
   233     in (  name1, ls1
   233     in (  name1, ls1
   234 	, check_and_sort (length cs, trans_recs' [] (eq1::eqs)))
   234 	, check_and_sort (length cs, trans_recs' [] (eq1::eqs)))
   235     end ;
   235     end ;
   236 
   236 
   237 
       
   238 fun instantiate_types thy t =
       
   239   let val sg = sign_of thy
       
   240       val rsg = Sign.rep_sg sg
       
   241   in  fst(Type.infer_types(#tsig rsg, Sign.const_type sg, K None, K None,
       
   242 			   TVar(("",0),[]), t))
       
   243   end;
       
   244 
       
   245 in
   237 in
   246   fun add_datatype (typevars, tname, cons_list') thy = 
   238   fun add_datatype (typevars, tname, cons_list') thy = 
   247     let (*search for free type variables and convert recursive *)
   239     let (*search for free type variables and convert recursive *)
   248       fun analyse_types (cons, typlist, syn) =
   240       fun analyse_types (cons, typlist, syn) =
   249 	let fun analyse(t as dtVar v) =
   241 	let fun analyse(t as dtVar v) =
   528 	    list_abs_free
   520 	    list_abs_free
   529 	    (ls @ [(tname,dummyT)]
   521 	    (ls @ [(tname,dummyT)]
   530 	     ,list_comb(rec_comb
   522 	     ,list_comb(rec_comb
   531 			, fns @ map Bound (0 ::(length ls downto 1))));
   523 			, fns @ map Bound (0 ::(length ls downto 1))));
   532           val sg = sign_of thy;
   524           val sg = sign_of thy;
   533           val (defname,def) =  mk_defpair (Const(fname,dummyT),rhs)
   525           val defpair as (defname,_) =  mk_defpair (Const(fname,dummyT),rhs)
   534 	  val tdef as ( _ $ Const(_,T) $ _ ) = instantiate_types thy def;
   526 	  val (_,tdef as ( _ $ Const(_,T) $ _ )) = inferT_axm sg defpair;
   535 	  val varT = Type.varifyT T;
   527 	  val varT = Type.varifyT T;
   536           val Some(ftyp) = Sign.const_type sg fname;
   528           val Some(ftyp) = Sign.const_type sg fname;
   537 	in
   529 	in
   538 	  if Type.typ_instance (#tsig(Sign.rep_sg sg), ftyp, varT)
   530 	  if Type.typ_instance (#tsig(Sign.rep_sg sg), ftyp, varT)
   539 	  then add_defs_i [(defname,tdef)] thy
   531 	  then add_defs_i [(defname,tdef)] thy