| author | hoelzl | 
| Tue, 04 Dec 2012 18:00:37 +0100 | |
| changeset 50347 | 77e3effa50b6 | 
| parent 49948 | 744934b818c7 | 
| child 51126 | df86080de4cb | 
| permissions | -rw-r--r-- | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 1 | (* Author: Lukas Bulwahn, TU Muenchen *) | 
| 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 2 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 3 | header {* A simple counterexample generator performing exhaustive testing *}
 | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 4 | |
| 41918 | 5 | theory Quickcheck_Exhaustive | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 6 | imports Quickcheck | 
| 46950 
d0181abdbdac
declare command keywords via theory header, including strict checking outside Pure;
 wenzelm parents: 
46417diff
changeset | 7 | keywords "quickcheck_generator" :: thy_decl | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 8 | begin | 
| 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 9 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 10 | subsection {* basic operations for exhaustive generators *}
 | 
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 11 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 12 | definition orelse :: "'a option => 'a option => 'a option" (infixr "orelse" 55) | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 13 | where | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 14 | [code_unfold]: "x orelse y = (case x of Some x' => Some x' | None => y)" | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 15 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 16 | subsection {* exhaustive generator type classes *}
 | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 17 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 18 | class exhaustive = term_of + | 
| 45724 
1f5fc44254d7
the simple exhaustive compilation also indicates if counterexample is potentially spurious;
 bulwahn parents: 
