src/HOL/Mutabelle/Mutabelle.thy
author haftmann
Fri, 02 Mar 2012 21:45:45 +0100
changeset 46767 807a5d219c23
parent 46711 f745bcc4a1e5
child 48891 c0eafbd55de3
permissions -rw-r--r--
more fundamental pred-to-set conversions for range and domain by means of inductive_set

(* FIXME dead code!?!? *)

theory Mutabelle
imports Main
uses "mutabelle.ML"
begin

ML {*
val comms = [@{const_name HOL.eq}, @{const_name HOL.disj}, @{const_name HOL.conj}];

val forbidden =
 [(@{const_name Power.power}, "'a"),
  (@{const_name HOL.induct_equal}, "'a"),
  (@{const_name HOL.induct_implies}, "'a"),
  (@{const_name HOL.induct_conj}, "'a"),
  (@{const_name HOL.undefined}, "'a"),
  (@{const_name HOL.default}, "'a"),
  (@{const_name dummy_pattern}, "'a::{}"),
  (@{const_name Groups.uminus}, "'a"),
  (@{const_name Nat.size}, "'a"),
  (@{const_name Groups.abs}, "'a")];

val forbidden_thms =
 ["finite_intvl_succ_class",
  "nibble"];

val forbidden_consts =
 [@{const_name nibble_pair_of_char}];

fun is_forbidden s th =
 exists (fn s' => s' mem Long_Name.explode s) forbidden_thms orelse
 exists (fn s' => s' mem (Term.add_const_names (prop_of th) [])) forbidden_consts;

fun test j = List.app (fn i =>
 Mutabelle.mutqc_thystat_mix is_forbidden
   @{theory List} @{theory Main} comms forbidden 1 [] i j ("list_" ^ string_of_int i ^ ".txt"))
 (1 upto 10);

fun get_numbers xs =
 let
   val (_, xs1) = take_prefix (not o equal ":") xs;
   val (_, xs2) = take_prefix (fn ":" => true | " " => true | _ => false) xs1;
   val (xs3, xs4) = take_prefix Symbol.is_digit xs2;
   val (_, xs5) = take_prefix (equal " ") xs4;
   val (xs6, xs7) = take_prefix Symbol.is_digit xs5
 in
   case (xs3, xs6) of
     ([], _) => NONE
   | (_, []) => NONE
   | (ys, zs) => SOME (fst (read_int ys), fst (read_int zs), xs7)
 end;

fun add_numbers s =
 let
   fun strip ("\n" :: "\n" :: "\n" :: xs) = xs
     | strip (_ :: xs) = strip xs;

   fun add (i, j) xs = (case get_numbers xs of
         NONE => (i, j)
       | SOME (i', j', xs') => add (i+i', j+j') xs')
 in add (0,0) (strip (explode s)) end;
*}

(*
ML {*
Quickcheck.test_term (Proof_Context.init_global @{theory})
 false (SOME "SML") 1 1 (prop_of (hd @{thms nibble_pair_of_char_simps}))
*}

ML {*
fun is_executable thy th = can (Quickcheck.test_term
 (Proof_Context.init_global thy) false (SOME "SML") 1 1) (prop_of th);

fun is_executable_term thy t = can (Quickcheck.test_term
 (Proof_Context.init_global thy) false (SOME "SML") 1 1) t;

fun thms_of thy = filter (fn (_, th) => not (Thm.is_internal th) andalso
   Context.theory_name (theory_of_thm th) = Context.theory_name thy andalso
   is_executable thy th)
 (Global_Theory.all_thms_of thy);

fun find_thm thy = find_first (fn (_, th) => not (Thm.is_internal th) andalso
   Context.theory_name (theory_of_thm th) = Context.theory_name thy andalso
   is_executable thy th)
 (Global_Theory.all_thms_of thy);
*}

ML {*
is_executable @{theory} (hd @{thms nibble_pair_of_char_simps})
*}
*)

ML {*
Mutabelle.mutate_mix @{term "Suc x \<noteq> 0"} @{theory} comms forbidden 1
*}

ML {*
Mutabelle.mutqc_thystat_mix is_forbidden @{theory Nat} @{theory} comms forbidden 1 [] 10 5 "/tmp/muta.out"
*}

end