| author | wenzelm | 
| Mon, 30 Dec 2013 12:58:13 +0100 | |
| changeset 54880 | ce5faf131fd3 | 
| parent 51689 | 43a3465805dd | 
| child 55147 | bce3dbc11f95 | 
| permissions | -rw-r--r-- | 
| 41930 
1e008cc4883a
renaming lazysmallcheck ML file to Quickcheck_Narrowing
 bulwahn parents: 
41925diff
changeset | 1 | (* Title: HOL/Tools/Quickcheck/narrowing_generators.ML | 
| 41905 | 2 | Author: Lukas Bulwahn, TU Muenchen | 
| 3 | ||
| 41938 | 4 | Narrowing-based counterexample generation. | 
| 41905 | 5 | *) | 
| 6 | ||
| 41930 
1e008cc4883a
renaming lazysmallcheck ML file to Quickcheck_Narrowing
 bulwahn parents: 
41925diff
changeset | 7 | signature NARROWING_GENERATORS = | 
| 41905 | 8 | sig | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 9 | val allow_existentials : bool Config.T | 
| 42023 
1bd4b6d1c482
adding minimalistic setup and transformation to handle functions as data to enable naive function generation for Quickcheck_Narrowing
 bulwahn parents: 
42020diff
changeset | 10 | val finite_functions : bool Config.T | 
| 43079 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 11 | val overlord : bool Config.T | 
| 48270 | 12 | val ghc_options : string Config.T (* FIXME prefer settings, i.e. getenv (!?) *) | 
| 43891 
4690f76f327a
making active configuration public in narrowing-based quickcheck
 bulwahn parents: 
43878diff
changeset | 13 | val active : bool Config.T | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 14 | datatype counterexample = Universal_Counterexample of (term * counterexample) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 15 | | Existential_Counterexample of (term * counterexample) list | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 16 | | Empty_Assignment | 
| 45725 
2987b29518aa
the narrowing also indicates if counterexample is potentially spurious
 bulwahn parents: 
45685diff
changeset | 17 | val put_counterexample: (unit -> (bool * term list) option) -> Proof.context -> Proof.context | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 18 | val put_existential_counterexample : (unit -> counterexample option) -> Proof.context -> Proof.context | 
| 41905 | 19 | val setup: theory -> theory | 
| 20 | end; | |
| 21 | ||
| 41930 
1e008cc4883a
renaming lazysmallcheck ML file to Quickcheck_Narrowing
 bulwahn parents: 
41925diff
changeset | 22 | structure Narrowing_Generators : NARROWING_GENERATORS = | 
| 41905 | 23 | struct | 
| 24 | ||
| 42023 
1bd4b6d1c482
adding minimalistic setup and transformation to handle functions as data to enable naive function generation for Quickcheck_Narrowing
 bulwahn parents: 
42020diff
changeset | 25 | (* configurations *) | 
| 
1bd4b6d1c482
adding minimalistic setup and transformation to handle functions as data to enable naive function generation for Quickcheck_Narrowing
 bulwahn parents: 
42020diff
changeset | 26 | |
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 27 | val allow_existentials = Attrib.setup_config_bool @{binding quickcheck_allow_existentials} (K true)
 | 
| 42616 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42361diff
changeset | 28 | val finite_functions = Attrib.setup_config_bool @{binding quickcheck_finite_functions} (K true)
 | 
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 29 | val overlord = Attrib.setup_config_bool @{binding quickcheck_narrowing_overlord} (K false)
 | 
| 47843 
4da917ed49b7
adding configuration to pass options to the ghc call in quickcheck[narrowing]
 bulwahn parents: 
47330diff
changeset | 30 | val ghc_options = Attrib.setup_config_string @{binding quickcheck_narrowing_ghc_options} (K "")
 | 
| 42023 
1bd4b6d1c482
adding minimalistic setup and transformation to handle functions as data to enable naive function generation for Quickcheck_Narrowing
 bulwahn parents: 
