| author | wenzelm | 
| Sat, 13 Nov 2021 17:26:35 +0100 | |
| changeset 74779 | 5fca489a6ac1 | 
| parent 69597 | ff784d5a5bfb | 
| child 77889 | 5db014c36f42 | 
| permissions | -rw-r--r-- | 
| 37744 | 1 | (* Title: HOL/Mutabelle/mutabelle_extra.ML | 
| 34965 | 2 | Author: Stefan Berghofer, Jasmin Blanchette, Lukas Bulwahn, TU Muenchen | 
| 3 | ||
| 41408 | 4 | Invokation of Counterexample generators. | 
| 34965 | 5 | *) | 
| 41408 | 6 | |
| 34965 | 7 | signature MUTABELLE_EXTRA = | 
| 8 | sig | |
| 9 | ||
| 10 | val take_random : int -> 'a list -> 'a list | |
| 11 | ||
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 12 | datatype outcome = GenuineCex | PotentialCex | NoCex | Donno | Timeout | Error | Solved | Unsolved | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 13 | type timings = (string * int) list | 
| 34965 | 14 | |
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 15 | type mtd = string * (theory -> term -> outcome * timings) | 
| 35324 
c9f428269b38
adopting mutabelle and quickcheck to return timing information; exporting make_case_combs in datatype package for predicate compiler; adding Spec_Rules declaration for tail recursive functions; improving the predicate compiler and function flattening
 bulwahn parents: 
35092diff
changeset | 16 | |
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 17 | type mutant_subentry = term * (string * (outcome * timings)) list | 
| 34965 | 18 | type detailed_entry = string * bool * term * mutant_subentry list | 
| 19 | ||
| 20 | type subentry = string * int * int * int * int * int * int | |
| 21 | type entry = string * bool * subentry list | |
| 22 | type report = entry list | |
| 23 | ||
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 24 | val quickcheck_mtd : (Proof.context -> Proof.context) -> string -> mtd | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 25 | |
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 26 | val solve_direct_mtd : mtd | 
| 46641 | 27 | val try0_mtd : mtd | 
| 40974 | 28 | (* | 
| 40971 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 29 | val sledgehammer_mtd : mtd | 
| 40974 | 30 | *) | 
| 41190 | 31 | val nitpick_mtd : mtd | 
| 32 | ||
| 34965 | 33 | val refute_mtd : mtd | 
| 34 | ||
| 35 | val freezeT : term -> term | |
| 36 | val thms_of : bool -> theory -> thm list | |
| 37 | ||
| 38 | val string_for_report : report -> string | |
| 39 | val write_report : string -> report -> unit | |
| 40 | val mutate_theorems_and_write_report : | |
| 46454 
d72ab6bf6e6d
making num_mutations a configuration that can be changed with the mutabelle bash command
 bulwahn parents: 