45722diff
changeset | 19 |   fixes exhaustive :: "('a \<Rightarrow> (bool * term list) option) \<Rightarrow> code_numeral \<Rightarrow> (bool * term list) option"
 | 
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 20 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 21 | class full_exhaustive = term_of + | 
| 45722 | 22 |   fixes full_exhaustive :: "('a * (unit => term) \<Rightarrow> (bool * term list) option) \<Rightarrow> code_numeral \<Rightarrow> (bool * term list) option"
 | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 23 | |
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 24 | instantiation code_numeral :: full_exhaustive | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 25 | begin | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 26 | |
| 45722 | 27 | function full_exhaustive_code_numeral' :: "(code_numeral * (unit => term) => (bool * term list) option) => code_numeral => code_numeral => (bool * term list) option" | 
| 42304 | 28 | where "full_exhaustive_code_numeral' f d i = | 
| 29 | (if d < i then None | |
| 30 | else (f (i, %_. Code_Evaluation.term_of i)) orelse (full_exhaustive_code_numeral' f d (i + 1)))" | |
| 31 | by pat_completeness auto | |
| 32 | ||
| 33 | termination | |
| 34 | by (relation "measure (%(_, d, i). Code_Numeral.nat_of (d + 1 - i))") auto | |
| 35 | ||
| 36 | definition "full_exhaustive f d = full_exhaustive_code_numeral' f d 0" | |
| 37 | ||
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 38 | instance .. | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 39 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 40 | end | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 41 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 42 | instantiation code_numeral :: exhaustive | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 43 | begin | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 44 | |
| 45724 
1f5fc44254d7
the simple exhaustive compilation also indicates if counterexample is potentially spurious;
 bulwahn parents: 
45722diff
changeset | 45 | function exhaustive_code_numeral' :: "(code_numeral => (bool * term list) option) => code_numeral => code_numeral => (bool * term list) option" | 
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 46 | where "exhaustive_code_numeral' f d i = | 
| 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 47 | (if d < i then None | 
| 42304 | 48 | else (f i orelse exhaustive_code_numeral' f d (i + 1)))" | 
| 41231 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 49 | by pat_completeness auto | 
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 50 | |
| 42304 | 51 | termination | 
| 41231 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 52 | by (relation "measure (%(_, d, i). Code_Numeral.nat_of (d + 1 - i))") auto | 
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 53 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 54 | definition "exhaustive f d = exhaustive_code_numeral' f d 0" | 
| 41231 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 55 | |
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 56 | instance .. | 
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 57 | |
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 58 | end | 
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 59 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 60 | instantiation nat :: exhaustive | 
| 41231 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 61 | begin | 
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 62 | |
| 42304 | 63 | definition "exhaustive f d = exhaustive (%x. f (Code_Numeral.nat_of x)) d" | 
| 64 | ||
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 65 | instance .. | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 66 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 67 | end | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 68 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 69 | instantiation nat :: full_exhaustive | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 70 | begin | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 71 | |
| 42304 | 72 | definition "full_exhaustive f d = full_exhaustive (%(x, xt). f (Code_Numeral.nat_of x, %_. Code_Evaluation.term_of (Code_Numeral.nat_of x))) d" | 
| 41231 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 73 | |
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 74 | instance .. | 
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 75 | |
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 76 | end | 
| 
2e901158675e
adding exhaustive tester instances for numeric types: code_numeral, nat, rat and real
 bulwahn parents: 
41178diff
changeset | 77 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 78 | instantiation int :: exhaustive | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 79 | begin | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 80 | |
| 45724 
1f5fc44254d7
the simple exhaustive compilation also indicates if counterexample is potentially spurious;
 bulwahn parents: 
45722diff
changeset | 81 | function exhaustive' :: "(int => (bool * term list) option) => int => int => (bool * term list) option" | 
| 42304 | 82 | where "exhaustive' f d i = (if d < i then None else (f i orelse exhaustive' f d (i + 1)))" | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 83 | by pat_completeness auto | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 84 | |
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 85 | termination | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 86 | by (relation "measure (%(_, d, i). nat (d + 1 - i))") auto | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 87 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 88 | definition "exhaustive f d = exhaustive' f (Code_Numeral.int_of d) (- (Code_Numeral.int_of d))" | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 89 | |
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 90 | instance .. | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 91 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 92 | end | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 93 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 94 | instantiation int :: full_exhaustive | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 95 | begin | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 96 | |
| 45722 | 97 | function full_exhaustive' :: "(int * (unit => term) => (bool * term list) option) => int => int => (bool * term list) option" | 
| 42304 | 98 | where "full_exhaustive' f d i = (if d < i then None else (case f (i, %_. Code_Evaluation.term_of i) of Some t => Some t | None => full_exhaustive' f d (i + 1)))" | 
| 99 | by pat_completeness auto | |
| 100 | ||
| 101 | termination | |
| 102 | by (relation "measure (%(_, d, i). nat (d + 1 - i))") auto | |
| 103 | ||
| 104 | definition "full_exhaustive f d = full_exhaustive' f (Code_Numeral.int_of d) (- (Code_Numeral.int_of d))" | |
| 105 | ||
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 106 | instance .. | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 107 | |
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 108 | end | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 109 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 110 | instantiation prod :: (exhaustive, exhaustive) exhaustive | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 111 | begin | 
| 40899 
ef6fde932f4c
improving readability of Smallcheck theory; adding constant orelse to improve performance of the function package
 bulwahn parents: 
40639diff
changeset | 112 | |
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 113 | definition | 
| 42304 | 114 | "exhaustive f d = exhaustive (%x. exhaustive (%y. f ((x, y))) d) d" | 
| 115 | ||
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 116 | instance .. | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 117 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 118 | end | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 119 | |
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 120 | definition (in term_syntax) [code_unfold]: "valtermify_pair x y = Code_Evaluation.valtermify (Pair :: 'a :: typerep => 'b :: typerep => 'a * 'b) {\<cdot>} x {\<cdot>} y"
 | 
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 121 | |
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 122 | instantiation prod :: (full_exhaustive, full_exhaustive) full_exhaustive | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 123 | begin | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 124 | |
| 42304 | 125 | definition | 
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 126 | "full_exhaustive f d = full_exhaustive (%x. full_exhaustive (%y. f (valtermify_pair x y)) d) d" | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 127 | |
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 128 | instance .. | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 129 | |
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 130 | end | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 131 | |
| 46193 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 132 | instantiation set :: (exhaustive) exhaustive | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 133 | begin | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 134 | |
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 135 | fun exhaustive_set | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 136 | where | 
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 137 |   "exhaustive_set f i = (if i = 0 then None else (f {} orelse exhaustive_set (%A. f A orelse exhaustive (%x. if x \<in> A then None else f (insert x A)) (i - 1)) (i - 1)))"
 | 
| 46193 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 138 | |
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 139 | instance .. | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 140 | |
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 141 | end | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 142 | |
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 143 | instantiation set :: (full_exhaustive) full_exhaustive | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 144 | begin | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 145 | |
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 146 | fun full_exhaustive_set | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 147 | where | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 148 | "full_exhaustive_set f i = (if i = 0 then None else (f valterm_emptyset orelse full_exhaustive_set (%A. f A orelse Quickcheck_Exhaustive.full_exhaustive (%x. if fst x \<in> fst A then None else f (valtermify_insert x A)) (i - 1)) (i - 1)))" | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 149 | |
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 150 | instance .. | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 151 | |
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 152 | end | 
| 
55a4769d0abe
adding exhaustive instances for type constructor set
 bulwahn parents: 
45925diff
changeset | 153 | |
| 41916 
80060d5f864a
renaming constants in Quickcheck_Exhaustive theory
 bulwahn parents: 
41915diff
changeset | 154 | instantiation "fun" :: ("{equal, exhaustive}", exhaustive) exhaustive
 | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 155 | begin | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 156 | |
| 45724 
1f5fc44254d7
the simple exhaustive compilation also indicates if counterexample is potentially spurious;
 bulwahn parents: 
45722diff
changeset | 157 | fun exhaustive_fun' :: "(('a => 'b) => (bool * term list) option) => code_numeral => code_numeral => (bool * term list) option"
 | 
| 42304 | 158 | where | 
| 159 | "exhaustive_fun' f i d = (exhaustive (%b. f (%_. b)) d) | |
| 160 | orelse (if i > 1 then | |
| 161 | exhaustive_fun' (%g. exhaustive (%a. exhaustive (%b. | |
| 162 | f (g(a := b))) d) d) (i - 1) d else None)" | |
| 163 | ||
| 45724 
1f5fc44254d7
the simple exhaustive compilation also indicates if counterexample is potentially spurious;
 bulwahn parents: 
45722diff
changeset | 164 | definition exhaustive_fun :: "(('a => 'b) => (bool * term list) option) => code_numeral => (bool * term list) option"
 | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 165 | where | 
| 42304 | 166 | "exhaustive_fun f d = exhaustive_fun' f d d" | 
| 167 | ||
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 168 | instance .. | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 169 | |
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 170 | end | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 171 | |
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 172 | definition [code_unfold]: "valtermify_absdummy = (%(v, t). (%_::'a. v, %u::unit. Code_Evaluation.Abs (STR ''x'') (Typerep.typerep TYPE('a::typerep)) (t ())))"
 | 
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 173 | |
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 174 | definition (in term_syntax) [code_unfold]: "valtermify_fun_upd g a b = Code_Evaluation.valtermify (fun_upd :: ('a :: typerep => 'b :: typerep) => 'a => 'b => 'a => 'b) {\<cdot>} g {\<cdot>} a {\<cdot>} b"
 | 
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 175 | |
| 42310 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 176 | instantiation "fun" :: ("{equal, full_exhaustive}", full_exhaustive) full_exhaustive
 | 
| 
c664cc5cc5e9
splitting exhaustive and full_exhaustive into separate type classes
 bulwahn parents: 
42305diff
changeset | 177 | begin | 
| 42304 | 178 | |
| 45722 | 179 | fun full_exhaustive_fun' :: "(('a => 'b) * (unit => term) => (bool * term list) option) => code_numeral => code_numeral => (bool * term list) option"
 | 
| 42304 | 180 | where | 
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 181 | "full_exhaustive_fun' f i d = (full_exhaustive (%v. f (valtermify_absdummy v)) d) | 
| 42117 
306713ec55c3
changing iteration scheme of functions to use minimal number of function updates for exhaustive testing
 bulwahn parents: 
41920diff
changeset | 182 | orelse (if i > 1 then | 
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 183 | full_exhaustive_fun' (%g. full_exhaustive (%a. full_exhaustive (%b. | 
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 184 | f (valtermify_fun_upd g a b)) d) d) (i - 1) d else None)" | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 185 | |
| 45722 | 186 | definition full_exhaustive_fun :: "(('a => 'b) * (unit => term) => (bool * term list) option) => code_numeral => (bool * term list) option"
 | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 187 | where | 
