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