src/HOL/Tools/datatype_prop.ML
changeset 30190 479806475f3c
parent 29270 0eade173f77e
child 30280 eb98b49ef835
equal deleted inserted replaced
30189:3633f560f4c3 30190:479806475f3c
   203 
   203 
   204 fun make_primrecs new_type_names descr sorts thy =
   204 fun make_primrecs new_type_names descr sorts thy =
   205   let
   205   let
   206     val descr' = List.concat descr;
   206     val descr' = List.concat descr;
   207     val recTs = get_rec_types descr' sorts;
   207     val recTs = get_rec_types descr' sorts;
   208     val used = foldr OldTerm.add_typ_tfree_names [] recTs;
   208     val used = List.foldr OldTerm.add_typ_tfree_names [] recTs;
   209 
   209 
   210     val (rec_result_Ts, reccomb_fn_Ts) = make_primrec_Ts descr sorts used;
   210     val (rec_result_Ts, reccomb_fn_Ts) = make_primrec_Ts descr sorts used;
   211 
   211 
   212     val rec_fns = map (uncurry (mk_Free "f"))
   212     val rec_fns = map (uncurry (mk_Free "f"))
   213       (reccomb_fn_Ts ~~ (1 upto (length reccomb_fn_Ts)));
   213       (reccomb_fn_Ts ~~ (1 upto (length reccomb_fn_Ts)));
   253 
   253 
   254 fun make_case_combs new_type_names descr sorts thy fname =
   254 fun make_case_combs new_type_names descr sorts thy fname =
   255   let
   255   let
   256     val descr' = List.concat descr;
   256     val descr' = List.concat descr;
   257     val recTs = get_rec_types descr' sorts;
   257     val recTs = get_rec_types descr' sorts;
   258     val used = foldr OldTerm.add_typ_tfree_names [] recTs;
   258     val used = List.foldr OldTerm.add_typ_tfree_names [] recTs;
   259     val newTs = Library.take (length (hd descr), recTs);
   259     val newTs = Library.take (length (hd descr), recTs);
   260     val T' = TFree (Name.variant used "'t", HOLogic.typeS);
   260     val T' = TFree (Name.variant used "'t", HOLogic.typeS);
   261 
   261 
   262     val case_fn_Ts = map (fn (i, (_, _, constrs)) =>
   262     val case_fn_Ts = map (fn (i, (_, _, constrs)) =>
   263       map (fn (_, cargs) =>
   263       map (fn (_, cargs) =>
   300 
   300 
   301 fun make_splits new_type_names descr sorts thy =
   301 fun make_splits new_type_names descr sorts thy =
   302   let
   302   let
   303     val descr' = List.concat descr;
   303     val descr' = List.concat descr;
   304     val recTs = get_rec_types descr' sorts;
   304     val recTs = get_rec_types descr' sorts;
   305     val used' = foldr OldTerm.add_typ_tfree_names [] recTs;
   305     val used' = List.foldr OldTerm.add_typ_tfree_names [] recTs;
   306     val newTs = Library.take (length (hd descr), recTs);
   306     val newTs = Library.take (length (hd descr), recTs);
   307     val T' = TFree (Name.variant used' "'t", HOLogic.typeS);
   307     val T' = TFree (Name.variant used' "'t", HOLogic.typeS);
   308     val P = Free ("P", T' --> HOLogic.boolT);
   308     val P = Free ("P", T' --> HOLogic.boolT);
   309 
   309 
   310     fun make_split (((_, (_, _, constrs)), T), comb_t) =
   310     fun make_split (((_, (_, _, constrs)), T), comb_t) =
   317             val Ts = map (typ_of_dtyp descr' sorts) cargs;
   317             val Ts = map (typ_of_dtyp descr' sorts) cargs;
   318             val frees = map Free (Name.variant_list used (make_tnames Ts) ~~ Ts);
   318             val frees = map Free (Name.variant_list used (make_tnames Ts) ~~ Ts);
   319             val eqn = HOLogic.mk_eq (Free ("x", T),
   319             val eqn = HOLogic.mk_eq (Free ("x", T),
   320               list_comb (Const (cname, Ts ---> T), frees));
   320               list_comb (Const (cname, Ts ---> T), frees));
   321             val P' = P $ list_comb (f, frees)
   321             val P' = P $ list_comb (f, frees)
   322           in ((foldr (fn (Free (s, T), t) => HOLogic.mk_all (s, T, t))
   322           in ((List.foldr (fn (Free (s, T), t) => HOLogic.mk_all (s, T, t))
   323                 (HOLogic.imp $ eqn $ P') frees)::t1s,
   323                 (HOLogic.imp $ eqn $ P') frees)::t1s,
   324               (foldr (fn (Free (s, T), t) => HOLogic.mk_exists (s, T, t))
   324               (List.foldr (fn (Free (s, T), t) => HOLogic.mk_exists (s, T, t))
   325                 (HOLogic.conj $ eqn $ (HOLogic.Not $ P')) frees)::t2s)
   325                 (HOLogic.conj $ eqn $ (HOLogic.Not $ P')) frees)::t2s)
   326           end;
   326           end;
   327 
   327 
   328         val (t1s, t2s) = foldr process_constr ([], []) (constrs ~~ fs);
   328         val (t1s, t2s) = List.foldr process_constr ([], []) (constrs ~~ fs);
   329         val lhs = P $ (comb_t $ Free ("x", T))
   329         val lhs = P $ (comb_t $ Free ("x", T))
   330       in
   330       in
   331         (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, mk_conj t1s)),
   331         (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, mk_conj t1s)),
   332          HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, HOLogic.Not $ mk_disj t2s)))
   332          HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, HOLogic.Not $ mk_disj t2s)))
   333       end
   333       end
   420       let
   420       let
   421         val Ts = map (typ_of_dtyp descr' sorts) cargs;
   421         val Ts = map (typ_of_dtyp descr' sorts) cargs;
   422         val tnames = Name.variant_list ["v"] (make_tnames Ts);
   422         val tnames = Name.variant_list ["v"] (make_tnames Ts);
   423         val frees = tnames ~~ Ts
   423         val frees = tnames ~~ Ts
   424       in
   424       in
   425         foldr (fn ((s, T'), t) => HOLogic.mk_exists (s, T', t))
   425         List.foldr (fn ((s, T'), t) => HOLogic.mk_exists (s, T', t))
   426           (HOLogic.mk_eq (Free ("v", T),
   426           (HOLogic.mk_eq (Free ("v", T),
   427             list_comb (Const (cname, Ts ---> T), map Free frees))) frees
   427             list_comb (Const (cname, Ts ---> T), map Free frees))) frees
   428       end
   428       end
   429 
   429 
   430   in map (fn ((_, (_, _, constrs)), T) =>
   430   in map (fn ((_, (_, _, constrs)), T) =>