46453diff
changeset | 41 | theory -> int * int -> mtd list -> thm list -> string -> unit | 
| 34965 | 42 | |
| 56147 | 43 | val init_random : real -> unit | 
| 34965 | 44 | end; | 
| 45 | ||
| 46 | structure MutabelleExtra : MUTABELLE_EXTRA = | |
| 47 | struct | |
| 48 | ||
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 49 | (* Another Random engine *) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 50 | |
| 34965 | 51 | exception RANDOM; | 
| 52 | ||
| 53 | fun rmod x y = x - y * Real.realFloor (x / y); | |
| 54 | ||
| 55 | local | |
| 56147 | 56 | (* Own seed; can't rely on the Isabelle one to stay the same *) | 
| 57 | val random_seed = Synchronized.var "random_seed" 1.0; | |
| 58 | ||
| 34965 | 59 | val a = 16807.0; | 
| 60 | val m = 2147483647.0; | |
| 61 | in | |
| 62 | ||
| 56147 | 63 | fun init_random r = Synchronized.change random_seed (K r); | 
| 64 | ||
| 65 | fun random () = | |
| 66 | Synchronized.change_result random_seed | |
| 67 | (fn s => | |
| 68 | let val r = rmod (a * s) m | |
| 69 | in (r, r) end); | |
| 34965 | 70 | |
| 71 | end; | |
| 72 | ||
| 73 | fun random_range l h = | |
| 74 | if h < l orelse l < 0 then raise RANDOM | |
| 75 | else l + Real.floor (rmod (random ()) (real (h - l + 1))); | |
| 76 | ||
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 77 | fun take_random 0 _ = [] | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 78 | | take_random _ [] = [] | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 79 | | take_random n xs = | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 80 | let val j = random_range 0 (length xs - 1) in | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 81 | Library.nth xs j :: take_random (n - 1) (nth_drop j xs) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 82 | end | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 83 | |
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 84 | (* possible outcomes *) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 85 | |
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 86 | datatype outcome = GenuineCex | PotentialCex | NoCex | Donno | Timeout | Error | Solved | Unsolved | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 87 | |
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 88 | fun string_of_outcome GenuineCex = "GenuineCex" | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 89 | | string_of_outcome PotentialCex = "PotentialCex" | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 90 | | string_of_outcome NoCex = "NoCex" | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 91 | | string_of_outcome Donno = "Donno" | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 92 | | string_of_outcome Timeout = "Timeout" | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 93 | | string_of_outcome Error = "Error" | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 94 | | string_of_outcome Solved = "Solved" | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 95 | | string_of_outcome Unsolved = "Unsolved" | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 96 | |
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 97 | type timings = (string * int) list | 
| 34965 | 98 | |
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 99 | type mtd = string * (theory -> term -> outcome * timings) | 
| 35324 
c9f428269b38
adopting mutabelle and quickcheck to return timing information; exporting make_case_combs in datatype package for predicate compiler; adding Spec_Rules declaration for tail recursive functions; improving the predicate compiler and function flattening
 bulwahn parents: 
35092diff
changeset | 100 | |
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 101 | type mutant_subentry = term * (string * (outcome * timings)) list | 
| 34965 | 102 | type detailed_entry = string * bool * term * mutant_subentry list | 
| 103 | ||
| 104 | type subentry = string * int * int * int * int * int * int | |
| 105 | type entry = string * bool * subentry list | |
| 106 | type report = entry list | |
| 107 | ||
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 108 | (* possible invocations *) | 
| 34965 | 109 | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 110 | (** quickcheck **) | 
| 34965 | 111 | |
| 51092 | 112 | fun invoke_quickcheck change_options thy t = | 
| 62519 | 113 | Timeout.apply (seconds 30.0) | 
| 34965 | 114 | (fn _ => | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 115 | let | 
| 45159 
3f1d1ce024cb
moving some common functions from quickcheck to the more HOL-specific quickcheck_common; renamed inductive_SML's configurations to more canonical names; adds automatically left and right hand sides of equations as evaluation terms
 bulwahn parents: 
44845diff
changeset | 116 | val ctxt' = change_options (Proof_Context.init_global thy) | 
| 46376 
110ba6344446
mutabelle must handle the case where quickcheck returns multiple results
 bulwahn parents: 
46326diff
changeset | 117 | val (result :: _) = case Quickcheck.active_testers ctxt' of | 
| 45159 
3f1d1ce024cb
moving some common functions from quickcheck to the more HOL-specific quickcheck_common; renamed inductive_SML's configurations to more canonical names; adds automatically left and right hand sides of equations as evaluation terms
 bulwahn parents: 
44845diff
changeset | 118 | [] => error "No active testers for quickcheck" | 
| 45428 
aa35c9454a95
quickcheck invocations in mutabelle must not catch codegenerator errors internally
 bulwahn parents: 
45397diff
changeset | 119 | | [tester] => tester ctxt' false [] [(t, [])] | 
| 45159 
3f1d1ce024cb
moving some common functions from quickcheck to the more HOL-specific quickcheck_common; renamed inductive_SML's configurations to more canonical names; adds automatically left and right hand sides of equations as evaluation terms
 bulwahn parents: 
44845diff
changeset | 120 | | _ => error "Multiple active testers for quickcheck" | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 121 | in | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 122 | case Quickcheck.counterexample_of result of | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 123 | NONE => (NoCex, Quickcheck.timings_of result) | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 124 | | SOME _ => (GenuineCex, Quickcheck.timings_of result) | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 125 | end) () | 
| 62519 | 126 | handle Timeout.TIMEOUT _ => | 
| 69597 | 127 |          (Timeout, [("timelimit", Real.floor (Options.default_real \<^system_option>\<open>auto_time_limit\<close>))])
 | 
| 34965 | 128 | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 129 | fun quickcheck_mtd change_options quickcheck_generator = | 
| 51092 | 130 |   ("quickcheck_" ^ quickcheck_generator, invoke_quickcheck change_options)
 | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 131 | |
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 132 | (** solve direct **) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 133 | |
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 134 | fun invoke_solve_direct thy t = | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 135 | let | 
| 42361 | 136 | val state = Proof.theorem NONE (K I) (map (single o rpair []) [t]) (Proof_Context.init_global thy) | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 137 | in | 
| 43030 | 138 | case Solve_Direct.solve_direct state of | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 139 | (true, _) => (Solved, []) | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 140 | | (false, _) => (Unsolved, []) | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 141 | end | 
| 34965 | 142 | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 143 | val solve_direct_mtd = ("solve_direct", invoke_solve_direct) 
 | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 144 | |
| 46641 | 145 | (** try0 **) | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 146 | |
| 46641 | 147 | fun invoke_try0 thy t = | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 148 | let | 
| 42361 | 149 | val state = Proof.theorem NONE (K I) (map (single o rpair []) [t]) (Proof_Context.init_global thy) | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 150 | in | 
| 46641 | 151 | case Try0.try0 (SOME (seconds 5.0)) ([], [], [], []) state of | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 152 | true => (Solved, []) | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 153 | | false => (Unsolved, []) | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 154 | end | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 155 | |
| 46641 | 156 | val try0_mtd = ("try0", invoke_try0)
 | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 157 | |
| 40971 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 158 | (** sledgehammer **) | 
| 40974 | 159 | (* | 
| 40971 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 160 | fun invoke_sledgehammer thy t = | 
| 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 161 | if can (Goal.prove_global thy (Term.add_free_names t []) [] t) | 
| 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 162 |       (fn {context, ...} => Sledgehammer_Tactics.sledgehammer_with_metis_tac context 1) then
 | 
| 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 163 | (Solved, ([], NONE)) | 
| 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 164 | else | 
| 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 165 | (Unsolved, ([], NONE)) | 
| 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 166 | |
| 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 167 | val sledgehammer_mtd = ("sledgehammer", invoke_sledgehammer)
 | 
| 40974 | 168 | *) | 
| 45397 | 169 | |
| 34965 | 170 | fun invoke_refute thy t = | 
| 171 | let | |
| 45397 | 172 | val params = [] | 
| 173 | val res = Refute.refute_term (Proof_Context.init_global thy) params [] t | |
| 58843 | 174 |     val _ = writeln ("Refute: " ^ res)
 | 
| 34965 | 175 | in | 
| 45397 | 176 | (rpair []) (case res of | 
| 34965 | 177 | "genuine" => GenuineCex | 
| 178 | | "likely_genuine" => GenuineCex | |
| 179 | | "potential" => PotentialCex | |
| 180 | | "none" => NoCex | |
| 181 | | "unknown" => Donno | |
| 45397 | 182 | | _ => Error) | 
| 34965 | 183 | end | 
| 45397 | 184 | handle Refute.REFUTE (loc, details) => | 
| 34965 | 185 |          (error ("Unhandled Refute error (" ^ quote loc ^ "): " ^ details ^
 | 
| 186 | ".")) | |
| 187 | val refute_mtd = ("refute", invoke_refute)
 | |
| 188 | ||
| 41190 | 189 | (** nitpick **) | 
| 34965 | 190 | |
| 191 | fun invoke_nitpick thy t = | |
| 192 | let | |
| 42361 | 193 | val ctxt = Proof_Context.init_global thy | 
| 34965 | 194 | val state = Proof.init ctxt | 
| 41190 | 195 | val (res, _) = Nitpick.pick_nits_in_term state | 
| 55199 | 196 | (Nitpick_Commands.default_params thy []) Nitpick.Normal 1 1 1 [] [] [] t | 
| 58843 | 197 |     val _ = writeln ("Nitpick: " ^ res)
 | 
| 34965 | 198 | in | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 199 | (rpair []) (case res of | 
| 41190 | 200 | "genuine" => GenuineCex | 
| 201 | | "likely_genuine" => GenuineCex | |
| 202 | | "potential" => PotentialCex | |
| 203 | | "none" => NoCex | |
| 204 | | "unknown" => Donno | |
| 205 | | _ => Error) | |
| 34965 | 206 | end | 
| 41190 | 207 | |
| 34965 | 208 | val nitpick_mtd = ("nitpick", invoke_nitpick)
 | 
| 209 | ||
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 210 | (* filtering forbidden theorems and mutants *) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 211 | |
| 69597 | 212 | val comms = [\<^const_name>\<open>HOL.eq\<close>, \<^const_name>\<open>HOL.disj\<close>, \<^const_name>\<open>HOL.conj\<close>] | 
| 34965 | 213 | |
| 214 | val forbidden = | |
| 215 |  [(* (@{const_name "power"}, "'a"), *)
 | |
| 35325 
4123977b469d
adding ROOT.ML to HOL-Mutabelle session; uncommenting HOL.induct constants in Mutabelle session
 bulwahn parents: 
35324diff
changeset | 216 |   (*(@{const_name induct_equal}, "'a"),
 | 
| 
4123977b469d
adding ROOT.ML to HOL-Mutabelle session; uncommenting HOL.induct constants in Mutabelle session
 bulwahn parents: 
35324diff
changeset | 217 |   (@{const_name induct_implies}, "'a"),
 | 
| 
4123977b469d
adding ROOT.ML to HOL-Mutabelle session; uncommenting HOL.induct constants in Mutabelle session
 bulwahn parents: 
35324diff
changeset | 218 |   (@{const_name induct_conj}, "'a"),*)
 | 
| 69597 | 219 | (\<^const_name>\<open>undefined\<close>, "'a"), | 
| 220 | (\<^const_name>\<open>default\<close>, "'a"), | |
| 221 |   (\<^const_name>\<open>Pure.dummy_pattern\<close>, "'a::{}"),
 | |
| 222 | (\<^const_name>\<open>HOL.simp_implies\<close>, "prop => prop => prop"), | |
| 223 | (\<^const_name>\<open>bot_fun_inst.bot_fun\<close>, "'a"), | |
| 224 | (\<^const_name>\<open>top_fun_inst.top_fun\<close>, "'a"), | |
| 225 | (\<^const_name>\<open>Pure.term\<close>, "'a"), | |
| 226 | (\<^const_name>\<open>top_class.top\<close>, "'a"), | |
| 227 | (\<^const_name>\<open>Quotient.Quot_True\<close>, "'a")(*, | |
| 34965 | 228 |   (@{const_name "uminus"}, "'a"),
 | 
| 229 |   (@{const_name "Nat.size"}, "'a"),
 | |
| 35092 
cfe605c54e50
moved less_eq, less to Orderings.thy; moved abs, sgn to Groups.thy
 haftmann parents: 
34974diff
changeset | 230 |   (@{const_name "Groups.abs"}, "'a") *)]
 | 
| 34965 | 231 | |
| 232 | val forbidden_thms = | |
| 233 | ["finite_intvl_succ_class", | |
| 234 | "nibble"] | |
| 235 | ||
| 69597 | 236 | val forbidden_consts = [\<^const_name>\<open>Pure.type\<close>] | 
| 34965 | 237 | |
| 238 | fun is_forbidden_theorem (s, th) = | |
| 59582 | 239 | let val consts = Term.add_const_names (Thm.prop_of th) [] in | 
| 46711 
f745bcc4a1e5
more explicit Long_Name operations (NB: analyzing qualifiers is inherently fragile);
 wenzelm parents: 
46641diff
changeset | 240 | exists (member (op =) (Long_Name.explode s)) forbidden_thms orelse | 
| 36692 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 haftmann parents: 
36610diff
changeset | 241 | exists (member (op =) forbidden_consts) consts orelse | 
| 46711 
f745bcc4a1e5
more explicit Long_Name operations (NB: analyzing qualifiers is inherently fragile);
 wenzelm parents: 
46641diff
changeset | 242 | length (Long_Name.explode s) <> 2 orelse | 
| 
f745bcc4a1e5
more explicit Long_Name operations (NB: analyzing qualifiers is inherently fragile);
 wenzelm parents: 
46641diff
changeset | 243 | String.isPrefix "type_definition" (List.last (Long_Name.explode s)) orelse | 
| 34965 | 244 | String.isSuffix "_def" s orelse | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 245 | String.isSuffix "_raw" s orelse | 
| 46711 
f745bcc4a1e5
more explicit Long_Name operations (NB: analyzing qualifiers is inherently fragile);
 wenzelm parents: 
46641diff
changeset | 246 | String.isPrefix "term_of" (List.last (Long_Name.explode s)) | 
| 34965 | 247 | end | 
| 248 | ||
| 36255 
f8b3381e1437
tuning mutabelle; adding output of mutant theoryfile for interactive evaluation
 bulwahn parents: 
35625diff
changeset | 249 | val forbidden_mutant_constnames = | 
| 69597 | 250 | [\<^const_name>\<open>HOL.induct_equal\<close>, | 
| 251 | \<^const_name>\<open>HOL.induct_implies\<close>, | |
| 252 | \<^const_name>\<open>HOL.induct_conj\<close>, | |
| 253 | \<^const_name>\<open>HOL.induct_forall\<close>, | |
| 254 | \<^const_name>\<open>undefined\<close>, | |
| 255 | \<^const_name>\<open>default\<close>, | |
| 256 | \<^const_name>\<open>Pure.dummy_pattern\<close>, | |
| 257 | \<^const_name>\<open>HOL.simp_implies\<close>, | |
| 258 | \<^const_name>\<open>bot_fun_inst.bot_fun\<close>, | |
| 259 | \<^const_name>\<open>top_fun_inst.top_fun\<close>, | |
| 260 | \<^const_name>\<open>Pure.term\<close>, | |
| 261 | \<^const_name>\<open>top_class.top\<close>, | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 262 |  (*@{const_name "HOL.equal"},*)
 | 
| 69597 | 263 | \<^const_name>\<open>Quotient.Quot_True\<close>, | 
| 264 | \<^const_name>\<open>equal_fun_inst.equal_fun\<close>, | |
| 265 | \<^const_name>\<open>equal_bool_inst.equal_bool\<close>, | |
| 266 | \<^const_name>\<open>ord_fun_inst.less_eq_fun\<close>, | |
| 267 | \<^const_name>\<open>ord_fun_inst.less_fun\<close>, | |
| 268 | \<^const_name>\<open>Meson.skolem\<close>, | |
| 269 | \<^const_name>\<open>ATP.fequal\<close>, | |
| 270 | \<^const_name>\<open>ATP.fEx\<close>, | |
| 271 | \<^const_name>\<open>enum_prod_inst.enum_all_prod\<close>, | |
| 272 | \<^const_name>\<open>enum_prod_inst.enum_ex_prod\<close>, | |
| 273 | \<^const_name>\<open>Quickcheck_Random.catch_match\<close>, | |
| 274 | \<^const_name>\<open>Quickcheck_Exhaustive.unknown\<close>, | |
| 275 | \<^const_name>\<open>Num.Bit0\<close>, \<^const_name>\<open>Num.Bit1\<close> | |
| 56245 | 276 |  (*@{const_name Pure.imp}, @{const_name Pure.eq}*)]
 | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 277 | |
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 278 | val forbidden_mutant_consts = | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 279 | [ | 
| 69597 | 280 | (\<^const_name>\<open>Groups.zero_class.zero\<close>, \<^typ>\<open>prop => prop => prop\<close>), | 
| 281 | (\<^const_name>\<open>Groups.one_class.one\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 282 | (\<^const_name>\<open>Groups.plus_class.plus\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 283 | (\<^const_name>\<open>Groups.minus_class.minus\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 284 | (\<^const_name>\<open>Groups.times_class.times\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 285 | (\<^const_name>\<open>Lattices.inf_class.inf\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 286 | (\<^const_name>\<open>Lattices.sup_class.sup\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 287 | (\<^const_name>\<open>Orderings.bot_class.bot\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 288 | (\<^const_name>\<open>Orderings.ord_class.min\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 289 | (\<^const_name>\<open>Orderings.ord_class.max\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 290 | (\<^const_name>\<open>Rings.modulo\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 291 | (\<^const_name>\<open>Rings.divide\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 292 | (\<^const_name>\<open>GCD.gcd_class.gcd\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 293 | (\<^const_name>\<open>GCD.gcd_class.lcm\<close>, \<^typ>\<open>prop => prop => prop\<close>), | |
| 294 | (\<^const_name>\<open>Orderings.bot_class.bot\<close>, \<^typ>\<open>bool => prop\<close>), | |
| 295 | (\<^const_name>\<open>Groups.one_class.one\<close>, \<^typ>\<open>bool => prop\<close>), | |
| 296 | (\<^const_name>\<open>Groups.zero_class.zero\<close>,\<^typ>\<open>bool => prop\<close>), | |
| 297 | (\<^const_name>\<open>equal_class.equal\<close>,\<^typ>\<open>bool => bool => bool\<close>)] | |
| 36255 
f8b3381e1437
tuning mutabelle; adding output of mutant theoryfile for interactive evaluation
 bulwahn parents: 
35625diff
changeset | 298 | |
| 34965 | 299 | fun is_forbidden_mutant t = | 
| 36255 
f8b3381e1437
tuning mutabelle; adding output of mutant theoryfile for interactive evaluation
 bulwahn parents: 
35625diff
changeset | 300 | let | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 301 | val const_names = Term.add_const_names t [] | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 302 | val consts = Term.add_consts t [] | 
| 36255 
f8b3381e1437
tuning mutabelle; adding output of mutant theoryfile for interactive evaluation
 bulwahn parents: 
35625diff
changeset | 303 | in | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 304 | exists (String.isPrefix "Nitpick") const_names orelse | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 305 | exists (String.isSubstring "_sumC") const_names orelse | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 306 | exists (member (op =) forbidden_mutant_constnames) const_names orelse | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 307 | exists (member (op =) forbidden_mutant_consts) consts | 
| 34965 | 308 | end | 
| 309 | ||
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 310 | (* executable via quickcheck *) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 311 | |
| 40248 | 312 | fun is_executable_term thy t = | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 313 | let | 
| 42361 | 314 | val ctxt = Proof_Context.init_global thy | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 315 | in | 
| 62519 | 316 | can (Timeout.apply (seconds 30.0) | 
| 45159 
3f1d1ce024cb
moving some common functions from quickcheck to the more HOL-specific quickcheck_common; renamed inductive_SML's configurations to more canonical names; adds automatically left and right hand sides of equations as evaluation terms
 bulwahn parents: 
44845diff
changeset | 317 | (Quickcheck.test_terms | 
| 45165 
f4896c792316
adding testing of quickcheck narrowing with finite types to mutabelle script; modified is_executable in mutabelle_extra
 bulwahn parents: 
45159diff
changeset | 318 | ((Context.proof_map (Quickcheck.set_active_testers ["exhaustive"]) #> | 
| 
f4896c792316
adding testing of quickcheck narrowing with finite types to mutabelle script; modified is_executable in mutabelle_extra
 bulwahn parents: 
45159diff
changeset | 319 | Config.put Quickcheck.finite_types true #> | 
| 41106 | 320 | Config.put Quickcheck.finite_type_size 1 #> | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 321 | Config.put Quickcheck.size 1 #> Config.put Quickcheck.iterations 1) ctxt) | 
| 59970 | 322 | (false, false) [])) (map (rpair [] o Object_Logic.atomize_term ctxt) | 
| 45159 
3f1d1ce024cb
moving some common functions from quickcheck to the more HOL-specific quickcheck_common; renamed inductive_SML's configurations to more canonical names; adds automatically left and right hand sides of equations as evaluation terms
 bulwahn parents: 
44845diff
changeset | 323 | (fst (Variable.import_terms true [t] ctxt))) | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 324 | end | 
| 40248 | 325 | |
| 59582 | 326 | fun is_executable_thm thy th = is_executable_term thy (Thm.prop_of th) | 
| 34965 | 327 | |
| 328 | val freezeT = | |
| 329 | map_types (map_type_tvar (fn ((a, i), S) => | |
| 330 | TFree (if i = 0 then a else a ^ "_" ^ string_of_int i, S))) | |
| 331 | ||
| 332 | fun thms_of all thy = | |
| 333 | filter | |
| 65458 | 334 | (fn th => (all orelse Thm.theory_name th = Context.theory_name thy) | 
| 34965 | 335 | (* andalso is_executable_thm thy th *)) | 
| 56161 | 336 | (map snd (filter_out is_forbidden_theorem (Global_Theory.all_thms_of thy false))) | 
| 34965 | 337 | |
| 49441 
0ae4216a1783
recording elapsed time in mutabelle for more detailed evaluation
 bulwahn parents: 
47715diff
changeset | 338 | fun elapsed_time description e = | 
| 
0ae4216a1783
recording elapsed time in mutabelle for more detailed evaluation
 bulwahn parents: 
47715diff
changeset | 339 |   let val ({elapsed, ...}, result) = Timing.timing e ()
 | 
| 
0ae4216a1783
recording elapsed time in mutabelle for more detailed evaluation
 bulwahn parents: 
47715diff
changeset | 340 | in (result, (description, Time.toMilliseconds elapsed)) end | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 341 | (* | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 342 | fun unsafe_invoke_mtd thy (mtd_name, invoke_mtd) t = | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 343 | let | 
| 58843 | 344 |     val _ = writeln ("Invoking " ^ mtd_name)
 | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 345 | val ((res, (timing, reports)), time) = cpu_time "total time" (fn () => invoke_mtd thy t | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 346 | handle ERROR s => (tracing s; (Error, ([], NONE)))) | 
| 58843 | 347 |     val _ = writeln (" Done")
 | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 348 | in (res, (time :: timing, reports)) end | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 349 | *) | 
| 34965 | 350 | fun safe_invoke_mtd thy (mtd_name, invoke_mtd) t = | 
| 351 | let | |
| 58843 | 352 |     val _ = writeln ("Invoking " ^ mtd_name)
 | 
| 49441 
0ae4216a1783
recording elapsed time in mutabelle for more detailed evaluation
 bulwahn parents: 
47715diff
changeset | 353 | val (res, timing) = elapsed_time "total time" | 
| 
0ae4216a1783
recording elapsed time in mutabelle for more detailed evaluation
 bulwahn parents: 
47715diff
changeset | 354 | (fn () => case try (invoke_mtd thy) t of | 
| 51092 | 355 | SOME (res, _) => res | 
| 58843 | 356 |         | NONE => (writeln ("**** PROBLEMS WITH " ^ Syntax.string_of_term_global thy t);
 | 
| 49441 
0ae4216a1783
recording elapsed time in mutabelle for more detailed evaluation
 bulwahn parents: 
47715diff
changeset | 357 | Error)) | 
| 58843 | 358 |     val _ = writeln (" Done")
 | 
| 49441 
0ae4216a1783
recording elapsed time in mutabelle for more detailed evaluation
 bulwahn parents: 
47715diff
changeset | 359 | in (res, [timing]) end | 
| 34965 | 360 | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 361 | (* creating entries *) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 362 | |
| 34965 | 363 | fun create_detailed_entry thy thm exec mutants mtds = | 
| 364 | let | |
| 365 | fun create_mutant_subentry mutant = (mutant, | |
| 366 | map (fn (mtd_name, invoke_mtd) => | |
| 367 | (mtd_name, safe_invoke_mtd thy (mtd_name, invoke_mtd) mutant)) mtds) | |
| 368 | in | |
| 59582 | 369 | (Thm.get_name_hint thm, exec, Thm.prop_of thm, map create_mutant_subentry mutants) | 
| 34965 | 370 | end | 
| 371 | ||
| 372 | (* (theory -> thm -> bool -> term list -> mtd list -> 'a) -> theory -> mtd list -> thm -> 'a *) | |
| 46454 
d72ab6bf6e6d
making num_mutations a configuration that can be changed with the mutabelle bash command
 bulwahn parents: 
46453diff
changeset | 373 | fun mutate_theorem create_entry thy (num_mutations, max_mutants) mtds thm = | 
| 34965 | 374 | let | 
| 375 | val exec = is_executable_thm thy thm | |
| 43277 | 376 | val _ = tracing (if exec then "EXEC" else "NOEXEC") | 
| 34965 | 377 | val mutants = | 
| 378 | (if num_mutations = 0 then | |
| 379 | [Thm.prop_of thm] | |
| 380 | else | |
| 381 | Mutabelle.mutate_mix (Thm.prop_of thm) thy comms forbidden | |
| 382 | num_mutations) | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 383 |              |> tap (fn muts => tracing ("mutants: " ^ string_of_int (length muts)))
 | 
| 34965 | 384 | |> filter_out is_forbidden_mutant | 
| 385 | val mutants = | |
| 386 | if exec then | |
| 387 | let | |
| 58843 | 388 |           val _ = writeln ("BEFORE PARTITION OF " ^
 | 
| 41491 | 389 | string_of_int (length mutants) ^ " MUTANTS") | 
| 34965 | 390 | val (execs, noexecs) = List.partition (is_executable_term thy) (take_random (20 * max_mutants) mutants) | 
| 41491 | 391 |           val _ = tracing ("AFTER PARTITION (" ^ string_of_int (length execs) ^
 | 
| 392 | " vs " ^ string_of_int (length noexecs) ^ ")") | |
| 34965 | 393 | in | 
| 394 | execs @ take_random (Int.max (0, max_mutants - length execs)) noexecs | |
| 395 | end | |
| 396 | else | |
| 397 | mutants | |
| 398 | val mutants = mutants | |
| 399 | |> map Mutabelle.freeze |> map freezeT | |
| 400 | (* |> filter (not o is_forbidden_mutant) *) | |
| 42429 | 401 | |> map_filter (try (Sign.cert_term thy)) | 
| 59621 
291934bac95e
Thm.cterm_of and Thm.ctyp_of operate on local context;
 wenzelm parents: 
59582diff
changeset | 402 | |> filter (is_some o try (Thm.global_cterm_of thy)) | 
| 42429 | 403 | |> filter (is_some o try (Syntax.check_term (Proof_Context.init_global thy))) | 
| 40971 
6604115019bf
adding filtering, sytactic welltyping, and sledgehammer method in mutabelle
 bulwahn parents: 
40932diff
changeset | 404 | |> take_random max_mutants | 
| 58843 | 405 |     val _ = map (fn t => writeln ("MUTANT: " ^ Syntax.string_of_term_global thy t)) mutants
 | 
| 34965 | 406 | in | 
| 407 | create_entry thy thm exec mutants mtds | |
| 408 | end | |
| 409 | ||
| 35324 
c9f428269b38
adopting mutabelle and quickcheck to return timing information; exporting make_case_combs in datatype package for predicate compiler; adding Spec_Rules declaration for tail recursive functions; improving the predicate compiler and function flattening
 bulwahn parents: 
35092diff
changeset | 410 | fun string_of_mutant_subentry' thy thm_name (t, results) = | 
| 35380 
6ac5b81a763d
adopting Mutabelle to quickcheck reporting; improving quickcheck reporting
 bulwahn parents: 
35325diff
changeset | 411 | let | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 412 |    (* fun string_of_report (Quickcheck.Report {iterations = i, raised_match_errors = e,
 | 
| 35380 
6ac5b81a763d
adopting Mutabelle to quickcheck reporting; improving quickcheck reporting
 bulwahn parents: 
35325diff
changeset | 413 | satisfied_assms = s, positive_concl_tests = p}) = | 
| 
6ac5b81a763d
adopting Mutabelle to quickcheck reporting; improving quickcheck reporting
 bulwahn parents: 
35325diff
changeset | 414 | "errors: " ^ string_of_int e ^ "; conclusion tests: " ^ string_of_int p | 
| 
6ac5b81a763d
adopting Mutabelle to quickcheck reporting; improving quickcheck reporting
 bulwahn parents: 
35325diff
changeset | 415 | fun string_of_reports NONE = "" | 
| 
6ac5b81a763d
adopting Mutabelle to quickcheck reporting; improving quickcheck reporting
 bulwahn parents: 
35325diff
changeset | 416 | | string_of_reports (SOME reports) = | 
| 
6ac5b81a763d
adopting Mutabelle to quickcheck reporting; improving quickcheck reporting
 bulwahn parents: 
35325diff
changeset | 417 | cat_lines (map (fn (size, [report]) => | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 418 | "size " ^ string_of_int size ^ ": " ^ string_of_report report) (rev reports))*) | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42032diff
changeset | 419 | fun string_of_mtd_result (mtd_name, (outcome, timing)) = | 
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 420 | mtd_name ^ ": " ^ string_of_outcome outcome | 
| 49441 
0ae4216a1783
recording elapsed time in mutabelle for more detailed evaluation
 bulwahn parents: 
47715diff
changeset | 421 |       ^ "(" ^ space_implode "; " (map (fn (s, t) => (s ^ ": " ^ string_of_int t)) timing) ^ ")"
 | 
| 36255 
f8b3381e1437
tuning mutabelle; adding output of mutant theoryfile for interactive evaluation
 bulwahn parents: 
35625diff
changeset | 422 | (*^ "\n" ^ string_of_reports reports*) | 
| 35380 
6ac5b81a763d
adopting Mutabelle to quickcheck reporting; improving quickcheck reporting
 bulwahn parents: 
35325diff
changeset | 423 | in | 
| 59433 | 424 | "mutant of " ^ thm_name ^ ":\n" ^ | 
| 425 | YXML.content_of (Syntax.string_of_term_global thy t) ^ "\n" ^ | |
| 426 | space_implode "; " (map string_of_mtd_result results) | |
| 35380 
6ac5b81a763d
adopting Mutabelle to quickcheck reporting; improving quickcheck reporting
 bulwahn parents: 
35325diff
changeset | 427 | end | 
| 35324 
c9f428269b38
adopting mutabelle and quickcheck to return timing information; exporting make_case_combs in datatype package for predicate compiler; adding Spec_Rules declaration for tail recursive functions; improving the predicate compiler and function flattening
 bulwahn parents: 
35092diff
changeset | 428 | |
| 34965 | 429 | fun string_of_detailed_entry thy (thm_name, exec, t, mutant_subentries) = | 
| 430 | thm_name ^ " " ^ (if exec then "[exe]" else "[noexe]") ^ ": " ^ | |
| 36255 
f8b3381e1437
tuning mutabelle; adding output of mutant theoryfile for interactive evaluation
 bulwahn parents: 
35625diff
changeset | 431 | Syntax.string_of_term_global thy t ^ "\n" ^ | 
| 35324 
c9f428269b38
adopting mutabelle and quickcheck to return timing information; exporting make_case_combs in datatype package for predicate compiler; adding Spec_Rules declaration for tail recursive functions; improving the predicate compiler and function flattening
 bulwahn parents: 
35092diff
changeset | 432 | cat_lines (map (string_of_mutant_subentry' thy thm_name) mutant_subentries) ^ "\n" | 
| 34965 | 433 | |
| 434 | (* subentry -> string *) | |
| 435 | fun string_for_subentry (mtd_name, genuine_cex, potential_cex, no_cex, donno, | |
| 436 | timeout, error) = | |
| 41491 | 437 | " " ^ mtd_name ^ ": " ^ string_of_int genuine_cex ^ "+ " ^ | 
| 438 | string_of_int potential_cex ^ "= " ^ string_of_int no_cex ^ "- " ^ | |
| 439 | string_of_int donno ^ "? " ^ string_of_int timeout ^ "T " ^ | |
| 440 | string_of_int error ^ "!" | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 441 | |
| 34965 | 442 | (* entry -> string *) | 
| 443 | fun string_for_entry (thm_name, exec, subentries) = | |
| 444 | thm_name ^ " " ^ (if exec then "[exe]" else "[noexe]") ^ ":\n" ^ | |
| 445 | cat_lines (map string_for_subentry subentries) ^ "\n" | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 446 | |
| 34965 | 447 | (* report -> string *) | 
| 448 | fun string_for_report report = cat_lines (map string_for_entry report) | |
| 449 | ||
| 450 | (* string -> report -> unit *) | |
| 451 | fun write_report file_name = | |
| 452 | File.write (Path.explode file_name) o string_for_report | |
| 453 | ||
| 454 | (* theory -> mtd list -> thm list -> string -> unit *) | |
| 46454 
d72ab6bf6e6d
making num_mutations a configuration that can be changed with the mutabelle bash command
 bulwahn parents: 
46453diff
changeset | 455 | fun mutate_theorems_and_write_report thy (num_mutations, max_mutants) mtds thms file_name = | 
| 34965 | 456 | let | 
| 58843 | 457 | val _ = writeln "Starting Mutabelle..." | 
| 42361 | 458 | val ctxt = Proof_Context.init_global thy | 
| 34965 | 459 | val path = Path.explode file_name | 
| 460 | (* for normal report: *) | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 461 | (* | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 462 | val (gen_create_entry, gen_string_for_entry) = (create_entry, string_for_entry) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 463 | *) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 464 | (* for detailled report: *) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 465 | val (gen_create_entry, gen_string_for_entry) = (create_detailed_entry, string_of_detailed_entry thy) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 466 | (* for theory creation: *) | 
| 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 467 | (*val (gen_create_entry, gen_string_for_entry) = (create_detailed_entry, theoryfile_string_of_detailed_entry thy)*) | 
| 34965 | 468 | in | 
| 469 | File.write path ( | |
| 470 | "Mutation options = " ^ | |
| 471 | "max_mutants: " ^ string_of_int max_mutants ^ | |
| 472 | "; num_mutations: " ^ string_of_int num_mutations ^ "\n" ^ | |
| 473 | "QC options = " ^ | |
| 474 | (*"quickcheck_generator: " ^ quickcheck_generator ^ ";*) | |
| 40653 
d921c97bdbd8
adding AFP tests to Mutabelle_Extra; adopting mutabelle to recent quickcheck changes; filtering strange mutants; adding solvers to mutabelle; restructuring mutabelle
 bulwahn parents: 
40381diff
changeset | 475 | "size: " ^ string_of_int (Config.get ctxt Quickcheck.size) ^ | 
| 43244 | 476 | "; iterations: " ^ string_of_int (Config.get ctxt Quickcheck.iterations) ^ "\n" ^ | 
| 477 | "Isabelle environment = ISABELLE_GHC: " ^ getenv "ISABELLE_GHC" ^ "\n"); | |
| 46454 
d72ab6bf6e6d
making num_mutations a configuration that can be changed with the mutabelle bash command
 bulwahn parents: 
46453diff
changeset | 478 | map (File.append path o gen_string_for_entry o mutate_theorem gen_create_entry thy (num_mutations, max_mutants) mtds) thms; | 
| 34965 | 479 | () | 
| 480 | end | |
| 481 | ||
| 482 | end; |