src/ZF/Datatype.ML
changeset 16973 b2a894562b8f
parent 16425 2427be27cc60
child 17224 a78339014063
equal deleted inserted replaced
16972:d3f9abe00712 16973:b2a894562b8f
    60   fun mk_new ([],[]) = Const("True",FOLogic.oT)
    60   fun mk_new ([],[]) = Const("True",FOLogic.oT)
    61     | mk_new (largs,rargs) =
    61     | mk_new (largs,rargs) =
    62         fold_bal FOLogic.mk_conj
    62         fold_bal FOLogic.mk_conj
    63                  (map FOLogic.mk_eq (ListPair.zip (largs,rargs)));
    63                  (map FOLogic.mk_eq (ListPair.zip (largs,rargs)));
    64 
    64 
    65  val datatype_ss = simpset_of (the_context ());
    65  val datatype_ss = simpset ();
    66 
    66 
    67  fun proc sg _ old =
    67  fun proc sg ss old =
    68    let val _ = if !trace then writeln ("data_free: OLD = " ^ 
    68    let val _ = if !trace then writeln ("data_free: OLD = " ^ 
    69                                        string_of_cterm (cterm_of sg old))
    69                                        string_of_cterm (cterm_of sg old))
    70                else ()
    70                else ()
    71        val (lhs,rhs) = FOLogic.dest_eq old
    71        val (lhs,rhs) = FOLogic.dest_eq old
    72        val (lhead, largs) = strip_comb lhs
    72        val (lhead, largs) = strip_comb lhs
    86        val _ = if !trace then 
    86        val _ = if !trace then 
    87                  writeln ("NEW = " ^ string_of_cterm (Thm.cterm_of sg new))
    87                  writeln ("NEW = " ^ string_of_cterm (Thm.cterm_of sg new))
    88                else ();
    88                else ();
    89        val goal = Logic.mk_equals (old, new)
    89        val goal = Logic.mk_equals (old, new)
    90        val thm = Tactic.prove sg [] [] goal (fn _ => rtac iff_reflection 1 THEN
    90        val thm = Tactic.prove sg [] [] goal (fn _ => rtac iff_reflection 1 THEN
    91            simp_tac (datatype_ss addsimps #free_iffs lcon_info) 1)
    91            simp_tac (Simplifier.inherit_bounds ss datatype_ss addsimps #free_iffs lcon_info) 1)
    92          handle ERROR_MESSAGE msg =>
    92          handle ERROR_MESSAGE msg =>
    93          (warning (msg ^ "\ndata_free simproc:\nfailed to prove " ^ Sign.string_of_term sg goal);
    93          (warning (msg ^ "\ndata_free simproc:\nfailed to prove " ^ Sign.string_of_term sg goal);
    94           raise Match)
    94           raise Match)
    95    in SOME thm end
    95    in SOME thm end
    96    handle Match => NONE;
    96    handle Match => NONE;
    97 
    97 
    98 
    98 
    99  val conv = 
    99  val conv = Simplifier.simproc (theory "ZF") "data_free" ["(x::i) = y"] proc;
   100      Simplifier.simproc (Theory.sign_of (theory "ZF")) "data_free" 
   100 
   101                         ["(x::i) = y"] proc;
       
   102 end;
   101 end;
   103 
   102 
   104 
   103 
   105 Addsimprocs [DataFree.conv];
   104 Addsimprocs [DataFree.conv];