src/HOL/Tools/datatype_codegen.ML
changeset 20435 d2a30fed7596
parent 20426 9ffea7a8b31c
child 20439 1bf42b262a38
equal deleted inserted replaced
20434:110a223ba63c 20435:d2a30fed7596
   368         val t = HOLogic.mk_not prem;
   368         val t = HOLogic.mk_not prem;
   369       in HOLogic.mk_Trueprop t end;
   369       in HOLogic.mk_Trueprop t end;
   370   in map mk_dist (sym_product cos) end;
   370   in map mk_dist (sym_product cos) end;
   371 
   371 
   372 local
   372 local
       
   373   val not_sym = thm "HOL.not_sym";
   373   val not_false_true = iffD2 OF [nth (thms "HOL.simp_thms") 7, TrueI];
   374   val not_false_true = iffD2 OF [nth (thms "HOL.simp_thms") 7, TrueI];
   374 in fun get_eq thy dtco =
   375 in fun get_eq thy dtco =
   375   let
   376   let
   376     val SOME (vs, cs) = DatatypePackage.get_datatype_spec thy dtco;
   377     val SOME (vs, cs) = DatatypePackage.get_datatype_spec thy dtco;
   377     fun mk_triv_inject co =
   378     fun mk_triv_inject co =
   394     val tac = ALLGOALS (simp_tac simpset)
   395     val tac = ALLGOALS (simp_tac simpset)
   395       THEN ALLGOALS (ProofContext.fact_tac [not_false_true, TrueI]);
   396       THEN ALLGOALS (ProofContext.fact_tac [not_false_true, TrueI]);
   396     val distinct =
   397     val distinct =
   397       mk_distinct cos
   398       mk_distinct cos
   398       |> map (fn t => Goal.prove_global thy [] [] t (K tac))
   399       |> map (fn t => Goal.prove_global thy [] [] t (K tac))
       
   400       |> (fn thms => thms @ map (fn thm => not_sym OF [thm]) thms)
   399   in inject1 @ inject2 @ distinct end;
   401   in inject1 @ inject2 @ distinct end;
   400 end (*local*);
   402 end (*local*);
   401 
   403 
   402 fun datatype_tac thy dtco =
   404 fun datatype_tac thy dtco =
   403   let
   405   let