42020diff
changeset | 31 | |
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 32 | (* partial_term_of instances *) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 33 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 34 | fun mk_partial_term_of (x, T) = | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 35 |   Const (@{const_name Quickcheck_Narrowing.partial_term_of_class.partial_term_of},
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 36 |     Term.itselfT T --> @{typ narrowing_term} --> @{typ Code_Evaluation.term})
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 37 |       $ Const ("TYPE", Term.itselfT T) $ x
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 38 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 39 | (** formal definition **) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 40 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 41 | fun add_partial_term_of tyco raw_vs thy = | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 42 | let | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 43 |     val vs = map (fn (v, _) => (v, @{sort typerep})) raw_vs;
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 44 | val ty = Type (tyco, map TFree vs); | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 45 |     val lhs = Const (@{const_name partial_term_of},
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 46 |         Term.itselfT ty --> @{typ narrowing_term} --> @{typ Code_Evaluation.term})
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 47 |       $ Free ("x", Term.itselfT ty) $ Free ("t", @{typ narrowing_term});
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 48 |     val rhs = @{term "undefined :: Code_Evaluation.term"};
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 49 | val eq = HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)); | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 50 | fun triv_name_of t = (fst o dest_Free o fst o strip_comb o fst | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 51 | o HOLogic.dest_eq o HOLogic.dest_Trueprop) t ^ "_triv"; | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 52 | in | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 53 | thy | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 54 |     |> Class.instantiation ([tyco], vs, @{sort partial_term_of})
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 55 | |> `(fn lthy => Syntax.check_term lthy eq) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 56 | |-> (fn eq => Specification.definition (NONE, ((Binding.name (triv_name_of eq), []), eq))) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 57 | |> snd | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 58 | |> Class.prove_instantiation_exit (K (Class.intro_classes_tac [])) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 59 | end; | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 60 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 61 | fun ensure_partial_term_of (tyco, (raw_vs, _)) thy = | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 62 | let | 
| 48272 | 63 |     val need_inst = not (Sorts.has_instance (Sign.classes_of thy) tyco @{sort partial_term_of})
 | 
| 64 |       andalso Sorts.has_instance (Sign.classes_of thy) tyco @{sort typerep};
 | |
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 65 | in if need_inst then add_partial_term_of tyco raw_vs thy else thy end; | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 66 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 67 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 68 | (** code equations for datatypes **) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 69 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 70 | fun mk_partial_term_of_eq thy ty (i, (c, (_, tys))) = | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 71 | let | 
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
43317diff
changeset | 72 |     val frees = map Free (Name.invent_names Name.context "a" (map (K @{typ narrowing_term}) tys))
 | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
50046diff
changeset | 73 |     val narrowing_term = @{term Quickcheck_Narrowing.Narrowing_constructor} $ HOLogic.mk_number @{typ integer} i
 | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
50046diff
changeset | 74 |       $ HOLogic.mk_list @{typ narrowing_term} (rev frees)
 | 
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 75 |     val rhs = fold (fn u => fn t => @{term "Code_Evaluation.App"} $ t $ u)
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 76 | (map mk_partial_term_of (frees ~~ tys)) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 77 |         (@{term "Code_Evaluation.Const"} $ HOLogic.mk_literal c $ HOLogic.mk_typerep (tys ---> ty))
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 78 | val insts = | 
| 45344 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45159diff
changeset | 79 | map (SOME o Thm.cterm_of thy o Logic.unvarify_types_global o Logic.varify_global) | 
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 80 |         [Free ("ty", Term.itselfT ty), narrowing_term, rhs]
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 81 | val cty = Thm.ctyp_of thy ty; | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 82 | in | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 83 |     @{thm partial_term_of_anything}
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 84 | |> Drule.instantiate' [SOME cty] insts | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 85 | |> Thm.varifyT_global | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 86 | end | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 87 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 88 | fun add_partial_term_of_code tyco raw_vs raw_cs thy = | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 89 | let | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 90 | val algebra = Sign.classes_of thy; | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 91 | val vs = map (fn (v, sort) => | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 92 |       (v, curry (Sorts.inter_sort algebra) @{sort typerep} sort)) raw_vs;
 | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 93 | val ty = Type (tyco, map TFree vs); | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 94 | val cs = (map o apsnd o apsnd o map o map_atyps) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 95 | (fn TFree (v, _) => TFree (v, (the o AList.lookup (op =) vs) v)) raw_cs; | 
| 51685 
385ef6706252
more standard module name Axclass (according to file name);
 wenzelm parents: 
51143diff
changeset | 96 |     val const = Axclass.param_of_inst thy (@{const_name partial_term_of}, tyco);
 | 
| 45344 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45159diff
changeset | 97 | val var_insts = | 
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45159diff
changeset | 98 | map (SOME o Thm.cterm_of thy o Logic.unvarify_types_global o Logic.varify_global) | 
| 46758 
4106258260b3
choosing longer constant names in Quickcheck_Narrowing to reduce the chances of name clashes in Quickcheck-Narrowing
 bulwahn parents: 
46587diff
changeset | 99 |         [Free ("ty", Term.itselfT ty), @{term "Quickcheck_Narrowing.Narrowing_variable p tt"},
 | 
| 45344 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45159diff
changeset | 100 |           @{term "Code_Evaluation.Free (STR ''_'')"} $ HOLogic.mk_typerep ty];
 | 
| 43079 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 101 | val var_eq = | 
| 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 102 |       @{thm partial_term_of_anything}
 | 
| 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 103 | |> Drule.instantiate' [SOME (Thm.ctyp_of thy ty)] var_insts | 
| 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 104 | |> Thm.varifyT_global | 
| 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 105 | val eqs = var_eq :: map_index (mk_partial_term_of_eq thy ty) cs; | 
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 106 | in | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 107 | thy | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 108 | |> Code.del_eqns const | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 109 | |> fold Code.add_eqn eqs | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 110 | end; | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 111 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 112 | fun ensure_partial_term_of_code (tyco, (raw_vs, cs)) thy = | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 113 | let | 
| 48272 | 114 |     val has_inst = Sorts.has_instance (Sign.classes_of thy) tyco @{sort partial_term_of};
 | 
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 115 | in if has_inst then add_partial_term_of_code tyco raw_vs cs thy else thy end; | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 116 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 117 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 118 | (* narrowing generators *) | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 119 | |
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 120 | (** narrowing specific names and types **) | 
| 41963 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 121 | |
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 122 | exception FUNCTION_TYPE; | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 123 | |
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 124 | val narrowingN = "narrowing"; | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 125 | |
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 126 | fun narrowingT T = | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
50046diff
changeset | 127 |   @{typ integer} --> Type (@{type_name Quickcheck_Narrowing.narrowing_cons}, [T])
 | 
| 41963 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 128 | |
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 129 | fun mk_cons c T = Const (@{const_name Quickcheck_Narrowing.cons}, T --> narrowingT T) $ Const (c, T)
 | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 130 | |
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 131 | fun mk_apply (T, t) (U, u) = | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 132 | let | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 133 | val (_, U') = dest_funT U | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 134 | in | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 135 |     (U', Const (@{const_name Quickcheck_Narrowing.apply},
 | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 136 | narrowingT U --> narrowingT T --> narrowingT U') $ u $ t) | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 137 | end | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 138 | |
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 139 | fun mk_sum (t, u) = | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 140 | let | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 141 | val T = fastype_of t | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 142 | in | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 143 |     Const (@{const_name Quickcheck_Narrowing.sum}, T --> T --> T) $ t $ u
 | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 144 | end | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 145 | |
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 146 | (** deriving narrowing instances **) | 
| 41963 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 147 | |
| 50046 | 148 | fun mk_equations descr vs narrowings = | 
| 41963 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 149 | let | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 150 | fun mk_call T = | 
| 42214 
9ca13615c619
refactoring generator definition in quickcheck and removing clone
 bulwahn parents: 
42184diff
changeset | 151 |       (T, Const (@{const_name "Quickcheck_Narrowing.narrowing_class.narrowing"}, narrowingT T))
 | 
| 41963 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 152 | fun mk_aux_call fTs (k, _) (tyco, Ts) = | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 153 | let | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 154 | val T = Type (tyco, Ts) | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 155 | val _ = if not (null fTs) then raise FUNCTION_TYPE else () | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 156 | in | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 157 | (T, nth narrowings k) | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 158 | end | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 159 | fun mk_consexpr simpleT (c, xs) = | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 160 | let | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 161 | val Ts = map fst xs | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 162 | in snd (fold mk_apply xs (Ts ---> simpleT, mk_cons c (Ts ---> simpleT))) end | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 163 | fun mk_rhs exprs = foldr1 mk_sum exprs | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 164 | val rhss = | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 165 | Datatype_Aux.interpret_construction descr vs | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 166 |         { atyp = mk_call, dtyp = mk_aux_call }
 | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 167 | |> (map o apfst) Type | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 168 | |> map (fn (T, cs) => map (mk_consexpr T) cs) | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 169 | |> map mk_rhs | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 170 | val lhss = narrowings | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 171 | val eqs = map (HOLogic.mk_Trueprop o HOLogic.mk_eq) (lhss ~~ rhss) | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 172 | in | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 173 | eqs | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 174 | end | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 175 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 176 | fun contains_recursive_type_under_function_types xs = | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 177 | exists (fn (_, (_, _, cs)) => cs |> exists (snd #> exists (fn dT => | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 178 | (case Datatype_Aux.strip_dtyp dT of (_ :: _, Datatype.DtRec _) => true | _ => false)))) xs | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 179 | |
| 41963 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 180 | fun instantiate_narrowing_datatype config descr vs tycos prfx (names, auxnames) (Ts, Us) thy = | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 181 | let | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 182 | val _ = Datatype_Aux.message config "Creating narrowing generators ..."; | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 183 | val narrowingsN = map (prefix (narrowingN ^ "_")) (names @ auxnames); | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 184 | in | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 185 | if not (contains_recursive_type_under_function_types descr) then | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 186 | thy | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 187 |       |> Class.instantiation (tycos, vs, @{sort narrowing})
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 188 | |> Quickcheck_Common.define_functions | 
| 50046 | 189 | (fn narrowings => mk_equations descr vs narrowings, NONE) | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 190 | prfx [] narrowingsN (map narrowingT (Ts @ Us)) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 191 | |> Class.prove_instantiation_exit (K (Class.intro_classes_tac [])) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 192 | else | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 193 | thy | 
| 41963 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 194 | end; | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 195 | |
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 196 | (* testing framework *) | 
| 
d8c3b26b3da4
tuned exhaustive generator compilation; added narrowing generator compilation; removed exec as does not work properly here (reverting changeset 994d088fbfbc)
 bulwahn parents: 
41953diff
changeset | 197 | |
| 43308 
fd6cc1378fec
compilation of Haskell in its own target for Quickcheck; passing options by arguments in Narrowing_Generators
 bulwahn parents: 
43240diff
changeset | 198 | val target = "Haskell_Quickcheck" | 
| 41930 
1e008cc4883a
renaming lazysmallcheck ML file to Quickcheck_Narrowing
 bulwahn parents: 
41925diff
changeset | 199 | |
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 200 | (** invocation of Haskell interpreter **) | 
| 41905 | 201 | |
| 43702 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43619diff
changeset | 202 | val narrowing_engine = | 
| 48901 
5e0455e29339
more basic file dependencies -- no load command here;
 wenzelm parents: 
48568diff
changeset | 203 | File.read (Path.explode "~~/src/HOL/Tools/Quickcheck/Narrowing_Engine.hs") | 
| 43702 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43619diff
changeset | 204 | |
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43619diff
changeset | 205 | val pnf_narrowing_engine = | 
| 48901 
5e0455e29339
more basic file dependencies -- no load command here;
 wenzelm parents: 
48568diff
changeset | 206 | File.read (Path.explode "~~/src/HOL/Tools/Quickcheck/PNF_Narrowing_Engine.hs") | 
| 41905 | 207 | |
| 208 | fun exec verbose code = | |
| 209 | ML_Context.exec (fn () => Secure.use_text ML_Env.local_context (0, "generated code") verbose code) | |
| 210 | ||
| 43079 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 211 | fun with_overlord_dir name f = | 
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 212 | let | 
| 43602 | 213 | val path = | 
| 214 | Path.append (Path.explode "$ISABELLE_HOME_USER") (Path.basic (name ^ serial_string ())) | |
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 215 | val _ = Isabelle_System.mkdirs path; | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 216 | in Exn.release (Exn.capture f path) end; | 
| 43379 
8c4b383e5143
quickcheck_narrowing returns some timing information
 bulwahn parents: 
43329diff
changeset | 217 | |
| 
8c4b383e5143
quickcheck_narrowing returns some timing information
 bulwahn parents: 
43329diff
changeset | 218 | fun elapsed_time description e = | 
| 
8c4b383e5143
quickcheck_narrowing returns some timing information
 bulwahn parents: 
43329diff
changeset | 219 |   let val ({elapsed, ...}, result) = Timing.timing e ()
 | 
| 
8c4b383e5143
quickcheck_narrowing returns some timing information
 bulwahn parents: 
43329diff
changeset | 220 | in (result, (description, Time.toMilliseconds elapsed)) end | 
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 221 | |
| 50046 | 222 | fun value (contains_existentials, ((genuine_only, (quiet, verbose)), size)) ctxt cookie (code_modules, _) = | 
| 41905 | 223 | let | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 224 | val ((is_genuine, counterexample_of), (get, put, put_ml)) = cookie | 
| 43308 
fd6cc1378fec
compilation of Haskell in its own target for Quickcheck; passing options by arguments in Narrowing_Generators
 bulwahn parents: 
43240diff
changeset | 225 | fun message s = if quiet then () else Output.urgent_message s | 
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45760diff
changeset | 226 | fun verbose_message s = if not quiet andalso verbose then Output.urgent_message s else () | 
| 43585 | 227 | val current_size = Unsynchronized.ref 0 | 
| 228 | val current_result = Unsynchronized.ref Quickcheck.empty_result | |
| 41930 
1e008cc4883a
renaming lazysmallcheck ML file to Quickcheck_Narrowing
 bulwahn parents: 
41925diff
changeset | 229 | val tmp_prefix = "Quickcheck_Narrowing" | 
| 47843 
4da917ed49b7
adding configuration to pass options to the ghc call in quickcheck[narrowing]
 bulwahn parents: 
47330diff
changeset | 230 | val ghc_options = Config.get ctxt ghc_options | 
| 43079 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 231 | val with_tmp_dir = | 
| 
4022892a2f28
improving overlord option and partial_term_of derivation; changing Narrowing_Engine to print partial terms
 bulwahn parents: 
43047diff
changeset | 232 | if Config.get ctxt overlord then with_overlord_dir else Isabelle_System.with_tmp_dir | 
| 41905 | 233 | fun run in_path = | 
| 234 | let | |
| 48568 | 235 | fun mk_code_file name = Path.append in_path (Path.basic (name ^ ".hs")) | 
| 236 | val generatedN = Code_Target.generatedN | |
| 237 | val includes = AList.delete (op =) generatedN code_modules |> (map o apfst) mk_code_file; | |
| 238 | val code = the (AList.lookup (op =) code_modules generatedN) | |
| 239 | val code_file = mk_code_file generatedN | |
| 240 | val narrowing_engine_file = mk_code_file "Narrowing_Engine" | |
| 241 | val main_file = mk_code_file "Main" | |
| 41905 | 242 |         val main = "module Main where {\n\n" ^
 | 
| 46335 
0fd9ab902b5a
using fully qualified module names in Haskell source, which seems to be required by GHC 7.0.4
 bulwahn parents: 
46316diff
changeset | 243 | "import System.IO;\n" ^ | 
| 
0fd9ab902b5a
using fully qualified module names in Haskell source, which seems to be required by GHC 7.0.4
 bulwahn parents: 
46316diff
changeset | 244 | "import System.Environment;\n" ^ | 
| 41933 
10f254a4e5b9
adapting Main file generation for Quickcheck_Narrowing
 bulwahn parents: 
41932diff
changeset | 245 | "import Narrowing_Engine;\n" ^ | 
| 48568 | 246 | "import " ^ generatedN ^ " ;\n\n" ^ | 
| 45685 
e2e928af750b
quickcheck narrowing also shows potential counterexamples
 bulwahn parents: 
45420diff
changeset | 247 | "main = getArgs >>= \\[potential, size] -> " ^ | 
| 48568 | 248 |           "Narrowing_Engine.depthCheck (read potential) (read size) (" ^ generatedN ^ ".value ())\n\n" ^
 | 
| 41905 | 249 | "}\n" | 
| 48565 
7c497a239007
restored narrowing quickcheck after 6efff142bb54
 haftmann parents: 
48272diff
changeset | 250 | val code' = code | 
| 
7c497a239007
restored narrowing quickcheck after 6efff142bb54
 haftmann parents: 
48272diff
changeset | 251 | |> unsuffix "}\n" | 
| 
7c497a239007
restored narrowing quickcheck after 6efff142bb54
 haftmann parents: 
48272diff
changeset | 252 | |> suffix "data Typerep = Typerep String [Typerep];\n\n}\n" (* FIXME *) | 
| 48568 | 253 | val _ = map (uncurry File.write) (includes @ | 
| 254 | [(narrowing_engine_file, if contains_existentials then pnf_narrowing_engine else narrowing_engine), | |
| 255 | (code_file, code'), (main_file, main)]) | |
| 43114 
b9fca691addd
Quickcheck Narrowing only requires one compilation with GHC now
 bulwahn parents: 
43079diff
changeset | 256 | val executable = File.shell_path (Path.append in_path (Path.basic "isabelle_quickcheck_narrowing")) | 
| 44926 
de3ed037c9a5
create central list for language extensions used by the haskell code generator
 noschinl parents: 
44852diff
changeset | 257 | val cmd = "exec \"$ISABELLE_GHC\" " ^ Code_Haskell.language_params ^ " " ^ | 
| 47843 
4da917ed49b7
adding configuration to pass options to the ghc call in quickcheck[narrowing]
 bulwahn parents: 
47330diff
changeset | 258 | ghc_options ^ " " ^ | 
| 48568 | 259 | (space_implode " " (map File.shell_path (map fst includes @ [code_file, narrowing_engine_file, main_file]))) ^ | 
| 43114 
b9fca691addd
Quickcheck Narrowing only requires one compilation with GHC now
 bulwahn parents: 
43079diff
changeset | 260 | " -o " ^ executable ^ ";" | 
| 50046 | 261 | val (_, compilation_time) = | 
| 48568 | 262 | elapsed_time "Haskell compilation" (fn () => Isabelle_System.bash cmd) | 
| 43585 | 263 | val _ = Quickcheck.add_timing compilation_time current_result | 
| 45685 
e2e928af750b
quickcheck narrowing also shows potential counterexamples
 bulwahn parents: 
45420diff
changeset | 264 | fun haskell_string_of_bool v = if v then "True" else "False" | 
| 43850 
7f2cbc713344
moved bash operations to Isabelle_System (cf. Scala version);
 wenzelm parents: 
43702diff
changeset | 265 | val _ = if Isabelle_System.bash cmd <> 0 then error "Compilation with GHC failed" else () | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 266 | fun with_size genuine_only k = | 
| 43308 
fd6cc1378fec
compilation of Haskell in its own target for Quickcheck; passing options by arguments in Narrowing_Generators
 bulwahn parents: 
43240diff
changeset | 267 | if k > size then | 
| 43585 | 268 | (NONE, !current_result) | 
| 43114 
b9fca691addd
Quickcheck Narrowing only requires one compilation with GHC now
 bulwahn parents: 
43079diff
changeset | 269 | else | 
| 
b9fca691addd
Quickcheck Narrowing only requires one compilation with GHC now
 bulwahn parents: 
43079diff
changeset | 270 | let | 
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45760diff
changeset | 271 |               val _ = verbose_message ("[Quickcheck-narrowing] Test data size: " ^ string_of_int k)
 | 
| 43585 | 272 | val _ = current_size := k | 
| 273 |               val ((response, _), timing) = elapsed_time ("execution of size " ^ string_of_int k)
 | |
| 45685 
e2e928af750b
quickcheck narrowing also shows potential counterexamples
 bulwahn parents: 
45420diff
changeset | 274 | (fn () => Isabelle_System.bash_output | 
| 45760 
3b5a735897c3
inverted flag potential to genuine_only in the quickcheck narrowing Haskell code
 bulwahn parents: 
45757diff
changeset | 275 | (executable ^ " " ^ haskell_string_of_bool genuine_only ^ " " ^ string_of_int k)) | 
| 43585 | 276 | val _ = Quickcheck.add_timing timing current_result | 
| 43114 
b9fca691addd
Quickcheck Narrowing only requires one compilation with GHC now
 bulwahn parents: 
43079diff
changeset | 277 | in | 
| 43585 | 278 | if response = "NONE\n" then | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 279 | with_size genuine_only (k + 1) | 
| 43585 | 280 | else | 
| 281 | let | |
| 282 | val output_value = the_default "NONE" | |
| 283 | (try (snd o split_last o filter_out (fn s => s = "") o split_lines) response) | |
| 284 | |> translate_string (fn s => if s = "\\" then "\\\\" else s) | |
| 285 |                   val ml_code = "\nval _ = Context.set_thread_data (SOME (Context.map_proof (" ^ put_ml
 | |
| 286 | ^ " (fn () => " ^ output_value ^ ")) (ML_Context.the_generic_context ())))"; | |
| 287 | val ctxt' = ctxt | |
| 288 |                     |> put (fn () => error ("Bad evaluation for " ^ quote put_ml))
 | |
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 289 | |> Context.proof_map (exec false ml_code); | 
| 45757 
e32dd098f57a
renaming potential flag to genuine_only flag with an inverse semantics
 bulwahn parents: 
45756diff
changeset | 290 | val counterexample = get ctxt' () | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 291 | in | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 292 | if is_genuine counterexample then | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 293 | (counterexample, !current_result) | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 294 | else | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 295 | let | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 296 | val cex = Option.map (rpair []) (counterexample_of counterexample) | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 297 | in | 
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45760diff
changeset | 298 | (message (Pretty.string_of (Quickcheck.pretty_counterex ctxt false cex)); | 
| 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45760diff
changeset | 299 | message "Quickcheck continues to find a genuine counterexample..."; | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 300 | with_size true (k + 1)) | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 301 | end | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 302 | end | 
| 43585 | 303 | end | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 304 | in with_size genuine_only 0 end | 
| 43585 | 305 | in | 
| 45418 | 306 | with_tmp_dir tmp_prefix run | 
| 43585 | 307 | end; | 
| 41905 | 308 | |
| 43308 
fd6cc1378fec
compilation of Haskell in its own target for Quickcheck; passing options by arguments in Narrowing_Generators
 bulwahn parents: 
43240diff
changeset | 309 | fun dynamic_value_strict opts cookie thy postproc t = | 
| 41905 | 310 | let | 
| 43114 
b9fca691addd
Quickcheck Narrowing only requires one compilation with GHC now
 bulwahn parents: 
43079diff
changeset | 311 | val ctxt = Proof_Context.init_global thy | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 312 | fun evaluator naming program ((_, vs_ty), t) deps = | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 313 | Exn.interruptible_capture (value opts ctxt cookie) | 
| 48568 | 314 | (Code_Target.evaluator thy target naming program deps (vs_ty, t)); | 
| 41905 | 315 | in Exn.release (Code_Thingol.dynamic_value thy (Exn.map_result o postproc) evaluator t) end; | 
| 316 | ||
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 317 | (** counterexample generator **) | 
| 46042 | 318 | |
| 319 | (* FIXME just one data slot (record) per program unit *) | |
| 41932 
e8f113ce8a94
adapting Quickcheck_Narrowing and example file to new names
 bulwahn parents: 
41930diff
changeset | 320 | structure Counterexample = Proof_Data | 
| 41905 | 321 | ( | 
| 45725 
2987b29518aa
the narrowing also indicates if counterexample is potentially spurious
 bulwahn parents: 
45685diff
changeset | 322 | type T = unit -> (bool * term list) option | 
| 41936 
9792a882da9c
renaming tester from lazy_exhaustive to narrowing
 bulwahn parents: 
41933diff
changeset | 323 | fun init _ () = error "Counterexample" | 
| 41905 | 324 | ) | 
| 325 | ||
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 326 | datatype counterexample = Universal_Counterexample of (term * counterexample) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 327 | | Existential_Counterexample of (term * counterexample) list | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 328 | | Empty_Assignment | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 329 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 330 | fun map_counterexample f Empty_Assignment = Empty_Assignment | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 331 | | map_counterexample f (Universal_Counterexample (t, c)) = | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 332 | Universal_Counterexample (f t, map_counterexample f c) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 333 | | map_counterexample f (Existential_Counterexample cs) = | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 334 | Existential_Counterexample (map (fn (t, c) => (f t, map_counterexample f c)) cs) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 335 | |
| 46042 | 336 | (* FIXME just one data slot (record) per program unit *) | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 337 | structure Existential_Counterexample = Proof_Data | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 338 | ( | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 339 | type T = unit -> counterexample option | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 340 | fun init _ () = error "Counterexample" | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 341 | ) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 342 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 343 | val put_existential_counterexample = Existential_Counterexample.put | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 344 | |
| 42024 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 345 | val put_counterexample = Counterexample.put | 
| 42023 
1bd4b6d1c482
adding minimalistic setup and transformation to handle functions as data to enable naive function generation for Quickcheck_Narrowing
 bulwahn parents: 
42020diff
changeset | 346 | |
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 347 | fun finitize_functions (xTs, t) = | 
| 42024 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 348 | let | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 349 | val (names, boundTs) = split_list xTs | 
| 42024 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 350 | fun mk_eval_ffun dT rT = | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 351 |       Const (@{const_name "Quickcheck_Narrowing.eval_ffun"}, 
 | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 352 |         Type (@{type_name "Quickcheck_Narrowing.ffun"}, [dT, rT]) --> dT --> rT)
 | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 353 | fun mk_eval_cfun dT rT = | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 354 |       Const (@{const_name "Quickcheck_Narrowing.eval_cfun"}, 
 | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 355 |         Type (@{type_name "Quickcheck_Narrowing.cfun"}, [rT]) --> dT --> rT)
 | 
| 50046 | 356 |     fun eval_function (Type (@{type_name fun}, [dT, rT])) =
 | 
| 42024 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 357 | let | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 358 | val (rt', rT') = eval_function rT | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 359 | in | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 360 | case dT of | 
| 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 361 |           Type (@{type_name fun}, _) =>
 | 
| 44241 | 362 | (fn t => absdummy dT (rt' (mk_eval_cfun dT rT' $ incr_boundvars 1 t $ Bound 0)), | 
| 363 |               Type (@{type_name "Quickcheck_Narrowing.cfun"}, [rT']))
 | |
| 364 | | _ => | |
| 365 | (fn t => absdummy dT (rt' (mk_eval_ffun dT rT' $ incr_boundvars 1 t $ Bound 0)), | |
| 366 |               Type (@{type_name "Quickcheck_Narrowing.ffun"}, [dT, rT']))
 | |
| 42024 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 367 | end | 
| 47330 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 368 |       | eval_function (T as Type (@{type_name prod}, [fT, sT])) =
 | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 369 | let | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 370 | val (ft', fT') = eval_function fT | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 371 | val (st', sT') = eval_function sT | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 372 |           val T' = Type (@{type_name prod}, [fT', sT'])
 | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 373 |           val map_const = Const (@{const_name map_pair}, (fT' --> fT) --> (sT' --> sT) --> T' --> T)
 | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 374 | fun apply_dummy T t = absdummy T (t (Bound 0)) | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 375 | in | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 376 | (fn t => list_comb (map_const, [apply_dummy fT' ft', apply_dummy sT' st', t]), T') | 
| 
8fe04753a210
rudimentary handling of products in finitize_functions in Quickcheck-Narrowing
 bulwahn parents: 
46758diff
changeset | 377 | end | 
| 42024 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 378 | | eval_function T = (I, T) | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 379 | val (tt, boundTs') = split_list (map eval_function boundTs) | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 380 | val t' = subst_bounds (map2 (fn f => fn x => f x) (rev tt) (map_index (Bound o fst) boundTs), t) | 
| 42024 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 381 | in | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 382 | (names ~~ boundTs', t') | 
| 42024 
51df23535105
handling a quite restricted set of functions in Quickcheck_Narrowing by an easy transformation
 bulwahn parents: 
42023diff
changeset | 383 | end | 
| 42023 
1bd4b6d1c482
adding minimalistic setup and transformation to handle functions as data to enable naive function generation for Quickcheck_Narrowing
 bulwahn parents: 
42020diff
changeset | 384 | |
| 45039 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 385 | fun dest_ffun (Type (@{type_name "Quickcheck_Narrowing.ffun"}, [dT, rT])) = (dT, rT)
 | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 386 | |
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 387 | fun eval_finite_functions (Const (@{const_name "Quickcheck_Narrowing.ffun.Constant"}, T) $ value) =
 | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 388 | absdummy (fst (dest_ffun (body_type T))) (eval_finite_functions value) | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 389 |   | eval_finite_functions (Const (@{const_name "Quickcheck_Narrowing.ffun.Update"}, T) $ a $ b $ f) =
 | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 390 | let | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 391 | val (T1, T2) = dest_ffun (body_type T) | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 392 | in | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 393 | Quickcheck_Common.mk_fun_upd T1 T2 | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 394 | (eval_finite_functions a, eval_finite_functions b) (eval_finite_functions f) | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 395 | end | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 396 | | eval_finite_functions t = t | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 397 | |
| 43114 
b9fca691addd
Quickcheck Narrowing only requires one compilation with GHC now
 bulwahn parents: 
43079diff
changeset | 398 | (** tester **) | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 399 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 400 | val rewrs = | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 401 | map (swap o HOLogic.dest_eq o HOLogic.dest_Trueprop o Thm.prop_of) | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 402 |       (@{thms all_simps} @ @{thms ex_simps})
 | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 403 | @ map (HOLogic.dest_eq o HOLogic.dest_Trueprop o Thm.prop_of) | 
| 46316 | 404 |         [@{thm iff_conv_conj_imp}, @{thm not_ex}, @{thm not_all},
 | 
| 405 |          @{thm meta_eq_to_obj_eq [OF Ex1_def]}]
 | |
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 406 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 407 | fun make_pnf_term thy t = Pattern.rewrite_term thy rewrs [] t | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 408 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 409 | fun strip_quantifiers (Const (@{const_name Ex}, _) $ Abs (x, T, t)) =
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 410 |     apfst (cons (@{const_name Ex}, (x, T))) (strip_quantifiers t)
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 411 |   | strip_quantifiers (Const (@{const_name All}, _) $ Abs (x, T, t)) =
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 412 |     apfst (cons (@{const_name All}, (x, T))) (strip_quantifiers t)
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 413 | | strip_quantifiers t = ([], t) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 414 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 415 | fun contains_existentials t = exists (fn (Q, _) => Q = @{const_name Ex}) (fst (strip_quantifiers t))
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 416 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 417 | fun mk_property qs t = | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 418 | let | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 419 |     fun enclose (@{const_name Ex}, (x, T)) t =
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 420 |         Const (@{const_name Quickcheck_Narrowing.exists}, (T --> @{typ property}) --> @{typ property})
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 421 | $ Abs (x, T, t) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 422 |       | enclose (@{const_name All}, (x, T)) t =
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 423 |         Const (@{const_name Quickcheck_Narrowing.all}, (T --> @{typ property}) --> @{typ property})
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 424 | $ Abs (x, T, t) | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 425 | in | 
| 45002 
df36896aae0f
removing superfluous definition in the quickcheck narrowing invocation as the code generator now generates valid Haskell code with necessary type annotations without a separate definition
 bulwahn parents: 
44926diff
changeset | 426 |     fold_rev enclose qs (@{term Quickcheck_Narrowing.Property} $ t)
 | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 427 | end | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 428 | |
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 429 | fun mk_case_term ctxt p ((@{const_name Ex}, (x, T)) :: qs') (Existential_Counterexample cs) =
 | 
| 51673 
4dfa00e264d8
separate data used for case translation from the datatype package
 traytel parents: 
51672diff
changeset | 430 | Case_Translation.make_case ctxt Case_Translation.Quiet Name.context (Free (x, T)) (map (fn (t, c) => | 
| 43317 | 431 | (t, mk_case_term ctxt (p - 1) qs' c)) cs) | 
| 50046 | 432 |   | mk_case_term ctxt p ((@{const_name All}, _) :: qs') (Universal_Counterexample (t, c)) =
 | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 433 | if p = 0 then t else mk_case_term ctxt (p - 1) qs' c | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 434 | |
| 45039 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 435 | val post_process = (perhaps (try Quickcheck_Common.post_process_term)) o eval_finite_functions | 
| 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 436 | |
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 437 | fun mk_terms ctxt qs result = | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 438 | let | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 439 | val | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 440 |       ps = filter (fn (_, (@{const_name All}, _)) => true | _ => false) (map_index I qs)
 | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 441 | in | 
| 50046 | 442 | map (fn (p, (_, (x, _))) => (x, mk_case_term ctxt p qs result)) ps | 
| 45039 
632a033616e9
adding post-processing of terms to narrowing-based Quickcheck
 bulwahn parents: 
45002diff
changeset | 443 | |> map (apsnd post_process) | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 444 | end | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 445 | |
| 50046 | 446 | fun test_term ctxt catch_code_errors (t, _) = | 
| 41905 | 447 | let | 
| 43585 | 448 | fun dest_result (Quickcheck.Result r) = r | 
| 449 | val opts = | |
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45760diff
changeset | 450 | ((Config.get ctxt Quickcheck.genuine_only, | 
| 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45760diff
changeset | 451 | (Config.get ctxt Quickcheck.quiet, Config.get ctxt Quickcheck.verbose)), | 
| 45685 
e2e928af750b
quickcheck narrowing also shows potential counterexamples
 bulwahn parents: 
45420diff
changeset | 452 | Config.get ctxt Quickcheck.size) | 
| 42361 | 453 | val thy = Proof_Context.theory_of ctxt | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 454 | val t' = fold_rev (fn (x, T) => fn t => HOLogic.mk_all (x, T, t)) (Term.add_frees t []) t | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 455 | val pnf_t = make_pnf_term thy t' | 
| 41905 | 456 | in | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 457 | if Config.get ctxt allow_existentials andalso contains_existentials pnf_t then | 
| 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 458 | let | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 459 | fun wrap f (qs, t) = | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 460 | let val (qs1, qs2) = split_list qs in | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 461 | apfst (map2 pair qs1) (f (qs2, t)) end | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 462 | val finitize = if Config.get ctxt finite_functions then wrap finitize_functions else I | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 463 | val (qs, prop_t) = finitize (strip_quantifiers pnf_t) | 
| 46309 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 464 | val act = if catch_code_errors then try else (fn f => SOME o f) | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 465 | val execute = dynamic_value_strict (true, opts) | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 466 | ((K true, fn _ => error ""), (Existential_Counterexample.get, Existential_Counterexample.put, | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 467 | "Narrowing_Generators.put_existential_counterexample")) | 
| 46309 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 468 | thy (apfst o Option.map o map_counterexample) | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 469 | in | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 470 | case act execute (mk_property qs prop_t) of | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 471 | SOME (counterexample, result) => Quickcheck.Result | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 472 |             {counterexample = Option.map (pair true o mk_terms ctxt qs) counterexample,
 | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 473 | evaluation_terms = Option.map (K []) counterexample, | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 474 | timings = #timings (dest_result result), reports = #reports (dest_result result)} | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 475 | | NONE => | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 476 |           (Quickcheck.message ctxt ("Conjecture is not executable with Quickcheck-narrowing");
 | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 477 | Quickcheck.empty_result) | 
| 43237 
8f5c3c6c2909
adding compilation that allows existentials in Quickcheck_Narrowing
 bulwahn parents: 
43114diff
changeset | 478 | end | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 479 | else | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 480 | let | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 481 | val frees = Term.add_frees t [] | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 482 | val t' = fold_rev absfree frees t | 
| 46219 
426ed18eba43
discontinued old-style Term.list_abs in favour of plain Term.abs;
 wenzelm parents: 
46042diff
changeset | 483 | fun wrap f t = uncurry (fold_rev Term.abs) (f (strip_abs t)) | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 484 | val finitize = if Config.get ctxt finite_functions then wrap finitize_functions else I | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 485 | fun ensure_testable t = | 
| 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 486 |           Const (@{const_name Quickcheck_Narrowing.ensure_testable}, fastype_of t --> fastype_of t) $ t
 | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 487 | fun is_genuine (SOME (true, _)) = true | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 488 | | is_genuine _ = false | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 489 | val counterexample_of = Option.map (apsnd (curry (op ~~) (map fst frees) o map post_process)) | 
| 46309 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 490 | val act = if catch_code_errors then try else (fn f => SOME o f) | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 491 | val execute = dynamic_value_strict (false, opts) | 
| 45756 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 492 | ((is_genuine, counterexample_of), | 
| 
295658b28d3b
quickcheck narrowing continues searching after found a potentially spurious counterexample
 bulwahn parents: 
45728diff
changeset | 493 | (Counterexample.get, Counterexample.put, "Narrowing_Generators.put_counterexample")) | 
| 46309 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 494 | thy (apfst o Option.map o apsnd o map) | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 495 | in | 
| 46309 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 496 | case act execute (ensure_testable (finitize t')) of | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 497 | SOME (counterexample, result) => | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 498 | Quickcheck.Result | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 499 |              {counterexample = counterexample_of counterexample,
 | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 500 | evaluation_terms = Option.map (K []) counterexample, | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 501 | timings = #timings (dest_result result), | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 502 | reports = #reports (dest_result result)} | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 503 | | NONE => | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 504 |           (Quickcheck.message ctxt ("Conjecture is not executable with Quickcheck-narrowing");
 | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 505 | Quickcheck.empty_result) | 
| 43240 
da47097bd589
adding finitize_functions and processing of equivalences in existential compilation in quickcheck_narrowing
 bulwahn parents: 
43237diff
changeset | 506 | end | 
| 41905 | 507 | end; | 
| 508 | ||
| 46309 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 509 | fun test_goals ctxt catch_code_errors insts goals = | 
| 43314 
a9090cabca14
adding a nicer error message for quickcheck_narrowing; hiding fact empty_def
 bulwahn parents: 
43308diff
changeset | 510 | if (not (getenv "ISABELLE_GHC" = "")) then | 
| 
a9090cabca14
adding a nicer error message for quickcheck_narrowing; hiding fact empty_def
 bulwahn parents: 
43308diff
changeset | 511 | let | 
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45760diff
changeset | 512 |       val _ = Quickcheck.message ctxt ("Testing conjecture with Quickcheck-narrowing...")
 | 
| 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: 
45039diff
changeset | 513 | val correct_inst_goals = Quickcheck_Common.instantiate_goals ctxt insts goals | 
| 43314 
a9090cabca14
adding a nicer error message for quickcheck_narrowing; hiding fact empty_def
 bulwahn parents: 
43308diff
changeset | 514 | in | 
| 46309 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 515 | Quickcheck_Common.collect_results (test_term ctxt catch_code_errors) | 
| 
693d8d7bc3cd
catching code generation errors in quickcheck-narrowing
 bulwahn parents: 
46219diff
changeset | 516 | (maps (map snd) correct_inst_goals) [] | 
| 43314 
a9090cabca14
adding a nicer error message for quickcheck_narrowing; hiding fact empty_def
 bulwahn parents: 
43308diff
changeset | 517 | end | 
| 
a9090cabca14
adding a nicer error message for quickcheck_narrowing; hiding fact empty_def
 bulwahn parents: 
43308diff
changeset | 518 | else | 
| 
a9090cabca14
adding a nicer error message for quickcheck_narrowing; hiding fact empty_def
 bulwahn parents: 
43308diff
changeset | 519 | (if Config.get ctxt Quickcheck.quiet then () else Output.urgent_message | 
| 
a9090cabca14
adding a nicer error message for quickcheck_narrowing; hiding fact empty_def
 bulwahn parents: 
43308diff
changeset | 520 |       ("Environment variable ISABELLE_GHC is not set. To use narrowing-based quickcheck, please set "
 | 
| 43911 
a1da544e2652
more information for the user how to deactivate quickcheck_narrowing if he does not want to use it
 bulwahn parents: 
43910diff
changeset | 521 | ^ "this variable to your GHC Haskell compiler in your settings file. " | 
| 
a1da544e2652
more information for the user how to deactivate quickcheck_narrowing if he does not want to use it
 bulwahn parents: 
43910diff
changeset | 522 | ^ "To deactivate narrowing-based quickcheck, set quickcheck_narrowing_active to false."); | 
| 
a1da544e2652
more information for the user how to deactivate quickcheck_narrowing if he does not want to use it
 bulwahn parents: 
43910diff
changeset | 523 | [Quickcheck.empty_result]) | 
| 43114 
b9fca691addd
Quickcheck Narrowing only requires one compilation with GHC now
 bulwahn parents: 
43079diff
changeset | 524 | |
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 525 | (* setup *) | 
| 41905 | 526 | |
| 46587 
d3bcc356cc60
preliminarily switching quickcheck-narrowing off by default (probably it should only be invoked if concrete testing does not work)
 bulwahn parents: 
46335diff
changeset | 527 | val active = Attrib.setup_config_bool @{binding quickcheck_narrowing_active} (K false);
 | 
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43850diff
changeset | 528 | |
| 41905 | 529 | val setup = | 
| 43047 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 530 | Code.datatype_interpretation ensure_partial_term_of | 
| 
26774ccb1c74
automatic derivation of partial_term_of functions; renaming type and term to longer names narrowing_type and narrowing_term; hiding constant C; adding overlord option
 bulwahn parents: 
42616diff
changeset | 531 | #> Code.datatype_interpretation ensure_partial_term_of_code | 
| 45923 
473b744c23f2
generalize ensure_sort_datatype to ensure_sort  in quickcheck_common to allow generators for abstract types;
 bulwahn parents: 
45891diff
changeset | 532 |   #> Quickcheck_Common.datatype_interpretation (@{sort narrowing}, instantiate_narrowing_datatype)
 | 
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43850diff
changeset | 533 |   #> Context.theory_map (Quickcheck.add_tester ("narrowing", (active, test_goals)))
 | 
| 41905 | 534 | |
| 44272 | 535 | end; |