| author | wenzelm | 
| Sun, 24 Feb 2013 17:29:55 +0100 | |
| changeset 51268 | fcc4b89a600d | 
| parent 50201 | c26369c9eda6 | 
| child 51302 | de47a499bc04 | 
| permissions | -rw-r--r-- | 
| 30824 | 1 | (* Title: Tools/quickcheck.ML | 
| 40246 
c03fc7d3fa97
changed global fixed timeout to a configurable timeout for quickcheck; test parameters in quickcheck are now fully passed around with the context
 bulwahn parents: 
40225diff
changeset | 2 | Author: Stefan Berghofer, Florian Haftmann, Lukas Bulwahn, TU Muenchen | 
| 28256 | 3 | |
| 4 | Generic counterexample search engine. | |
| 5 | *) | |
| 6 | ||
| 7 | signature QUICKCHECK = | |
| 8 | sig | |
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 9 | val quickcheckN: string | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 10 | val genuineN: string | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 11 | val noneN: string | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 12 | val unknownN: string | 
| 37910 
555287ba8d8d
reordering quickcheck signature; exporting test_params and inspection function
 bulwahn parents: 
37909diff
changeset | 13 | val setup: theory -> theory | 
| 
555287ba8d8d
reordering quickcheck signature; exporting test_params and inspection function
 bulwahn parents: 
37909diff
changeset | 14 | (* configuration *) | 
| 32740 | 15 | val auto: bool Unsynchronized.ref | 
| 43882 
05d5696f177f
renaming quickcheck_tester to quickcheck_batch_tester; tuned
 bulwahn parents: 
43881diff
changeset | 16 | val batch_tester : string Config.T | 
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 17 | val size : int Config.T | 
| 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 18 | val iterations : int Config.T | 
| 45213 | 19 | val depth : int Config.T | 
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 20 | val no_assms : bool Config.T | 
| 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 21 | val report : bool Config.T | 
| 46565 | 22 | val timeout : real Config.T | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 23 | val timing : bool Config.T | 
| 45757 
e32dd098f57a
renaming potential flag to genuine_only flag with an inverse semantics
 bulwahn parents: 
45755diff
changeset | 24 | val genuine_only : bool Config.T | 
| 46477 
db693eb03a3f
adding abort_potential configuration in Quickcheck
 bulwahn parents: 
46343diff
changeset | 25 | val abort_potential : bool Config.T | 
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 26 | val quiet : bool Config.T | 
| 45764 | 27 | val verbose : bool Config.T | 
| 46565 | 28 | val use_subtype : bool Config.T | 
| 29 | val allow_function_inversion : bool Config.T | |
| 40648 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 30 | val finite_types : bool Config.T | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 31 | val finite_type_size : int Config.T | 
| 46863 | 32 | val tag : string Config.T | 
| 47348 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 33 | val locale : string Config.T | 
| 43912 
13e6a4e70219
exporting function in quickcheck; adapting mutabelle script
 bulwahn parents: 
43884diff
changeset | 34 | val set_active_testers: string list -> Context.generic -> Context.generic | 
| 41517 | 35 | datatype expectation = No_Expectation | No_Counterexample | Counterexample; | 
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 36 |   datatype test_params = Test_Params of {default_type: typ list, expect : expectation};
 | 
| 40246 
c03fc7d3fa97
changed global fixed timeout to a configurable timeout for quickcheck; test parameters in quickcheck are now fully passed around with the context
 bulwahn parents: 
40225diff
changeset | 37 | val test_params_of : Proof.context -> test_params | 
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 38 | val map_test_params : (typ list * expectation -> typ list * expectation) | 
| 40246 
c03fc7d3fa97
changed global fixed timeout to a configurable timeout for quickcheck; test parameters in quickcheck are now fully passed around with the context
 bulwahn parents: 