| 42304 | 188 | "full_exhaustive_fun f d = full_exhaustive_fun' f d d" | 
| 40639 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 189 | |
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 190 | instance .. | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 191 | |
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 192 | end | 
| 
f1f0e6adca0a
adding function generation to SmallCheck; activating exhaustive search space testing
 bulwahn parents: 
40620diff
changeset | 193 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 194 | subsubsection {* A smarter enumeration scheme for functions over finite datatypes *}
 | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 195 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 196 | class check_all = enum + term_of + | 
| 45722 | 197 |   fixes check_all :: "('a * (unit \<Rightarrow> term) \<Rightarrow> (bool * term list) option) \<Rightarrow> (bool * term list) option"
 | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 198 | fixes enum_term_of :: "'a itself \<Rightarrow> unit \<Rightarrow> term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 199 | |
| 45722 | 200 | fun check_all_n_lists :: "(('a :: check_all) list * (unit \<Rightarrow> term list) \<Rightarrow> (bool * term list) option) \<Rightarrow> code_numeral \<Rightarrow> (bool * term list) option"
 | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 201 | where | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 202 | "check_all_n_lists f n = | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 203 | (if n = 0 then f ([], (%_. [])) else check_all (%(x, xt). check_all_n_lists (%(xs, xst). f ((x # xs), (%_. (xt () # xst ())))) (n - 1)))" | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 204 | |
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 205 | definition (in term_syntax) [code_unfold]: "termify_fun_upd g a b = (Code_Evaluation.termify (fun_upd :: ('a :: typerep => 'b :: typerep) => 'a => 'b => 'a => 'b) <\<cdot>> g <\<cdot>> a <\<cdot>> b)"
 | 
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 206 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 207 | definition mk_map_term :: " (unit \<Rightarrow> typerep) \<Rightarrow> (unit \<Rightarrow> typerep) \<Rightarrow> (unit \<Rightarrow> term list) \<Rightarrow> (unit \<Rightarrow> term list) \<Rightarrow> unit \<Rightarrow> term" | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 208 | where | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 209 | "mk_map_term T1 T2 domm rng = | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 210 | (%_. let T1 = T1 (); | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 211 | T2 = T2 (); | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 212 | update_term = (%g (a, b). | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 213 | Code_Evaluation.App (Code_Evaluation.App (Code_Evaluation.App | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 214 | (Code_Evaluation.Const (STR ''Fun.fun_upd'') | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 215 | (Typerep.Typerep (STR ''fun'') [Typerep.Typerep (STR ''fun'') [T1, T2], | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 216 | Typerep.Typerep (STR ''fun'') [T1, | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 217 | Typerep.Typerep (STR ''fun'') [T2, Typerep.Typerep (STR ''fun'') [T1, T2]]]])) | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 218 | g) a) b) | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 219 | in | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 220 | List.foldl update_term (Code_Evaluation.Abs (STR ''x'') T1 (Code_Evaluation.Const (STR ''HOL.undefined'') T2)) (zip (domm ()) (rng ())))" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 221 | |
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 222 | instantiation "fun" :: ("{equal, check_all}", check_all) check_all
 | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 223 | begin | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 224 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 225 | definition | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 226 | "check_all f = | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 227 | (let | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 228 |       mk_term = mk_map_term (%_. Typerep.typerep (TYPE('a))) (%_. Typerep.typerep (TYPE('b))) (enum_term_of (TYPE('a)));
 | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 229 | enum = (Enum.enum :: 'a list) | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 230 | in check_all_n_lists (\<lambda>(ys, yst). f (the o map_of (zip enum ys), mk_term yst)) (Code_Numeral.of_nat (length enum)))" | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 231 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 232 | definition enum_term_of_fun :: "('a => 'b) itself => unit => term list"
 | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 233 | where | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 234 | "enum_term_of_fun = (%_ _. let | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 235 |     enum_term_of_a = enum_term_of (TYPE('a));
 | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 236 |     mk_term = mk_map_term (%_. Typerep.typerep (TYPE('a))) (%_. Typerep.typerep (TYPE('b))) enum_term_of_a
 | 
| 49948 
744934b818c7
moved quite generic material from theory Enum to more appropriate places
 haftmann parents: 
48891diff
changeset | 237 |   in map (%ys. mk_term (%_. ys) ()) (List.n_lists (length (enum_term_of_a ())) (enum_term_of (TYPE('b)) ())))"
 | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 238 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 239 | instance .. | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 240 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 241 | end | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 242 | |
| 46305 | 243 | fun (in term_syntax) check_all_subsets :: "(('a :: typerep) set * (unit => term) => (bool * term list) option) => ('a * (unit => term)) list => (bool * term list) option"
 | 
| 244 | where | |
| 245 | "check_all_subsets f [] = f valterm_emptyset" | |
| 246 | | "check_all_subsets f (x # xs) = check_all_subsets (%s. case f s of Some ts => Some ts | None => f (valtermify_insert x s)) xs" | |
| 247 | ||
| 248 | ||
| 249 | definition (in term_syntax) [code_unfold]: "term_emptyset = Code_Evaluation.termify ({} :: ('a :: typerep) set)"
 | |
| 250 | definition (in term_syntax) [code_unfold]: "termify_insert x s = Code_Evaluation.termify (insert :: ('a::typerep) => 'a set => 'a set)  <\<cdot>> x <\<cdot>> s"
 | |
| 251 | ||
| 252 | definition (in term_syntax) setify :: "('a::typerep) itself => term list => term"
 | |
| 253 | where | |
| 254 | "setify T ts = foldr (termify_insert T) ts (term_emptyset T)" | |
| 255 | ||
| 256 | instantiation set :: (check_all) check_all | |
| 257 | begin | |
| 258 | ||
| 259 | definition | |
| 260 | "check_all_set f = | |
| 261 |      check_all_subsets f (zip (Enum.enum :: 'a list) (map (%a. %u :: unit. a) (Quickcheck_Exhaustive.enum_term_of (TYPE ('a)) ())))"
 | |
| 262 | ||
| 263 | definition enum_term_of_set :: "'a set itself => unit => term list" | |
| 264 | where | |
| 265 |   "enum_term_of_set _ _ = map (setify (TYPE('a))) (sublists (Quickcheck_Exhaustive.enum_term_of (TYPE('a)) ()))"
 | |
| 266 | ||
| 267 | instance .. | |
| 268 | ||
| 269 | end | |
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 270 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 271 | instantiation unit :: check_all | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 272 | begin | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 273 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 274 | definition | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 275 | "check_all f = f (Code_Evaluation.valtermify ())" | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 276 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 277 | definition enum_term_of_unit :: "unit itself => unit => term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 278 | where | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 279 | "enum_term_of_unit = (%_ _. [Code_Evaluation.term_of ()])" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 280 | |
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 281 | instance .. | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 282 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 283 | end | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 284 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 285 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 286 | instantiation bool :: check_all | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 287 | begin | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 288 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 289 | definition | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 290 | "check_all f = (case f (Code_Evaluation.valtermify False) of Some x' \<Rightarrow> Some x' | None \<Rightarrow> f (Code_Evaluation.valtermify True))" | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 291 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 292 | definition enum_term_of_bool :: "bool itself => unit => term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 293 | where | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 294 | "enum_term_of_bool = (%_ _. map Code_Evaluation.term_of (Enum.enum :: bool list))" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 295 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 296 | instance .. | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 297 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 298 | end | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 299 | |
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 300 | definition (in term_syntax) [code_unfold]: "termify_pair x y = Code_Evaluation.termify (Pair :: 'a :: typerep => 'b :: typerep => 'a * 'b) <\<cdot>> x <\<cdot>> y" | 
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 301 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 302 | instantiation prod :: (check_all, check_all) check_all | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 303 | begin | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 304 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 305 | definition | 
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 306 | "check_all f = check_all (%x. check_all (%y. f (valtermify_pair x y)))" | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 307 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 308 | definition enum_term_of_prod :: "('a * 'b) itself => unit => term list"
 | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 309 | where | 
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 310 |   "enum_term_of_prod = (%_ _. map (%(x, y). termify_pair TYPE('a) TYPE('b) x y)
 | 
| 49948 
744934b818c7
moved quite generic material from theory Enum to more appropriate places
 haftmann parents: 
48891diff
changeset | 311 |      (List.product (enum_term_of (TYPE('a)) ()) (enum_term_of (TYPE('b)) ())))"
 | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 312 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 313 | instance .. | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 314 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 315 | end | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 316 | |
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 317 | definition (in term_syntax) [code_unfold]: "valtermify_Inl x = Code_Evaluation.valtermify (Inl :: 'a :: typerep => 'a + 'b :: typerep) {\<cdot>} x"
 | 
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 318 | definition (in term_syntax) [code_unfold]: "valtermify_Inr x = Code_Evaluation.valtermify (Inr :: 'b :: typerep => 'a ::typerep + 'b) {\<cdot>} x"
 | 
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 319 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 320 | instantiation sum :: (check_all, check_all) check_all | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 321 | begin | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 322 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 323 | definition | 
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 324 | "check_all f = check_all (%a. f (valtermify_Inl a)) orelse check_all (%b. f (valtermify_Inr b))" | 
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 325 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 326 | definition enum_term_of_sum :: "('a + 'b) itself => unit => term list"
 | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 327 | where | 
| 41722 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 328 | "enum_term_of_sum = (%_ _. | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 329 | let | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 330 |        T1 = (Typerep.typerep (TYPE('a)));
 | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 331 |        T2 = (Typerep.typerep (TYPE('b)))
 | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 332 | in | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 333 | map (Code_Evaluation.App (Code_Evaluation.Const (STR ''Sum_Type.Inl'') | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 334 | (Typerep.Typerep (STR ''fun'') [T1, Typerep.Typerep (STR ''Sum_Type.sum'') [T1, T2]]))) | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 335 |              (enum_term_of (TYPE('a)) ()) @
 | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 336 | map (Code_Evaluation.App (Code_Evaluation.Const (STR ''Sum_Type.Inr'') | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 337 | (Typerep.Typerep (STR ''fun'') [T2, Typerep.Typerep (STR ''Sum_Type.sum'') [T1, T2]]))) | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 338 |              (enum_term_of (TYPE('b)) ()))"
 | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 339 | |
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 340 | instance .. | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 341 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 342 | end | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 343 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 344 | instantiation nibble :: check_all | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 345 | begin | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 346 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 347 | definition | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 348 | "check_all f = | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 349 | f (Code_Evaluation.valtermify Nibble0) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 350 | f (Code_Evaluation.valtermify Nibble1) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 351 | f (Code_Evaluation.valtermify Nibble2) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 352 | f (Code_Evaluation.valtermify Nibble3) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 353 | f (Code_Evaluation.valtermify Nibble4) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 354 | f (Code_Evaluation.valtermify Nibble5) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 355 | f (Code_Evaluation.valtermify Nibble6) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 356 | f (Code_Evaluation.valtermify Nibble7) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 357 | f (Code_Evaluation.valtermify Nibble8) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 358 | f (Code_Evaluation.valtermify Nibble9) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 359 | f (Code_Evaluation.valtermify NibbleA) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 360 | f (Code_Evaluation.valtermify NibbleB) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 361 | f (Code_Evaluation.valtermify NibbleC) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 362 | f (Code_Evaluation.valtermify NibbleD) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 363 | f (Code_Evaluation.valtermify NibbleE) orelse | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 364 | f (Code_Evaluation.valtermify NibbleF)" | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 365 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 366 | definition enum_term_of_nibble :: "nibble itself => unit => term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 367 | where | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 368 | "enum_term_of_nibble = (%_ _. map Code_Evaluation.term_of (Enum.enum :: nibble list))" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 369 | |
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 370 | instance .. | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 371 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 372 | end | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 373 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 374 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 375 | instantiation char :: check_all | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 376 | begin | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 377 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 378 | definition | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 379 | "check_all f = check_all (%(x, t1). check_all (%(y, t2). f (Char x y, %_. Code_Evaluation.App (Code_Evaluation.App (Code_Evaluation.term_of Char) (t1 ())) (t2 ()))))" | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 380 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 381 | definition enum_term_of_char :: "char itself => unit => term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 382 | where | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 383 | "enum_term_of_char = (%_ _. map Code_Evaluation.term_of (Enum.enum :: char list))" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 384 | |
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 385 | instance .. | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 386 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 387 | end | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 388 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 389 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 390 | instantiation option :: (check_all) check_all | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 391 | begin | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 392 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 393 | definition | 
| 41178 
f4d3acf0c4cc
adding postprocessing for maps in term construction of quickcheck; fixed check_all_option definition
 bulwahn parents: 
41177diff
changeset | 394 | "check_all f = f (Code_Evaluation.valtermify (None :: 'a option)) orelse check_all (%(x, t). f (Some x, %_. Code_Evaluation.App | 
| 
f4d3acf0c4cc
adding postprocessing for maps in term construction of quickcheck; fixed check_all_option definition
 bulwahn parents: 
41177diff
changeset | 395 | (Code_Evaluation.Const (STR ''Option.option.Some'') | 
| 
f4d3acf0c4cc
adding postprocessing for maps in term construction of quickcheck; fixed check_all_option definition
 bulwahn parents: 
41177diff
changeset | 396 |       (Typerep.Typerep (STR ''fun'') [Typerep.typerep TYPE('a),  Typerep.Typerep (STR ''Option.option'') [Typerep.typerep TYPE('a)]])) (t ())))"
 | 
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 397 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 398 | definition enum_term_of_option :: "'a option itself => unit => term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 399 | where | 
| 41722 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 400 | "enum_term_of_option = (% _ _. (Code_Evaluation.term_of (None :: 'a option)) # (map (Code_Evaluation.App (Code_Evaluation.Const (STR ''Option.option.Some'') | 
| 
9575694d2da5
improving sum type and option type term constructions for correct presentation in Smallcheck
 bulwahn parents: 
41719diff
changeset | 401 |       (Typerep.Typerep (STR ''fun'') [Typerep.typerep TYPE('a),  Typerep.Typerep (STR ''Option.option'') [Typerep.typerep TYPE('a)]]))) (enum_term_of (TYPE('a)) ())))"
 | 
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 402 | |
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 403 | instance .. | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 404 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 405 | end | 
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 406 | |
| 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 407 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 408 | instantiation Enum.finite_1 :: check_all | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 409 | begin | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 410 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 411 | definition | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 412 | "check_all f = f (Code_Evaluation.valtermify Enum.finite_1.a\<^isub>1)" | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 413 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 414 | definition enum_term_of_finite_1 :: "Enum.finite_1 itself => unit => term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 415 | where | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 416 | "enum_term_of_finite_1 = (%_ _. [Code_Evaluation.term_of Enum.finite_1.a\<^isub>1])" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 417 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 418 | instance .. | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 419 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 420 | end | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 421 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 422 | instantiation Enum.finite_2 :: check_all | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 423 | begin | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 424 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 425 | definition | 
| 46417 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 426 | "check_all f = (f (Code_Evaluation.valtermify Enum.finite_2.a\<^isub>1) | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 427 | orelse f (Code_Evaluation.valtermify Enum.finite_2.a\<^isub>2))" | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 428 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 429 | definition enum_term_of_finite_2 :: "Enum.finite_2 itself => unit => term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 430 | where | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 431 | "enum_term_of_finite_2 = (%_ _. map Code_Evaluation.term_of (Enum.enum :: Enum.finite_2 list))" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 432 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 433 | instance .. | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 434 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 435 | end | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 436 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 437 | instantiation Enum.finite_3 :: check_all | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 438 | begin | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 439 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 440 | definition | 
| 46417 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 441 | "check_all f = (f (Code_Evaluation.valtermify Enum.finite_3.a\<^isub>1) | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 442 | orelse f (Code_Evaluation.valtermify Enum.finite_3.a\<^isub>2) | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 443 | orelse f (Code_Evaluation.valtermify Enum.finite_3.a\<^isub>3))" | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 444 | |
| 41177 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 445 | definition enum_term_of_finite_3 :: "Enum.finite_3 itself => unit => term list" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 446 | where | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 447 | "enum_term_of_finite_3 = (%_ _. map Code_Evaluation.term_of (Enum.enum :: Enum.finite_3 list))" | 
| 
810a885decee
added enum_term_of to correct present nested functions
 bulwahn parents: 
41105diff
changeset | 448 | |
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 449 | instance .. | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 450 | |
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 451 | end | 
| 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 452 | |
| 46417 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 453 | instantiation Enum.finite_4 :: check_all | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 454 | begin | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 455 | |
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 456 | definition | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 457 | "check_all f = (f (Code_Evaluation.valtermify Enum.finite_4.a\<^isub>1) | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 458 | orelse f (Code_Evaluation.valtermify Enum.finite_4.a\<^isub>2) | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 459 | orelse f (Code_Evaluation.valtermify Enum.finite_4.a\<^isub>3) | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 460 | orelse f (Code_Evaluation.valtermify Enum.finite_4.a\<^isub>4))" | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 461 | |
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 462 | definition enum_term_of_finite_4 :: "Enum.finite_4 itself => unit => term list" | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 463 | where | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 464 | "enum_term_of_finite_4 = (%_ _. map Code_Evaluation.term_of (Enum.enum :: Enum.finite_4 list))" | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 465 | |
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 466 | instance .. | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 467 | |
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 468 | end | 
| 
1a68fcb80b62
beautifying definitions of check_all and adding instance for finite_4
 bulwahn parents: 
46311diff
changeset | 469 | |
| 42195 
1e7b62c93f5d
adding an exhaustive validator for quickcheck's batch validating; moving strip_imp; minimal setup for bounded_forall
 bulwahn parents: 
42117diff
changeset | 470 | subsection {* Bounded universal quantifiers *}
 | 
| 41085 
a549ff1d4070
adding a smarter enumeration scheme for finite functions
 bulwahn parents: 
40915diff
changeset | 471 | |
| 42195 
1e7b62c93f5d
adding an exhaustive validator for quickcheck's batch validating; moving strip_imp; minimal setup for bounded_forall
 bulwahn parents: 
42117diff
changeset | 472 | class bounded_forall = | 
| 
1e7b62c93f5d
adding an exhaustive validator for quickcheck's batch validating; moving strip_imp; minimal setup for bounded_forall
 bulwahn parents: 
42117diff
changeset | 473 |   fixes bounded_forall :: "('a \<Rightarrow> bool) \<Rightarrow> code_numeral \<Rightarrow> bool"
 | 
| 
1e7b62c93f5d
adding an exhaustive validator for quickcheck's batch validating; moving strip_imp; minimal setup for bounded_forall
 bulwahn parents: 
42117diff
changeset | 474 | |
| 42305 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 475 | subsection {* Fast exhaustive combinators *}
 | 
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 476 | |
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 477 | class fast_exhaustive = term_of + | 
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 478 |   fixes fast_exhaustive :: "('a \<Rightarrow> unit) \<Rightarrow> code_numeral \<Rightarrow> unit"
 | 
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 479 | |
| 45818 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 480 | axiomatization throw_Counterexample :: "term list => unit" | 
| 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 481 | axiomatization catch_Counterexample :: "unit => term list option" | 
| 42305 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 482 | |
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 483 | code_const throw_Counterexample | 
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 484 | (Quickcheck "raise (Exhaustive'_Generators.Counterexample _)") | 
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 485 | code_const catch_Counterexample | 
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 486 | (Quickcheck "(((_); NONE) handle Exhaustive'_Generators.Counterexample ts => SOME ts)") | 
| 
494c31fdec95
theory definitions for fast exhaustive quickcheck compilation
 bulwahn parents: 
42304diff
changeset | 487 | |
| 45450 | 488 | subsection {* Continuation passing style functions as plus monad *}
 | 
| 489 | ||
| 490 | type_synonym 'a cps = "('a => term list option) => term list option"
 | |
| 491 | ||
| 492 | definition cps_empty :: "'a cps" | |
| 493 | where | |
| 494 | "cps_empty = (%cont. None)" | |
| 495 | ||
| 496 | definition cps_single :: "'a => 'a cps" | |
| 497 | where | |
| 498 | "cps_single v = (%cont. cont v)" | |
| 499 | ||
| 500 | definition cps_bind :: "'a cps => ('a => 'b cps) => 'b cps" 
 | |
| 501 | where | |
| 502 | "cps_bind m f = (%cont. m (%a. (f a) cont))" | |
| 503 | ||
| 504 | definition cps_plus :: "'a cps => 'a cps => 'a cps" | |
| 505 | where | |
| 506 | "cps_plus a b = (%c. case a c of None => b c | Some x => Some x)" | |
| 507 | ||
| 508 | definition cps_if :: "bool => unit cps" | |
| 509 | where | |
| 510 | "cps_if b = (if b then cps_single () else cps_empty)" | |
| 511 | ||
| 512 | definition cps_not :: "unit cps => unit cps" | |
| 513 | where | |
| 514 | "cps_not n = (%c. case n (%u. Some []) of None => c () | Some _ => None)" | |
| 515 | ||
| 45750 
17100f4ce0b5
adding genuine flag to predicate_compile_quickcheck and prolog_quickcheck (cf. 5e46c225370e);
 bulwahn parents: 
45733diff
changeset | 516 | type_synonym 'a pos_bound_cps = "('a => (bool * term list) option) => code_numeral => (bool * term list) option"
 | 
| 45450 | 517 | |
| 518 | definition pos_bound_cps_empty :: "'a pos_bound_cps" | |
| 519 | where | |
| 520 | "pos_bound_cps_empty = (%cont i. None)" | |
| 521 | ||
| 522 | definition pos_bound_cps_single :: "'a => 'a pos_bound_cps" | |
| 523 | where | |
| 524 | "pos_bound_cps_single v = (%cont i. cont v)" | |
| 525 | ||
| 526 | definition pos_bound_cps_bind :: "'a pos_bound_cps => ('a => 'b pos_bound_cps) => 'b pos_bound_cps" 
 | |
| 527 | where | |
| 528 | "pos_bound_cps_bind m f = (%cont i. if i = 0 then None else (m (%a. (f a) cont i) (i - 1)))" | |
| 529 | ||
| 530 | definition pos_bound_cps_plus :: "'a pos_bound_cps => 'a pos_bound_cps => 'a pos_bound_cps" | |
| 531 | where | |
| 532 | "pos_bound_cps_plus a b = (%c i. case a c i of None => b c i | Some x => Some x)" | |
| 533 | ||
| 534 | definition pos_bound_cps_if :: "bool => unit pos_bound_cps" | |
| 535 | where | |
| 536 | "pos_bound_cps_if b = (if b then pos_bound_cps_single () else pos_bound_cps_empty)" | |
| 537 | ||
| 538 | datatype 'a unknown = Unknown | Known 'a | |
| 539 | datatype 'a three_valued = Unknown_value | Value 'a | No_value | |
| 540 | ||
| 541 | type_synonym 'a neg_bound_cps = "('a unknown => term list three_valued) => code_numeral => term list three_valued"
 | |
| 542 | ||
| 543 | definition neg_bound_cps_empty :: "'a neg_bound_cps" | |
| 544 | where | |
| 545 | "neg_bound_cps_empty = (%cont i. No_value)" | |
| 546 | ||
| 547 | definition neg_bound_cps_single :: "'a => 'a neg_bound_cps" | |
| 548 | where | |
| 549 | "neg_bound_cps_single v = (%cont i. cont (Known v))" | |
| 550 | ||
| 551 | definition neg_bound_cps_bind :: "'a neg_bound_cps => ('a => 'b neg_bound_cps) => 'b neg_bound_cps" 
 | |
| 552 | where | |
| 553 | "neg_bound_cps_bind m f = (%cont i. if i = 0 then cont Unknown else m (%a. case a of Unknown => cont Unknown | Known a' => f a' cont i) (i - 1))" | |
| 554 | ||
| 555 | definition neg_bound_cps_plus :: "'a neg_bound_cps => 'a neg_bound_cps => 'a neg_bound_cps" | |
| 556 | where | |
| 557 | "neg_bound_cps_plus a b = (%c i. case a c i of No_value => b c i | Value x => Value x | Unknown_value => (case b c i of No_value => Unknown_value | Value x => Value x | Unknown_value => Unknown_value))" | |
| 558 | ||
| 559 | definition neg_bound_cps_if :: "bool => unit neg_bound_cps" | |
| 560 | where | |
| 561 | "neg_bound_cps_if b = (if b then neg_bound_cps_single () else neg_bound_cps_empty)" | |
| 562 | ||
| 563 | definition neg_bound_cps_not :: "unit pos_bound_cps => unit neg_bound_cps" | |
| 564 | where | |
| 45750 
17100f4ce0b5
adding genuine flag to predicate_compile_quickcheck and prolog_quickcheck (cf. 5e46c225370e);
 bulwahn parents: 
45733diff
changeset | 565 | "neg_bound_cps_not n = (%c i. case n (%u. Some (True, [])) i of None => c (Known ()) | Some _ => No_value)" | 
| 45450 | 566 | |
| 567 | definition pos_bound_cps_not :: "unit neg_bound_cps => unit pos_bound_cps" | |
| 568 | where | |
| 569 | "pos_bound_cps_not n = (%c i. case n (%u. Value []) i of No_value => c () | Value _ => None | Unknown_value => None)" | |
| 570 | ||
| 45925 | 571 | subsection {* Defining generators for any first-order data type *}
 | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 572 | |
| 45697 
3b7c35a08723
more stable introduction of the internally used unknown term
 bulwahn parents: 
45684diff
changeset | 573 | axiomatization unknown :: 'a | 
| 
3b7c35a08723
more stable introduction of the internally used unknown term
 bulwahn parents: 
45684diff
changeset | 574 | |
| 
3b7c35a08723
more stable introduction of the internally used unknown term
 bulwahn parents: 
45684diff
changeset | 575 | notation (output) unknown  ("?")
 | 
| 45684 
3d6ee9c7d7ef
adding a exception-safe term reification step in quickcheck; adding examples
 bulwahn parents: 
45450diff
changeset | 576 | |
| 48891 | 577 | ML_file "Tools/Quickcheck/exhaustive_generators.ML" | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 578 | |
| 41918 | 579 | setup {* Exhaustive_Generators.setup *}
 | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 580 | |
| 43882 
05d5696f177f
renaming quickcheck_tester to quickcheck_batch_tester; tuned
 bulwahn parents: 
42310diff
changeset | 581 | declare [[quickcheck_batch_tester = exhaustive]] | 
| 40915 
a4c956d1f91f
declaring quickcheck testers as default after their setup
 bulwahn parents: 
40914diff
changeset | 582 | |
| 45925 | 583 | subsection {* Defining generators for abstract types *}
 | 
| 584 | ||
| 48891 | 585 | ML_file "Tools/Quickcheck/abstract_generators.ML" | 
| 45925 | 586 | |
| 47203 | 587 | hide_fact (open) orelse_def | 
| 41105 
a76ee71c3313
adding check_all instances for a few more finite types in smallcheck
 bulwahn parents: 
41104diff
changeset | 588 | no_notation orelse (infixr "orelse" 55) | 
| 45818 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 589 | |
| 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 590 | hide_fact | 
| 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 591 | exhaustive'_def | 
| 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 592 | exhaustive_code_numeral'_def | 
| 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 593 | |
| 46307 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 594 | hide_const valtermify_absdummy valtermify_fun_upd valterm_emptyset valtermify_insert valtermify_pair | 
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 595 | valtermify_Inl valtermify_Inr | 
| 
ec8f975c059b
shortened definitions by adding some termify constants
 bulwahn parents: 
46305diff
changeset | 596 | termify_fun_upd term_emptyset termify_insert termify_pair setify | 
| 46305 | 597 | |
| 45818 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 598 | hide_const (open) | 
| 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 599 | exhaustive full_exhaustive exhaustive' exhaustive_code_numeral' full_exhaustive_code_numeral' | 
| 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 600 | throw_Counterexample catch_Counterexample | 
| 
53a697f5454a
hiding constants and facts in the Quickcheck_Exhaustive and Quickcheck_Narrowing theory;
 bulwahn parents: 
45750diff
changeset | 601 | check_all enum_term_of | 
| 46305 | 602 | orelse unknown mk_map_term check_all_n_lists check_all_subsets | 
| 40420 
552563ea3304
adding code and theory for smallvalue generators, but do not setup the interpretation yet
 bulwahn parents: diff
changeset | 603 | |
| 45450 | 604 | hide_type (open) cps pos_bound_cps neg_bound_cps unknown three_valued | 
| 605 | hide_const (open) cps_empty cps_single cps_bind cps_plus cps_if cps_not | |
| 606 | pos_bound_cps_empty pos_bound_cps_single pos_bound_cps_bind pos_bound_cps_plus pos_bound_cps_if pos_bound_cps_not | |
| 607 | neg_bound_cps_empty neg_bound_cps_single neg_bound_cps_bind neg_bound_cps_plus neg_bound_cps_if neg_bound_cps_not | |
| 608 | Unknown Known Unknown_value Value No_value | |
| 609 | ||
| 610 | end |