src/HOL/Tools/Datatype/datatype_prop.ML
changeset 45743 857b7fcb0365
parent 45739 b545ea8bc731
child 45821 c2f6c50e3d42
equal deleted inserted replaced
45742:debb68e8d23f 45743:857b7fcb0365
    67         let
    67         let
    68           val Ts = map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs;
    68           val Ts = map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs;
    69           val constr_t = Const (cname, Ts ---> T);
    69           val constr_t = Const (cname, Ts ---> T);
    70           val tnames = make_tnames Ts;
    70           val tnames = make_tnames Ts;
    71           val frees = map Free (tnames ~~ Ts);
    71           val frees = map Free (tnames ~~ Ts);
    72           val frees' = map Free ((map ((op ^) o (rpair "'")) tnames) ~~ Ts);
    72           val frees' = map Free (map (suffix "'") tnames ~~ Ts);
    73         in cons (HOLogic.mk_Trueprop (HOLogic.mk_eq
    73         in
    74           (HOLogic.mk_eq (list_comb (constr_t, frees), list_comb (constr_t, frees')),
    74           cons (HOLogic.mk_Trueprop (HOLogic.mk_eq
    75            foldr1 (HOLogic.mk_binop @{const_name HOL.conj})
    75             (HOLogic.mk_eq (list_comb (constr_t, frees), list_comb (constr_t, frees')),
    76              (map HOLogic.mk_eq (frees ~~ frees')))))
    76              foldr1 (HOLogic.mk_binop @{const_name HOL.conj})
       
    77                (map HOLogic.mk_eq (frees ~~ frees')))))
    77         end;
    78         end;
    78   in
    79   in
    79     map2 (fn d => fn T => fold_rev (make_inj T) (#3 (snd d)) [])
    80     map2 (fn d => fn T => fold_rev (make_inj T) (#3 (snd d)) [])
    80       (hd descr) (take (length (hd descr)) (Datatype_Aux.get_rec_types descr' sorts))
    81       (hd descr) (take (length (hd descr)) (Datatype_Aux.get_rec_types descr' sorts))
    81   end;
    82   end;
    93       (cname, map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs);
    94       (cname, map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs);
    94 
    95 
    95     fun make_distincts' _ [] = []
    96     fun make_distincts' _ [] = []
    96       | make_distincts' T ((cname, cargs) :: constrs) =
    97       | make_distincts' T ((cname, cargs) :: constrs) =
    97           let
    98           let
    98             val frees = map Free ((make_tnames cargs) ~~ cargs);
    99             val frees = map Free (make_tnames cargs ~~ cargs);
    99             val t = list_comb (Const (cname, cargs ---> T), frees);
   100             val t = list_comb (Const (cname, cargs ---> T), frees);
   100 
   101 
   101             fun make_distincts'' (cname', cargs') =
   102             fun make_distincts'' (cname', cargs') =
   102               let
   103               let
   103                 val frees' = map Free (map (suffix "'") (make_tnames cargs') ~~ cargs');
   104                 val frees' = map Free (map (suffix "'") (make_tnames cargs') ~~ cargs');
   345         (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, Datatype_Aux.mk_conj t1s)),
   346         (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, Datatype_Aux.mk_conj t1s)),
   346          HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, HOLogic.Not $ Datatype_Aux.mk_disj t2s)))
   347          HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, HOLogic.Not $ Datatype_Aux.mk_disj t2s)))
   347       end
   348       end
   348 
   349 
   349   in
   350   in
   350     map make_split
   351     map make_split (hd descr ~~ newTs ~~ make_case_combs new_type_names descr sorts thy "f")
   351       ((hd descr) ~~ newTs ~~ (make_case_combs new_type_names descr sorts thy "f"))
       
   352   end;
   352   end;
   353 
   353 
   354 (************************* additional rules for TFL ***************************)
   354 (************************* additional rules for TFL ***************************)
   355 
   355 
   356 fun make_weak_case_congs new_type_names descr sorts thy =
   356 fun make_weak_case_congs new_type_names descr sorts thy =
   398 
   398 
   399         fun mk_clause ((f, g), (cname, _)) =
   399         fun mk_clause ((f, g), (cname, _)) =
   400           let
   400           let
   401             val Ts = binder_types (fastype_of f);
   401             val Ts = binder_types (fastype_of f);
   402             val tnames = Name.variant_list used (make_tnames Ts);
   402             val tnames = Name.variant_list used (make_tnames Ts);
   403             val frees = map Free (tnames ~~ Ts)
   403             val frees = map Free (tnames ~~ Ts);
   404           in
   404           in
   405             list_all_free (tnames ~~ Ts, Logic.mk_implies
   405             list_all_free (tnames ~~ Ts, Logic.mk_implies
   406               (HOLogic.mk_Trueprop
   406               (HOLogic.mk_Trueprop
   407                 (HOLogic.mk_eq (M', list_comb (Const (cname, Ts ---> T), frees))),
   407                 (HOLogic.mk_eq (M', list_comb (Const (cname, Ts ---> T), frees))),
   408                HOLogic.mk_Trueprop
   408                HOLogic.mk_Trueprop
   431 
   431 
   432     fun mk_eqn T (cname, cargs) =
   432     fun mk_eqn T (cname, cargs) =
   433       let
   433       let
   434         val Ts = map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs;
   434         val Ts = map (Datatype_Aux.typ_of_dtyp descr' sorts) cargs;
   435         val tnames = Name.variant_list ["v"] (make_tnames Ts);
   435         val tnames = Name.variant_list ["v"] (make_tnames Ts);
   436         val frees = tnames ~~ Ts
   436         val frees = tnames ~~ Ts;
   437       in
   437       in
   438         fold_rev (fn (s, T') => fn t => HOLogic.mk_exists (s, T', t)) frees
   438         fold_rev (fn (s, T') => fn t => HOLogic.mk_exists (s, T', t)) frees
   439           (HOLogic.mk_eq (Free ("v", T),
   439           (HOLogic.mk_eq (Free ("v", T),
   440             list_comb (Const (cname, Ts ---> T), map Free frees)))
   440             list_comb (Const (cname, Ts ---> T), map Free frees)))
   441       end;
   441       end;