40225diff
changeset | 39 | -> Context.generic -> Context.generic | 
| 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: 
43915diff
changeset | 40 | val default_type : Proof.context -> typ list | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42088diff
changeset | 41 | datatype report = Report of | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42088diff
changeset | 42 |     { iterations : int, raised_match_errors : int,
 | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42088diff
changeset | 43 | satisfied_assms : int list, positive_concl_tests : int } | 
| 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42088diff
changeset | 44 | (* quickcheck's result *) | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 45 | datatype result = | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 46 | Result of | 
| 45727 
5e46c225370e
extending quickcheck's result by the genuine flag
 bulwahn parents: 
45682diff
changeset | 47 |      {counterexample : (bool * (string * term) list) option,
 | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 48 | evaluation_terms : (term * term) list option, | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 49 | timings : (string * int) list, | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 50 | reports : (int * report) list} | 
| 43314 
a9090cabca14
adding a nicer error message for quickcheck_narrowing; hiding fact empty_def
 bulwahn parents: 
43147diff
changeset | 51 | val empty_result : result | 
| 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: 
43915diff
changeset | 52 | val found_counterexample : result -> bool | 
| 43585 | 53 | val add_timing : (string * int) -> result Unsynchronized.ref -> unit | 
| 45727 
5e46c225370e
extending quickcheck's result by the genuine flag
 bulwahn parents: 
45682diff
changeset | 54 | val add_response : string list -> term list -> (bool * term list) option -> result Unsynchronized.ref -> unit | 
| 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: 
43915diff
changeset | 55 | val add_report : int -> report option -> result Unsynchronized.ref -> unit | 
| 45727 
5e46c225370e
extending quickcheck's result by the genuine flag
 bulwahn parents: 
45682diff
changeset | 56 | val counterexample_of : result -> (bool * (string * term) list) option | 
| 42089 
904897d0c5bd
adapting mutabelle; exporting more Quickcheck functions
 bulwahn parents: 
42088diff
changeset | 57 | val timings_of : result -> (string * int) list | 
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 58 | (* registering testers & generators *) | 
| 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 59 | type tester = | 
| 45419 
10ba32c347b0
quickcheck fails with code generator errors only if one tester is invoked
 bulwahn parents: 
45418diff
changeset | 60 | Proof.context -> bool -> (string * typ) list -> (term * term list) list -> result list | 
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 61 | val add_tester : string * (bool Config.T * tester) -> Context.generic -> Context.generic | 
| 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 62 | val add_batch_generator : | 
| 43112 
3117573292b8
adding registration of testers in Quickcheck for its use in Quickcheck_Narrowing
 bulwahn parents: 
43029diff
changeset | 63 | string * (Proof.context -> term list -> (int -> term list option) list) | 
| 
3117573292b8
adding registration of testers in Quickcheck for its use in Quickcheck_Narrowing
 bulwahn parents: 
43029diff
changeset | 64 | -> Context.generic -> Context.generic | 
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 65 | val add_batch_validator : | 
| 43112 
3117573292b8
adding registration of testers in Quickcheck for its use in Quickcheck_Narrowing
 bulwahn parents: 
43029diff
changeset | 66 | string * (Proof.context -> term list -> (int -> bool) list) | 
| 
3117573292b8
adding registration of testers in Quickcheck for its use in Quickcheck_Narrowing
 bulwahn parents: 
43029diff
changeset | 67 | -> Context.generic -> Context.generic | 
| 43113 
7226051e8b89
splitting test_goal_terms in Quickcheck into smaller basic functions
 bulwahn parents: 
43112diff
changeset | 68 | (* basic operations *) | 
| 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: 
43915diff
changeset | 69 | val message : Proof.context -> string -> unit | 
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45764diff
changeset | 70 | val verbose_message : Proof.context -> string -> unit | 
| 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: 
43915diff
changeset | 71 | val limit : Time.time -> (bool * bool) -> (unit -> 'a) -> (unit -> 'a) -> unit -> 'a | 
| 45755 
b27a06dfb2ef
outputing the potentially spurious counterexample and continue search
 bulwahn parents: 
45730diff
changeset | 72 | val pretty_counterex : Proof.context -> bool -> | 
| 
b27a06dfb2ef
outputing the potentially spurious counterexample and continue search
 bulwahn parents: 
45730diff
changeset | 73 | ((bool * (string * term) list) * (term * term) list) option -> Pretty.T | 
| 37910 
555287ba8d8d
reordering quickcheck signature; exporting test_params and inspection function
 bulwahn parents: 
37909diff
changeset | 74 | (* testing terms and proof states *) | 
| 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: 
43915diff
changeset | 75 | val mk_batch_validator : Proof.context -> term list -> (int -> bool) list option | 
| 
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: 
43915diff
changeset | 76 | val mk_batch_tester : Proof.context -> term list -> (int -> term list option) list option | 
| 
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: 
43915diff
changeset | 77 | val active_testers : Proof.context -> tester list | 
| 
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: 
43915diff
changeset | 78 | val test_terms : | 
| 43883 
aacbe67793c3
adapting mutabelle to latest changes in quickcheck; removing unused code in mutabelle
 bulwahn parents: 
43882diff
changeset | 79 | Proof.context -> bool * bool -> (string * typ) list -> (term * term list) list -> result list option | 
| 45727 
5e46c225370e
extending quickcheck's result by the genuine flag
 bulwahn parents: 
45682diff
changeset | 80 | val quickcheck: (string * string list) list -> int -> Proof.state -> (bool * (string * term) list) option | 
| 28256 | 81 | end; | 
| 82 | ||
| 83 | structure Quickcheck : QUICKCHECK = | |
| 84 | struct | |
| 85 | ||
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 86 | val quickcheckN = "quickcheck" | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 87 | |
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 88 | val genuineN = "genuine" | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 89 | val noneN = "none" | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 90 | val unknownN = "unknown" | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 91 | |
| 30980 | 92 | (* preferences *) | 
| 93 | ||
| 32740 | 94 | val auto = Unsynchronized.ref false; | 
| 30980 | 95 | |
| 96 | val _ = | |
| 97 | ProofGeneralPgip.add_preference Preferences.category_tracing | |
| 39616 
8052101883c3
renamed setmp_noncritical to Unsynchronized.setmp to emphasize its meaning;
 wenzelm parents: 
39329diff
changeset | 98 | (Unsynchronized.setmp auto true (fn () => | 
| 30980 | 99 | Preferences.bool_pref auto | 
| 100 | "auto-quickcheck" | |
| 39329 | 101 | "Run Quickcheck automatically.") ()); | 
| 30980 | 102 | |
| 35378 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 103 | (* quickcheck report *) | 
| 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 104 | |
| 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 105 | datatype report = Report of | 
| 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 106 |   { iterations : int, raised_match_errors : int,
 | 
| 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 107 | satisfied_assms : int list, positive_concl_tests : int } | 
| 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 108 | |
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 109 | (* Quickcheck Result *) | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 110 | |
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 111 | datatype result = Result of | 
| 45727 
5e46c225370e
extending quickcheck's result by the genuine flag
 bulwahn parents: 
45682diff
changeset | 112 |   { counterexample : (bool * (string * term) list) option, evaluation_terms : (term * term) list option,
 | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 113 | timings : (string * int) list, reports : (int * report) list} | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 114 | |
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 115 | val empty_result = | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 116 |   Result {counterexample = NONE, evaluation_terms = NONE, timings = [], reports = []}
 | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 117 | |
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 118 | fun counterexample_of (Result r) = #counterexample r | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 119 | |
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 120 | fun found_counterexample (Result r) = is_some (#counterexample r) | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 121 | |
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 122 | fun response_of (Result r) = case (#counterexample r, #evaluation_terms r) of | 
| 45730 
6bd0acefaedb
outputing if counterexample is potentially spurious or not
 bulwahn parents: 
45727diff
changeset | 123 | (SOME ts, SOME evals) => SOME (ts, evals) | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 124 | | (NONE, NONE) => NONE | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 125 | |
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 126 | fun timings_of (Result r) = #timings r | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 127 | |
| 45727 
5e46c225370e
extending quickcheck's result by the genuine flag
 bulwahn parents: 
45682diff
changeset | 128 | fun set_response names eval_terms (SOME (genuine, ts)) (Result r) = | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 129 | let | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 130 | val (ts1, ts2) = chop (length names) ts | 
| 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: 
43915diff
changeset | 131 | val (eval_terms', _) = chop (length ts2) eval_terms | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 132 | in | 
| 45727 
5e46c225370e
extending quickcheck's result by the genuine flag
 bulwahn parents: 
45682diff
changeset | 133 |     Result {counterexample = SOME (genuine, (names ~~ ts1)),
 | 
| 
5e46c225370e
extending quickcheck's result by the genuine flag
 bulwahn parents: 
45682diff
changeset | 134 | evaluation_terms = SOME (eval_terms' ~~ ts2), | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 135 | timings = #timings r, reports = #reports r} | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 136 | end | 
| 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: 
43915diff
changeset | 137 | | set_response _ _ NONE result = result | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 138 | |
| 43585 | 139 | |
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 140 | fun cons_timing timing (Result r) = | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 141 |   Result {counterexample = #counterexample r, evaluation_terms = #evaluation_terms r,
 | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 142 | timings = cons timing (#timings r), reports = #reports r} | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 143 | |
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 144 | fun cons_report size (SOME report) (Result r) = | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 145 |   Result {counterexample = #counterexample r, evaluation_terms = #evaluation_terms r,
 | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 146 | timings = #timings r, reports = cons (size, report) (#reports r)} | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 147 | | cons_report _ NONE result = result | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 148 | |
| 42198 
ded5ba6b7bac
use Unsynchronized.change convenience, which also emphasizes the raw access to these references (which happen to be local here);
 wenzelm parents: 
42194diff
changeset | 149 | fun add_timing timing result_ref = | 
| 
ded5ba6b7bac
use Unsynchronized.change convenience, which also emphasizes the raw access to these references (which happen to be local here);
 wenzelm parents: 
42194diff
changeset | 150 | Unsynchronized.change result_ref (cons_timing timing) | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 151 | |
| 42198 
ded5ba6b7bac
use Unsynchronized.change convenience, which also emphasizes the raw access to these references (which happen to be local here);
 wenzelm parents: 
42194diff
changeset | 152 | fun add_report size report result_ref = | 
| 
ded5ba6b7bac
use Unsynchronized.change convenience, which also emphasizes the raw access to these references (which happen to be local here);
 wenzelm parents: 
42194diff
changeset | 153 | Unsynchronized.change result_ref (cons_report size report) | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 154 | |
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 155 | fun add_response names eval_terms response result_ref = | 
| 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: 
43915diff
changeset | 156 | Unsynchronized.change result_ref (set_response names eval_terms response) | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 157 | |
| 37929 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 158 | (* expectation *) | 
| 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 159 | |
| 41517 | 160 | datatype expectation = No_Expectation | No_Counterexample | Counterexample; | 
| 37929 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 161 | |
| 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 162 | fun merge_expectation (expect1, expect2) = | 
| 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 163 | if expect1 = expect2 then expect1 else No_Expectation | 
| 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 164 | |
| 28315 | 165 | (* quickcheck configuration -- default parameters, test generators *) | 
| 43882 
05d5696f177f
renaming quickcheck_tester to quickcheck_batch_tester; tuned
 bulwahn parents: 
43881diff
changeset | 166 | val batch_tester = Attrib.setup_config_string @{binding quickcheck_batch_tester} (K "")
 | 
| 42616 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42433diff
changeset | 167 | val size = Attrib.setup_config_int @{binding quickcheck_size} (K 10)
 | 
| 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42433diff
changeset | 168 | val iterations = Attrib.setup_config_int @{binding quickcheck_iterations} (K 100)
 | 
| 45213 | 169 | val depth = Attrib.setup_config_int @{binding quickcheck_depth} (K 10)
 | 
| 170 | ||
| 42616 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42433diff
changeset | 171 | val no_assms = Attrib.setup_config_bool @{binding quickcheck_no_assms} (K false)
 | 
| 47348 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 172 | val locale = Attrib.setup_config_string @{binding quickcheck_locale} (K "interpret expand")
 | 
| 42616 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42433diff
changeset | 173 | val report = Attrib.setup_config_bool @{binding quickcheck_report} (K true)
 | 
| 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42433diff
changeset | 174 | val timing = Attrib.setup_config_bool @{binding quickcheck_timing} (K false)
 | 
| 46565 | 175 | val timeout = Attrib.setup_config_real @{binding quickcheck_timeout} (K 30.0)
 | 
| 176 | ||
| 45757 
e32dd098f57a
renaming potential flag to genuine_only flag with an inverse semantics
 bulwahn parents: 
45755diff
changeset | 177 | val genuine_only = Attrib.setup_config_bool @{binding quickcheck_genuine_only} (K false)
 | 
| 46477 
db693eb03a3f
adding abort_potential configuration in Quickcheck
 bulwahn parents: 
46343diff
changeset | 178 | val abort_potential = Attrib.setup_config_bool @{binding quickcheck_abort_potential} (K false)
 | 
| 46565 | 179 | |
| 42616 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42433diff
changeset | 180 | val quiet = Attrib.setup_config_bool @{binding quickcheck_quiet} (K false)
 | 
| 45764 | 181 | val verbose = Attrib.setup_config_bool @{binding quickcheck_verbose} (K false)
 | 
| 46863 | 182 | val tag = Attrib.setup_config_string @{binding quickcheck_tag} (K "")
 | 
| 46565 | 183 | |
| 184 | val use_subtype = Attrib.setup_config_bool @{binding quickcheck_use_subtype} (K false)
 | |
| 185 | ||
| 45449 
eeffd04cd899
adding option allow_function_inversion to quickcheck options
 bulwahn parents: 
45419diff
changeset | 186 | val allow_function_inversion = | 
| 
eeffd04cd899
adding option allow_function_inversion to quickcheck options
 bulwahn parents: 
45419diff
changeset | 187 |   Attrib.setup_config_bool @{binding quickcheck_allow_function_inversion} (K false)
 | 
| 42616 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42433diff
changeset | 188 | val finite_types = Attrib.setup_config_bool @{binding quickcheck_finite_types} (K true)
 | 
| 
92715b528e78
added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
 wenzelm parents: 
42433diff
changeset | 189 | val finite_type_size = Attrib.setup_config_int @{binding quickcheck_finite_type_size} (K 3)
 | 
| 40646 | 190 | |
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 191 | datatype test_params = Test_Params of | 
| 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 192 |   {default_type: typ list, expect : expectation};
 | 
| 38759 
37a9092de102
simplification/standardization of some theory data;
 wenzelm parents: 
38390diff
changeset | 193 | |
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 194 | fun dest_test_params (Test_Params {default_type, expect}) = (default_type, expect);
 | 
| 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 195 | |
| 41517 | 196 | fun make_test_params (default_type, expect) = | 
| 197 |   Test_Params {default_type = default_type, expect = expect};
 | |
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 198 | |
| 41517 | 199 | fun map_test_params' f (Test_Params {default_type, expect}) =
 | 
| 200 | make_test_params (f (default_type, expect)); | |
| 38759 
37a9092de102
simplification/standardization of some theory data;
 wenzelm parents: 
38390diff
changeset | 201 | |
| 
37a9092de102
simplification/standardization of some theory data;
 wenzelm parents: 
38390diff
changeset | 202 | fun merge_test_params | 
| 41472 
f6ab14e61604
misc tuning and comments based on review of Theory_Data, Proof_Data, Generic_Data usage;
 wenzelm parents: 
41086diff
changeset | 203 |   (Test_Params {default_type = default_type1, expect = expect1},
 | 
| 
f6ab14e61604
misc tuning and comments based on review of Theory_Data, Proof_Data, Generic_Data usage;
 wenzelm parents: 
41086diff
changeset | 204 |     Test_Params {default_type = default_type2, expect = expect2}) =
 | 
| 
f6ab14e61604
misc tuning and comments based on review of Theory_Data, Proof_Data, Generic_Data usage;
 wenzelm parents: 
41086diff
changeset | 205 | make_test_params | 
| 
f6ab14e61604
misc tuning and comments based on review of Theory_Data, Proof_Data, Generic_Data usage;
 wenzelm parents: 
41086diff
changeset | 206 | (merge (op =) (default_type1, default_type2), merge_expectation (expect1, expect2)); | 
| 28309 | 207 | |
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 208 | type tester = | 
| 45419 
10ba32c347b0
quickcheck fails with code generator errors only if one tester is invoked
 bulwahn parents: 
45418diff
changeset | 209 | Proof.context -> bool -> (string * typ) list -> (term * term list) list -> result list | 
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 210 | |
| 39252 
8f176e575a49
changing the container for the quickcheck options to a generic data
 bulwahn parents: 
39138diff
changeset | 211 | structure Data = Generic_Data | 
| 33522 | 212 | ( | 
| 38759 
37a9092de102
simplification/standardization of some theory data;
 wenzelm parents: 
38390diff
changeset | 213 | type T = | 
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 214 | ((string * (bool Config.T * tester)) list | 
| 42194 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 215 | * ((string * (Proof.context -> term list -> (int -> term list option) list)) list | 
| 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 216 | * ((string * (Proof.context -> term list -> (int -> bool) list)) list))) | 
| 38759 
37a9092de102
simplification/standardization of some theory data;
 wenzelm parents: 
38390diff
changeset | 217 | * test_params; | 
| 43877 | 218 |   val empty = (([], ([], [])), Test_Params {default_type = [], expect = No_Expectation});
 | 
| 28256 | 219 | val extend = I; | 
| 43877 | 220 | fun merge (((testers1, (batch_generators1, batch_validators1)), params1), | 
| 221 | ((testers2, (batch_generators2, batch_validators2)), params2)) : T = | |
| 222 | ((AList.merge (op =) (K true) (testers1, testers2), | |
| 43112 
3117573292b8
adding registration of testers in Quickcheck for its use in Quickcheck_Narrowing
 bulwahn parents: 
43029diff
changeset | 223 | (AList.merge (op =) (K true) (batch_generators1, batch_generators2), | 
| 
3117573292b8
adding registration of testers in Quickcheck for its use in Quickcheck_Narrowing
 bulwahn parents: 
43029diff
changeset | 224 | AList.merge (op =) (K true) (batch_validators1, batch_validators2))), | 
| 28309 | 225 | merge_test_params (params1, params2)); | 
| 33522 | 226 | ); | 
| 28256 | 227 | |
| 39252 
8f176e575a49
changing the container for the quickcheck options to a generic data
 bulwahn parents: 
39138diff
changeset | 228 | val test_params_of = snd o Data.get o Context.Proof; | 
| 37910 
555287ba8d8d
reordering quickcheck signature; exporting test_params and inspection function
 bulwahn parents: 
37909diff
changeset | 229 | |
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 230 | val default_type = fst o dest_test_params o test_params_of | 
| 40246 
c03fc7d3fa97
changed global fixed timeout to a configurable timeout for quickcheck; test parameters in quickcheck are now fully passed around with the context
 bulwahn parents: 
40225diff
changeset | 231 | |
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 232 | val expect = snd o dest_test_params o test_params_of | 
| 40246 
c03fc7d3fa97
changed global fixed timeout to a configurable timeout for quickcheck; test parameters in quickcheck are now fully passed around with the context
 bulwahn parents: 
40225diff
changeset | 233 | |
| 
c03fc7d3fa97
changed global fixed timeout to a configurable timeout for quickcheck; test parameters in quickcheck are now fully passed around with the context
 bulwahn parents: 
40225diff
changeset | 234 | val map_test_params = Data.map o apsnd o map_test_params' | 
| 39253 
0c47d615a69b
removing report from the arguments of the quickcheck functions and refering to it by picking it from the context
 bulwahn parents: 
39252diff
changeset | 235 | |
| 43877 | 236 | val add_tester = Data.map o apfst o apfst o AList.update (op =); | 
| 41862 
a38536bf2736
adding function Quickcheck.test_terms to provide checking a batch of terms
 bulwahn parents: 
41754diff
changeset | 237 | |
| 42194 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 238 | val add_batch_generator = Data.map o apfst o apsnd o apfst o AList.update (op =); | 
| 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 239 | |
| 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 240 | val add_batch_validator = Data.map o apfst o apsnd o apsnd o AList.update (op =); | 
| 28309 | 241 | |
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 242 | fun active_testers ctxt = | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 243 | let | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 244 | val testers = (map snd o fst o fst o Data.get o Context.Proof) ctxt | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 245 | in | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 246 | map snd (filter (fn (active, _) => Config.get ctxt active) testers) | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 247 | end | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 248 | |
| 43884 
59ba3dbd1400
quickcheck does not deactivate testers if none are given
 bulwahn parents: 
43883diff
changeset | 249 | fun set_active_testers [] gen_ctxt = gen_ctxt | 
| 
59ba3dbd1400
quickcheck does not deactivate testers if none are given
 bulwahn parents: 
43883diff
changeset | 250 | | set_active_testers testers gen_ctxt = | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 251 | let | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 252 | val registered_testers = (fst o fst o Data.get) gen_ctxt | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 253 | in | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 254 | fold (fn (name, (config, _)) => Config.put_generic config (member (op =) testers name)) | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 255 | registered_testers gen_ctxt | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 256 | end | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 257 | |
| 28315 | 258 | (* generating tests *) | 
| 259 | ||
| 41862 
a38536bf2736
adding function Quickcheck.test_terms to provide checking a batch of terms
 bulwahn parents: 
41754diff
changeset | 260 | fun gen_mk_tester lookup ctxt v = | 
| 28309 | 261 | let | 
| 43882 
05d5696f177f
renaming quickcheck_tester to quickcheck_batch_tester; tuned
 bulwahn parents: 
43881diff
changeset | 262 | val name = Config.get ctxt batch_tester | 
| 41862 
a38536bf2736
adding function Quickcheck.test_terms to provide checking a batch of terms
 bulwahn parents: 
41754diff
changeset | 263 | val tester = case lookup ctxt name | 
| 43882 
05d5696f177f
renaming quickcheck_tester to quickcheck_batch_tester; tuned
 bulwahn parents: 
43881diff
changeset | 264 |       of NONE => error ("No such quickcheck batch-tester: " ^ name)
 | 
| 40909 
e006d1e06920
renamed parameter from generator to tester; quickcheck only applies one tester on invocation
 bulwahn parents: 
40908diff
changeset | 265 | | SOME tester => tester ctxt; | 
| 40235 
87998864284e
use Exn.interruptible_capture to keep user-code interruptible (Exn.capture not immediately followed by Exn.release here);
 wenzelm parents: 
40225diff
changeset | 266 | in | 
| 40909 
e006d1e06920
renamed parameter from generator to tester; quickcheck only applies one tester on invocation
 bulwahn parents: 
40908diff
changeset | 267 | if Config.get ctxt quiet then | 
| 41862 
a38536bf2736
adding function Quickcheck.test_terms to provide checking a batch of terms
 bulwahn parents: 
41754diff
changeset | 268 | try tester v | 
| 40909 
e006d1e06920
renamed parameter from generator to tester; quickcheck only applies one tester on invocation
 bulwahn parents: 
40908diff
changeset | 269 | else | 
| 43761 
e72ba84ae58f
tuned signature -- corresponding to Scala version;
 wenzelm parents: 
43585diff
changeset | 270 | let (* FIXME !?!? *) | 
| 41862 
a38536bf2736
adding function Quickcheck.test_terms to provide checking a batch of terms
 bulwahn parents: 
41754diff
changeset | 271 | val tester = Exn.interruptible_capture tester v | 
| 43761 
e72ba84ae58f
tuned signature -- corresponding to Scala version;
 wenzelm parents: 
43585diff
changeset | 272 | in case Exn.get_res tester of | 
| 40909 
e006d1e06920
renamed parameter from generator to tester; quickcheck only applies one tester on invocation
 bulwahn parents: 
40908diff
changeset | 273 | NONE => SOME (Exn.release tester) | 
| 
e006d1e06920
renamed parameter from generator to tester; quickcheck only applies one tester on invocation
 bulwahn parents: 
40908diff
changeset | 274 | | SOME tester => SOME tester | 
| 
e006d1e06920
renamed parameter from generator to tester; quickcheck only applies one tester on invocation
 bulwahn parents: 
40908diff
changeset | 275 | end | 
| 
e006d1e06920
renamed parameter from generator to tester; quickcheck only applies one tester on invocation
 bulwahn parents: 
40908diff
changeset | 276 | end | 
| 43882 
05d5696f177f
renaming quickcheck_tester to quickcheck_batch_tester; tuned
 bulwahn parents: 
43881diff
changeset | 277 | |
| 42194 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 278 | val mk_batch_tester = | 
| 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 279 | gen_mk_tester (fn ctxt => AList.lookup (op =) ((fst o snd o fst o Data.get o Context.Proof) ctxt)) | 
| 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 280 | val mk_batch_validator = | 
| 
bd416284a432
adding general interface for batch validators in quickcheck
 bulwahn parents: 
42188diff
changeset | 281 | gen_mk_tester (fn ctxt => AList.lookup (op =) ((snd o snd o fst o Data.get o Context.Proof) ctxt)) | 
| 43112 
3117573292b8
adding registration of testers in Quickcheck for its use in Quickcheck_Narrowing
 bulwahn parents: 
43029diff
changeset | 282 | |
| 28315 | 283 | (* testing propositions *) | 
| 284 | ||
| 43876 | 285 | type compile_generator = | 
| 286 | Proof.context -> (term * term list) list -> int list -> term list option * report option | |
| 287 | ||
| 43585 | 288 | fun limit timeout (limit_time, is_interactive) f exc () = | 
| 41754 
aa94a003dcdf
quickcheck can be invoked with its internal timelimit or without
 bulwahn parents: 
41753diff
changeset | 289 | if limit_time then | 
| 43585 | 290 | TimeLimit.timeLimit timeout f () | 
| 41754 
aa94a003dcdf
quickcheck can be invoked with its internal timelimit or without
 bulwahn parents: 
41753diff
changeset | 291 | handle TimeLimit.TimeOut => | 
| 
aa94a003dcdf
quickcheck can be invoked with its internal timelimit or without
 bulwahn parents: 
41753diff
changeset | 292 | if is_interactive then exc () else raise TimeLimit.TimeOut | 
| 
aa94a003dcdf
quickcheck can be invoked with its internal timelimit or without
 bulwahn parents: 
41753diff
changeset | 293 | else | 
| 
aa94a003dcdf
quickcheck can be invoked with its internal timelimit or without
 bulwahn parents: 
41753diff
changeset | 294 | f () | 
| 41753 
dbd00d8a4784
quickcheck invokes TimeLimit.timeLimit only in one separate function
 bulwahn parents: 
41735diff
changeset | 295 | |
| 43915 | 296 | fun message ctxt s = if Config.get ctxt quiet then () else Output.urgent_message s | 
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45764diff
changeset | 297 | |
| 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45764diff
changeset | 298 | fun verbose_message ctxt s = if not (Config.get ctxt quiet) andalso Config.get ctxt verbose | 
| 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45764diff
changeset | 299 | then Output.urgent_message s else () | 
| 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45764diff
changeset | 300 | |
| 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: 
43915diff
changeset | 301 | fun test_terms ctxt (limit_time, is_interactive) insts goals = | 
| 43878 
eeb10fdd9535
changed every tester to have a configuration in quickcheck; enabling parallel testing of different testers in quickcheck
 bulwahn parents: 
43877diff
changeset | 302 | case active_testers ctxt of | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 303 | [] => error "No active testers for quickcheck" | 
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45764diff
changeset | 304 | | testers => | 
| 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45764diff
changeset | 305 | limit (seconds (Config.get ctxt timeout)) (limit_time, is_interactive) | 
| 43915 | 306 | (fn () => Par_List.get_some (fn tester => | 
| 45419 
10ba32c347b0
quickcheck fails with code generator errors only if one tester is invoked
 bulwahn parents: 
45418diff
changeset | 307 | tester ctxt (length testers > 1) insts goals |> | 
| 43915 | 308 | (fn result => if exists found_counterexample result then SOME result else NONE)) testers) | 
| 309 | (fn () => (message ctxt "Quickcheck ran out of time"; NONE)) (); | |
| 46759 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 310 | |
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 311 | fun all_axioms_of ctxt t = | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 312 | let | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 313 | val intros = Locale.get_intros ctxt | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 314 | val unfolds = Locale.get_unfolds ctxt | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 315 | fun retrieve_prems thms t = | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 316 | case filter (fn th => Term.could_unify (Thm.concl_of th, t)) thms of | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 317 | [] => NONE | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 318 | | [th] => | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 319 | let | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 320 | val (tyenv, tenv) = | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 321 | Pattern.match (Proof_Context.theory_of ctxt) (Thm.concl_of th, t) (Vartab.empty, Vartab.empty) | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 322 | in SOME (map (Envir.subst_term (tyenv, tenv)) (Thm.prems_of th)) end | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 323 | fun all t = | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 324 | case retrieve_prems intros t of | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 325 | NONE => retrieve_prems unfolds t | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 326 | | SOME ts => SOME (maps (fn t => the_default [t] (all t)) ts) | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 327 | in | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 328 | all t | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 329 | end | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 330 | |
| 47348 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 331 | fun locale_config_of s = | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 332 | let | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 333 | val cs = space_explode " " s | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 334 | in | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 335 | if forall (fn c => c = "expand" orelse c = "interpret") cs then cs | 
| 47383 | 336 |     else (warning ("Invalid quickcheck_locale setting: falling back to the default setting.");
 | 
| 47348 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 337 | ["interpret", "expand"]) | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 338 | end | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 339 | |
| 42026 
da9b58f1db42
adding option of evaluating terms after invocation in quickcheck
 bulwahn parents: 
42025diff
changeset | 340 | fun test_goal (time_limit, is_interactive) (insts, eval_terms) i state = | 
| 40648 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 341 | let | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 342 | val lthy = Proof.context_of state; | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 343 | val thy = Proof.theory_of state; | 
| 45765 
cb6ddee6a463
making the default behaviour of quickcheck a little bit less verbose;
 bulwahn parents: 
45764diff
changeset | 344 | val _ = message lthy "Quickchecking..." | 
| 40648 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 345 |     fun strip (Const ("all", _) $ Abs (_, _, t)) = strip t
 | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 346 | | strip t = t; | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 347 |     val {goal = st, ...} = Proof.raw_goal state;
 | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 348 | val (gi, frees) = Logic.goal_params (prop_of st) i; | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 349 | val some_locale = case (Option.map #target o Named_Target.peek) lthy | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 350 | of NONE => NONE | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 351 | | SOME "" => NONE | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 352 | | SOME locale => SOME locale; | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 353 | val assms = if Config.get lthy no_assms then [] else case some_locale | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 354 | of NONE => Assumption.all_assms_of lthy | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 355 | | SOME locale => Assumption.local_assms_of lthy (Locale.init locale thy); | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 356 | val proto_goal = Logic.list_implies (map Thm.term_of assms, subst_bounds (frees, strip gi)); | 
| 46759 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 357 | fun axioms_of locale = case fst (Locale.specification_of thy locale) of | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 358 | NONE => [] | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 359 | | SOME t => the_default [] (all_axioms_of lthy t) | 
| 47348 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 360 | val config = locale_config_of (Config.get lthy locale) | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 361 | val goals = case some_locale | 
| 42026 
da9b58f1db42
adding option of evaluating terms after invocation in quickcheck
 bulwahn parents: 
42025diff
changeset | 362 | of NONE => [(proto_goal, eval_terms)] | 
| 47348 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 363 | | SOME locale => fold (fn c => | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 364 | if c = "expand" then cons (Logic.list_implies (axioms_of locale, proto_goal), eval_terms) else | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 365 | if c = "interpret" then | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 366 | append (map (fn (_, phi) => (Morphism.term phi proto_goal, map (Morphism.term phi) eval_terms)) | 
| 
9a82999ebbd6
added option quickcheck_locale to allow different behaviours for handling locales in Quickcheck;
 bulwahn parents: 
46961diff
changeset | 367 | (Locale.registrations_of (Context.Theory thy) (*FIXME*) locale)) else I) config []; | 
| 46759 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 368 | val _ = verbose_message lthy (Pretty.string_of | 
| 
a6ea1c68fa52
collecting all axioms in a locale context in quickcheck;
 bulwahn parents: 
46565diff
changeset | 369 |       (Pretty.big_list ("Checking goals: ") (map (Syntax.pretty_term lthy o fst) goals)))
 | 
| 40648 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 370 | in | 
| 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: 
43915diff
changeset | 371 | test_terms lthy (time_limit, is_interactive) insts goals | 
| 40648 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 372 | end | 
| 
1598ec648b0d
splitting test_goal function in two functions; exporting new configurations in quickcheck; iterations depend on generator_name in quickcheck
 bulwahn parents: 
40647diff
changeset | 373 | |
| 37912 | 374 | (* pretty printing *) | 
| 28315 | 375 | |
| 40225 | 376 | fun tool_name auto = (if auto then "Auto " else "") ^ "Quickcheck" | 
| 377 | ||
| 46863 | 378 | fun pretty_counterex ctxt auto NONE = | 
| 379 | Pretty.str (tool_name auto ^ " found no counterexample." ^ Config.get ctxt tag) | |
| 45730 
6bd0acefaedb
outputing if counterexample is potentially spurious or not
 bulwahn parents: 
45727diff
changeset | 380 | | pretty_counterex ctxt auto (SOME ((genuine, cex), eval_terms)) = | 
| 
6bd0acefaedb
outputing if counterexample is potentially spurious or not
 bulwahn parents: 
45727diff
changeset | 381 | Pretty.chunks ((Pretty.str (tool_name auto ^ " found a " ^ | 
| 46863 | 382 | (if genuine then "counterexample:" | 
| 383 | else "potentially spurious counterexample due to underspecified functions:") | |
| 384 | ^ Config.get ctxt tag ^ "\n") :: | |
| 28315 | 385 | map (fn (s, t) => | 
| 42028 
bd6515e113b2
passing a term with free variables to the quickcheck tester functions instead of an lambda expression because this is more natural with passing further evaluation terms; added output of evaluation terms; added evaluation of terms in the exhaustive testing
 bulwahn parents: 
42026diff
changeset | 386 | Pretty.block [Pretty.str (s ^ " ="), Pretty.brk 1, Syntax.pretty_term ctxt t]) (rev cex)) | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 387 | @ (if null eval_terms then [] | 
| 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: 
43915diff
changeset | 388 |            else (Pretty.fbrk :: Pretty.str ("Evaluated terms:") ::
 | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 389 | map (fn (t, u) => | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 390 | Pretty.block [Syntax.pretty_term ctxt t, Pretty.str " =", Pretty.brk 1, | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 391 | Syntax.pretty_term ctxt u]) (rev eval_terms)))); | 
| 28315 | 392 | |
| 30980 | 393 | (* Isar commands *) | 
| 28315 | 394 | |
| 28336 | 395 | fun read_nat s = case (Library.read_int o Symbol.explode) s | 
| 396 | of (k, []) => if k >= 0 then k | |
| 397 |       else error ("Not a natural number: " ^ s)
 | |
| 398 |   | (_, _ :: _) => error ("Not a natural number: " ^ s);
 | |
| 37909 
583543ad6ad1
changed default types to a list of types; extended quickcheck parameters to be a list of values to parse a list of default types
 bulwahn parents: 
36960diff
changeset | 399 | |
| 34128 
8650a073dd9b
made Quickcheck take structured proof assumptions into account (like Refute and Nitpick) by default;
 blanchet parents: 
33583diff
changeset | 400 | fun read_bool "false" = false | 
| 
8650a073dd9b
made Quickcheck take structured proof assumptions into account (like Refute and Nitpick) by default;
 blanchet parents: 
33583diff
changeset | 401 | | read_bool "true" = true | 
| 
8650a073dd9b
made Quickcheck take structured proof assumptions into account (like Refute and Nitpick) by default;
 blanchet parents: 
33583diff
changeset | 402 |   | read_bool s = error ("Not a Boolean value: " ^ s)
 | 
| 28315 | 403 | |
| 40366 
a2866dbfbe6b
changing timeout to real value; handling Interrupt and Timeout more like nitpick does
 bulwahn parents: 
40253diff
changeset | 404 | fun read_real s = | 
| 
a2866dbfbe6b
changing timeout to real value; handling Interrupt and Timeout more like nitpick does
 bulwahn parents: 
40253diff
changeset | 405 | case (Real.fromString s) of | 
| 
a2866dbfbe6b
changing timeout to real value; handling Interrupt and Timeout more like nitpick does
 bulwahn parents: 
40253diff
changeset | 406 | SOME s => s | 
| 
a2866dbfbe6b
changing timeout to real value; handling Interrupt and Timeout more like nitpick does
 bulwahn parents: 
40253diff
changeset | 407 |   | NONE => error ("Not a real number: " ^ s)
 | 
| 
a2866dbfbe6b
changing timeout to real value; handling Interrupt and Timeout more like nitpick does
 bulwahn parents: 
40253diff
changeset | 408 | |
| 37929 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 409 | fun read_expectation "no_expectation" = No_Expectation | 
| 41517 | 410 | | read_expectation "no_counterexample" = No_Counterexample | 
| 37929 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 411 | | read_expectation "counterexample" = Counterexample | 
| 41517 | 412 |   | read_expectation s = error ("Not an expectation value: " ^ s)
 | 
| 37929 
22e0797857e6
adding checking of expected result for the tool quickcheck; annotated a few quickcheck examples
 bulwahn parents: 
37913diff
changeset | 413 | |
| 43877 | 414 | fun valid_tester_name genctxt name = AList.defined (op =) (fst (fst (Data.get genctxt))) name | 
| 415 | ||
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 416 | fun parse_tester name (testers, genctxt) = | 
| 40912 
1108529100ce
checking if parameter is name of a tester which allows e.g. quickcheck[random]
 bulwahn parents: 
40911diff
changeset | 417 | if valid_tester_name genctxt name then | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 418 | (insert (op =) name testers, genctxt) | 
| 40912 
1108529100ce
checking if parameter is name of a tester which allows e.g. quickcheck[random]
 bulwahn parents: 
40911diff
changeset | 419 | else | 
| 
1108529100ce
checking if parameter is name of a tester which allows e.g. quickcheck[random]
 bulwahn parents: 
40911diff
changeset | 420 |     error ("Unknown tester: " ^ name)
 | 
| 
1108529100ce
checking if parameter is name of a tester which allows e.g. quickcheck[random]
 bulwahn parents: 
40911diff
changeset | 421 | |
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 422 | fun parse_test_param ("tester", args) = fold parse_tester args
 | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 423 |   | parse_test_param ("size", [arg]) = apsnd (Config.put_generic size (read_nat arg))
 | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 424 |   | parse_test_param ("iterations", [arg]) = apsnd (Config.put_generic iterations (read_nat arg))
 | 
| 45213 | 425 |   | parse_test_param ("depth", [arg]) = apsnd (Config.put_generic depth (read_nat arg))  
 | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 426 |   | parse_test_param ("default_type", arg) = (fn (testers, gen_ctxt) =>
 | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 427 | (testers, map_test_params | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 428 | ((apfst o K) (map (Proof_Context.read_typ (Context.proof_of gen_ctxt)) arg)) gen_ctxt)) | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 429 |   | parse_test_param ("no_assms", [arg]) = apsnd (Config.put_generic no_assms (read_bool arg))
 | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 430 |   | parse_test_param ("expect", [arg]) = apsnd (map_test_params ((apsnd o K) (read_expectation arg)))
 | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 431 |   | parse_test_param ("report", [arg]) = apsnd (Config.put_generic report (read_bool arg))
 | 
| 45757 
e32dd098f57a
renaming potential flag to genuine_only flag with an inverse semantics
 bulwahn parents: 
45755diff
changeset | 432 |   | parse_test_param ("genuine_only", [arg]) = apsnd (Config.put_generic genuine_only (read_bool arg))
 | 
| 46477 
db693eb03a3f
adding abort_potential configuration in Quickcheck
 bulwahn parents: 
46343diff
changeset | 433 |   | parse_test_param ("abort_potential", [arg]) = apsnd (Config.put_generic abort_potential (read_bool arg))
 | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 434 |   | parse_test_param ("quiet", [arg]) = apsnd (Config.put_generic quiet (read_bool arg))
 | 
| 45764 | 435 |   | parse_test_param ("verbose", [arg]) = apsnd (Config.put_generic verbose (read_bool arg))
 | 
| 46863 | 436 |   | parse_test_param ("tag", [arg]) = apsnd (Config.put_generic tag arg)
 | 
| 46565 | 437 |   | parse_test_param ("use_subtype", [arg]) = apsnd (Config.put_generic use_subtype (read_bool arg))  
 | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 438 |   | parse_test_param ("timeout", [arg]) = apsnd (Config.put_generic timeout (read_real arg))
 | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 439 |   | parse_test_param ("finite_types", [arg]) = apsnd (Config.put_generic finite_types (read_bool arg))
 | 
| 45449 
eeffd04cd899
adding option allow_function_inversion to quickcheck options
 bulwahn parents: 
45419diff
changeset | 440 |   | parse_test_param ("allow_function_inversion", [arg]) =
 | 
| 
eeffd04cd899
adding option allow_function_inversion to quickcheck options
 bulwahn parents: 
45419diff
changeset | 441 | apsnd (Config.put_generic allow_function_inversion (read_bool arg)) | 
| 41517 | 442 |   | parse_test_param ("finite_type_size", [arg]) =
 | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 443 | apsnd (Config.put_generic finite_type_size (read_nat arg)) | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 444 | | parse_test_param (name, _) = (fn (testers, genctxt) => | 
| 40912 
1108529100ce
checking if parameter is name of a tester which allows e.g. quickcheck[random]
 bulwahn parents: 
40911diff
changeset | 445 | if valid_tester_name genctxt name then | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 446 | (insert (op =) name testers, genctxt) | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 447 |     else error ("Unknown tester or test parameter: " ^ name));
 | 
| 28315 | 448 | |
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 449 | fun proof_map_result f = apsnd Context.the_proof o f o Context.Proof; | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 450 | |
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 451 | fun parse_test_param_inst (name, arg) ((insts, eval_terms), (testers, ctxt)) = | 
| 42361 | 452 | case try (Proof_Context.read_typ ctxt) name | 
| 42025 | 453 | of SOME (TFree (v, _)) => | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 454 | ((AList.update (op =) (v, Proof_Context.read_typ ctxt (the_single arg)) insts, eval_terms), | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 455 | (testers, ctxt)) | 
| 42025 | 456 | | NONE => (case name of | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 457 | "eval" => ((insts, eval_terms @ map (Syntax.read_term ctxt) arg), (testers, ctxt)) | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 458 | | _ => ((insts, eval_terms), | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 459 | proof_map_result (fn gen_ctxt => parse_test_param (name, arg) (testers, gen_ctxt)) ctxt)); | 
| 28309 | 460 | |
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 461 | fun quickcheck_params_cmd args = Context.theory_map | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 462 | (fn gen_ctxt => uncurry set_active_testers (fold parse_test_param args ([], gen_ctxt))); | 
| 41517 | 463 | |
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 464 | fun check_expectation state results = | 
| 43879 
c8308a8faf9f
enabling parallel execution of testers but removing more informative quickcheck output
 bulwahn parents: 
43878diff
changeset | 465 | (if is_some results andalso expect (Proof.context_of state) = No_Counterexample | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 466 | then | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 467 |     error ("quickcheck expected to find no counterexample but found one")
 | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 468 | else | 
| 43879 
c8308a8faf9f
enabling parallel execution of testers but removing more informative quickcheck output
 bulwahn parents: 
43878diff
changeset | 469 | (if is_none results andalso expect (Proof.context_of state) = Counterexample | 
| 42088 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 470 | then | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 471 |       error ("quickcheck expected to find a counterexample but did not find one")
 | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 472 | else ())) | 
| 
8d00484551fe
making quickcheck's result value more formal; allowing more result information to be returned after timeout; adding output of timing information in quickcheck
 bulwahn parents: 
42087diff
changeset | 473 | |
| 35378 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 474 | fun gen_quickcheck args i state = | 
| 40644 
0850a2a16dce
changed old-style quickcheck configurations to new Config.T configurations
 bulwahn parents: 
40643diff
changeset | 475 | state | 
| 43881 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 476 | |> Proof.map_context_result (fn ctxt => | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 477 | apsnd (fn (testers, ctxt) => Context.proof_map (set_active_testers testers) ctxt) | 
| 
cabe74eab19a
changing parser in quickcheck to activate and deactivate the testers
 bulwahn parents: 
43879diff
changeset | 478 | (fold parse_test_param_inst args (([], []), ([], ctxt)))) | 
| 42026 
da9b58f1db42
adding option of evaluating terms after invocation in quickcheck
 bulwahn parents: 
42025diff
changeset | 479 | |> (fn ((insts, eval_terms), state') => test_goal (true, true) (insts, eval_terms) i state' | 
| 46863 | 480 | |> tap (check_expectation state') |> rpair state') | 
| 32297 | 481 | |
| 43879 
c8308a8faf9f
enabling parallel execution of testers but removing more informative quickcheck output
 bulwahn parents: 
43878diff
changeset | 482 | fun quickcheck args i state = | 
| 46863 | 483 | Option.map (the o get_first counterexample_of) (fst (gen_quickcheck args i state)) | 
| 35378 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 484 | |
| 32297 | 485 | fun quickcheck_cmd args i state = | 
| 35378 
95d0e3adf38e
added basic reporting of test cases to quickcheck
 bulwahn parents: 
35324diff
changeset | 486 | gen_quickcheck args i (Toplevel.proof_of state) | 
| 46863 | 487 | |> apfst (Option.map (the o get_first response_of)) | 
| 488 | |> (fn (r, state) => Output.urgent_message (Pretty.string_of | |
| 489 | (pretty_counterex (Proof.context_of state) false r))); | |
| 28309 | 490 | |
| 41517 | 491 | val parse_arg = | 
| 492 | Parse.name -- | |
| 46949 | 493 |     (Scan.optional (@{keyword "="} |--
 | 
| 41517 | 494 | (((Parse.name || Parse.float_number) >> single) || | 
| 46949 | 495 |         (@{keyword "["} |-- Parse.list1 Parse.name --| @{keyword "]"}))) ["true"]);
 | 
| 28309 | 496 | |
| 41517 | 497 | val parse_args = | 
| 46949 | 498 |   @{keyword "["} |-- Parse.list1 parse_arg --| @{keyword "]"} || Scan.succeed [];
 | 
| 28336 | 499 | |
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 500 | val _ = | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 501 |   Outer_Syntax.command @{command_spec "quickcheck_params"} "set parameters for random testing"
 | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 502 | (parse_args >> (fn args => Toplevel.theory (quickcheck_params_cmd args))); | 
| 28309 | 503 | |
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 504 | val _ = | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 505 |   Outer_Syntax.improper_command @{command_spec "quickcheck"}
 | 
| 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 506 | "try to find counterexample for subgoal" | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 507 | (parse_args -- Scan.optional Parse.nat 1 | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 508 | >> (fn (args, i) => Toplevel.no_timing o Toplevel.keep (quickcheck_cmd args i))); | 
| 28309 | 509 | |
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 510 | (* automatic testing *) | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 511 | |
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 512 | fun try_quickcheck auto state = | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 513 | let | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 514 | val ctxt = Proof.context_of state; | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 515 | val i = 1; | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 516 | val res = | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 517 | state | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 518 | |> Proof.map_context (Config.put report false #> Config.put quiet true) | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 519 | |> try (test_goal (false, false) ([], []) i); | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 520 | in | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 521 | case res of | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 522 | NONE => (unknownN, state) | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 523 | | SOME results => | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 524 | let | 
| 43879 
c8308a8faf9f
enabling parallel execution of testers but removing more informative quickcheck output
 bulwahn parents: 
43878diff
changeset | 525 | val msg = pretty_counterex ctxt auto (Option.map (the o get_first response_of) results) | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 526 | in | 
| 43879 
c8308a8faf9f
enabling parallel execution of testers but removing more informative quickcheck output
 bulwahn parents: 
43878diff
changeset | 527 | if is_some results then | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 528 | (genuineN, | 
| 43029 
3e060b1c844b
use helpers and tweak Quickcheck's priority to it comes second (to give Solve Direct slightly more time before another prover runs)
 blanchet parents: 
43024diff
changeset | 529 | state | 
| 
3e060b1c844b
use helpers and tweak Quickcheck's priority to it comes second (to give Solve Direct slightly more time before another prover runs)
 blanchet parents: 
43024diff
changeset | 530 | |> (if auto then | 
| 
3e060b1c844b
use helpers and tweak Quickcheck's priority to it comes second (to give Solve Direct slightly more time before another prover runs)
 blanchet parents: 
43024diff
changeset | 531 | Proof.goal_message (K (Pretty.chunks [Pretty.str "", | 
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49358diff
changeset | 532 | Pretty.mark Markup.intensify msg])) | 
| 43029 
3e060b1c844b
use helpers and tweak Quickcheck's priority to it comes second (to give Solve Direct slightly more time before another prover runs)
 blanchet parents: 
43024diff
changeset | 533 | else | 
| 
3e060b1c844b
use helpers and tweak Quickcheck's priority to it comes second (to give Solve Direct slightly more time before another prover runs)
 blanchet parents: 
43024diff
changeset | 534 | tap (fn _ => Output.urgent_message (Pretty.string_of msg)))) | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 535 | else | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 536 | (noneN, state) | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 537 | end | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 538 | end | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 539 | |> `(fn (outcome_code, _) => outcome_code = genuineN) | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 540 | |
| 43029 
3e060b1c844b
use helpers and tweak Quickcheck's priority to it comes second (to give Solve Direct slightly more time before another prover runs)
 blanchet parents: 
43024diff
changeset | 541 | val setup = Try.register_tool (quickcheckN, (20, auto, try_quickcheck)) | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 542 | |
| 28315 | 543 | end; | 
| 28309 | 544 | |
| 28315 | 545 | val auto_quickcheck = Quickcheck.auto; |