| author | blanchet | 
| Wed, 17 Mar 2010 17:23:45 +0100 | |
| changeset 35814 | 234eaa508359 | 
| parent 35665 | ff2bf50505ab | 
| child 35968 | b7f98ff9c7d9 | 
| permissions | -rw-r--r-- | 
| 33982 | 1  | 
(* Title: HOL/Tools/Nitpick/nitpick_scope.ML  | 
| 33192 | 2  | 
Author: Jasmin Blanchette, TU Muenchen  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34936 
diff
changeset
 | 
3  | 
Copyright 2008, 2009, 2010  | 
| 33192 | 4  | 
|
5  | 
Scope enumerator for Nitpick.  | 
|
6  | 
*)  | 
|
7  | 
||
8  | 
signature NITPICK_SCOPE =  | 
|
9  | 
sig  | 
|
| 
33705
 
947184dc75c9
removed a few global names in Nitpick (styp, nat_less, pairf)
 
blanchet 
parents: 
33580 
diff
changeset
 | 
10  | 
type styp = Nitpick_Util.styp  | 
| 
35070
 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 
blanchet 
parents: 
34982 
diff
changeset
 | 
11  | 
type hol_context = Nitpick_HOL.hol_context  | 
| 33192 | 12  | 
|
13  | 
  type constr_spec = {
 | 
|
14  | 
const: styp,  | 
|
15  | 
delta: int,  | 
|
16  | 
epsilon: int,  | 
|
17  | 
exclusive: bool,  | 
|
18  | 
explicit_max: int,  | 
|
19  | 
total: bool}  | 
|
20  | 
||
21  | 
  type dtype_spec = {
 | 
|
22  | 
typ: typ,  | 
|
23  | 
card: int,  | 
|
24  | 
co: bool,  | 
|
| 
35179
 
4b198af5beb5
redo Nitpick's nonstandard values as cyclic values (instead of additional constructors)
 
blanchet 
parents: 
35178 
diff
changeset
 | 
25  | 
standard: bool,  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
26  | 
complete: bool * bool,  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
27  | 
concrete: bool * bool,  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34936 
diff
changeset
 | 
28  | 
deep: bool,  | 
| 33192 | 29  | 
constrs: constr_spec list}  | 
30  | 
||
31  | 
  type scope = {
 | 
|
| 
35070
 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 
blanchet 
parents: 
34982 
diff
changeset
 | 
32  | 
hol_ctxt: hol_context,  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
33  | 
binarize: bool,  | 
| 33192 | 34  | 
card_assigns: (typ * int) list,  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
35  | 
bits: int,  | 
| 33192 | 36  | 
bisim_depth: int,  | 
37  | 
datatypes: dtype_spec list,  | 
|
38  | 
ofs: int Typtab.table}  | 
|
39  | 
||
40  | 
val datatype_spec : dtype_spec list -> typ -> dtype_spec option  | 
|
41  | 
val constr_spec : dtype_spec list -> styp -> constr_spec  | 
|
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
42  | 
val is_complete_type : dtype_spec list -> bool -> typ -> bool  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
43  | 
val is_concrete_type : dtype_spec list -> bool -> typ -> bool  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
44  | 
val is_exact_type : dtype_spec list -> bool -> typ -> bool  | 
| 33192 | 45  | 
val offset_of_type : int Typtab.table -> typ -> int  | 
46  | 
val spec_of_type : scope -> typ -> int * int  | 
|
47  | 
val pretties_for_scope : scope -> bool -> Pretty.T list  | 
|
48  | 
val multiline_string_for_scope : scope -> string  | 
|
| 35814 | 49  | 
val scopes_equivalent : scope * scope -> bool  | 
| 33192 | 50  | 
val scope_less_eq : scope -> scope -> bool  | 
51  | 
val all_scopes :  | 
|
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
52  | 
hol_context -> bool -> int -> (typ option * int list) list  | 
| 33192 | 53  | 
-> (styp option * int list) list -> (styp option * int list) list  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
54  | 
-> int list -> int list -> typ list -> typ list -> typ list -> typ list  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
55  | 
-> int * scope list  | 
| 33192 | 56  | 
end;  | 
57  | 
||
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
58  | 
structure Nitpick_Scope : NITPICK_SCOPE =  | 
| 33192 | 59  | 
struct  | 
60  | 
||
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
61  | 
open Nitpick_Util  | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
62  | 
open Nitpick_HOL  | 
| 33192 | 63  | 
|
64  | 
type constr_spec = {
 | 
|
65  | 
const: styp,  | 
|
66  | 
delta: int,  | 
|
67  | 
epsilon: int,  | 
|
68  | 
exclusive: bool,  | 
|
69  | 
explicit_max: int,  | 
|
70  | 
total: bool}  | 
|
71  | 
||
72  | 
type dtype_spec = {
 | 
|
73  | 
typ: typ,  | 
|
74  | 
card: int,  | 
|
75  | 
co: bool,  | 
|
| 
35179
 
4b198af5beb5
redo Nitpick's nonstandard values as cyclic values (instead of additional constructors)
 
blanchet 
parents: 
35178 
diff
changeset
 | 
76  | 
standard: bool,  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
77  | 
complete: bool * bool,  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
78  | 
concrete: bool * bool,  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34936 
diff
changeset
 | 
79  | 
deep: bool,  | 
| 33192 | 80  | 
constrs: constr_spec list}  | 
81  | 
||
82  | 
type scope = {
 | 
|
| 
35070
 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 
blanchet 
parents: 
34982 
diff
changeset
 | 
83  | 
hol_ctxt: hol_context,  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
84  | 
binarize: bool,  | 
| 33192 | 85  | 
card_assigns: (typ * int) list,  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
86  | 
bits: int,  | 
| 33192 | 87  | 
bisim_depth: int,  | 
88  | 
datatypes: dtype_spec list,  | 
|
89  | 
ofs: int Typtab.table}  | 
|
90  | 
||
91  | 
datatype row_kind = Card of typ | Max of styp  | 
|
92  | 
||
93  | 
type row = row_kind * int list  | 
|
94  | 
type block = row list  | 
|
95  | 
||
96  | 
(* dtype_spec list -> typ -> dtype_spec option *)  | 
|
97  | 
fun datatype_spec (dtypes : dtype_spec list) T =  | 
|
| 
34121
 
5e831d805118
get rid of polymorphic equality in Nitpick's code + a few minor cleanups
 
blanchet 
parents: 
33982 
diff
changeset
 | 
98  | 
List.find (curry (op =) T o #typ) dtypes  | 
| 33192 | 99  | 
|
100  | 
(* dtype_spec list -> styp -> constr_spec *)  | 
|
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
101  | 
fun constr_spec [] x = raise TERM ("Nitpick_Scope.constr_spec", [Const x])
 | 
| 33192 | 102  | 
  | constr_spec ({constrs, ...} :: dtypes : dtype_spec list) (x as (s, T)) =
 | 
| 
34121
 
5e831d805118
get rid of polymorphic equality in Nitpick's code + a few minor cleanups
 
blanchet 
parents: 
33982 
diff
changeset
 | 
103  | 
case List.find (curry (op =) (s, body_type T) o (apsnd body_type o #const))  | 
| 33192 | 104  | 
constrs of  | 
105  | 
SOME c => c  | 
|
106  | 
| NONE => constr_spec dtypes x  | 
|
107  | 
||
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
108  | 
(* dtype_spec list -> bool -> typ -> bool *)  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
109  | 
fun is_complete_type dtypes facto (Type (@{type_name fun}, [T1, T2])) =
 | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
110  | 
is_concrete_type dtypes facto T1 andalso is_complete_type dtypes facto T2  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
111  | 
  | is_complete_type dtypes facto (Type (@{type_name fin_fun}, [T1, T2])) =
 | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
112  | 
is_exact_type dtypes facto T1 andalso is_complete_type dtypes facto T2  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
113  | 
  | is_complete_type dtypes facto (Type (@{type_name "*"}, Ts)) =
 | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
114  | 
forall (is_complete_type dtypes facto) Ts  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
115  | 
| is_complete_type dtypes facto T =  | 
| 
35220
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
116  | 
not (is_integer_like_type T) andalso not (is_bit_type T) andalso  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
117  | 
fun_from_pair (#complete (the (datatype_spec dtypes T))) facto  | 
| 33192 | 118  | 
handle Option.Option => true  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
119  | 
and is_concrete_type dtypes facto (Type (@{type_name fun}, [T1, T2])) =
 | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
120  | 
is_complete_type dtypes facto T1 andalso is_concrete_type dtypes facto T2  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
121  | 
  | is_concrete_type dtypes facto (Type (@{type_name fin_fun}, [_, T2])) =
 | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
122  | 
is_concrete_type dtypes facto T2  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
123  | 
  | is_concrete_type dtypes facto (Type (@{type_name "*"}, Ts)) =
 | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
124  | 
forall (is_concrete_type dtypes facto) Ts  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
125  | 
| is_concrete_type dtypes facto T =  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
126  | 
fun_from_pair (#concrete (the (datatype_spec dtypes T))) facto  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
127  | 
handle Option.Option => true  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
128  | 
and is_exact_type dtypes facto =  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
129  | 
is_complete_type dtypes facto andf is_concrete_type dtypes facto  | 
| 33192 | 130  | 
|
131  | 
(* int Typtab.table -> typ -> int *)  | 
|
132  | 
fun offset_of_type ofs T =  | 
|
133  | 
case Typtab.lookup ofs T of  | 
|
134  | 
SOME j0 => j0  | 
|
135  | 
| NONE => Typtab.lookup ofs dummyT |> the_default 0  | 
|
136  | 
||
137  | 
(* scope -> typ -> int * int *)  | 
|
138  | 
fun spec_of_type ({card_assigns, ofs, ...} : scope) T =
 | 
|
139  | 
(card_of_type card_assigns T  | 
|
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
140  | 
   handle TYPE ("Nitpick_HOL.card_of_type", _, _) => ~1, offset_of_type ofs T)
 | 
| 33192 | 141  | 
|
142  | 
(* (string -> string) -> scope  | 
|
143  | 
-> string list * string list * string list * string list * string list *)  | 
|
| 
35220
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
144  | 
fun quintuple_for_scope quote  | 
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
145  | 
        ({hol_ctxt = {thy, ctxt, stds, ...}, card_assigns, bits, bisim_depth,
 | 
| 
35220
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
146  | 
datatypes, ...} : scope) =  | 
| 33192 | 147  | 
let  | 
| 
35075
 
888802be2019
handle Nitpick's nonstandard model enumeration in a cleaner way;
 
blanchet 
parents: 
35072 
diff
changeset
 | 
148  | 
    val boring_Ts = [@{typ unsigned_bit}, @{typ signed_bit},
 | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
149  | 
                     @{typ bisim_iterator}]
 | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
150  | 
val (iter_assigns, card_assigns) =  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
151  | 
card_assigns |> filter_out (member (op =) boring_Ts o fst)  | 
| 33192 | 152  | 
|> List.partition (is_fp_iterator_type o fst)  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
153  | 
val (secondary_card_assigns, primary_card_assigns) =  | 
| 
35220
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
154  | 
card_assigns |> List.partition ((is_integer_type orf is_datatype thy stds)  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
155  | 
o fst)  | 
| 33192 | 156  | 
val cards =  | 
157  | 
map (fn (T, k) => quote (string_for_type ctxt T) ^ " = " ^  | 
|
158  | 
string_of_int k)  | 
|
159  | 
fun maxes () =  | 
|
160  | 
maps (map_filter  | 
|
161  | 
                (fn {const, explicit_max, ...} =>
 | 
|
162  | 
if explicit_max < 0 then  | 
|
163  | 
NONE  | 
|
164  | 
else  | 
|
165  | 
SOME (Syntax.string_of_term ctxt (Const const) ^ " = " ^  | 
|
166  | 
string_of_int explicit_max))  | 
|
167  | 
o #constrs) datatypes  | 
|
168  | 
fun iters () =  | 
|
169  | 
map (fn (T, k) =>  | 
|
170  | 
quote (Syntax.string_of_term ctxt  | 
|
171  | 
(Const (const_for_iterator_type T))) ^ " = " ^  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
172  | 
string_of_int (k - 1)) iter_assigns  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
173  | 
fun miscs () =  | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
174  | 
(if bits = 0 then [] else ["bits = " ^ string_of_int bits]) @  | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
175  | 
(if bisim_depth < 0 andalso forall (not o #co) datatypes then []  | 
| 35178 | 176  | 
else ["bisim_depth = " ^ signed_string_of_int bisim_depth])  | 
| 33192 | 177  | 
in  | 
178  | 
setmp_show_all_types  | 
|
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
179  | 
(fn () => (cards primary_card_assigns, cards secondary_card_assigns,  | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
180  | 
maxes (), iters (), miscs ())) ()  | 
| 33192 | 181  | 
end  | 
182  | 
||
183  | 
(* scope -> bool -> Pretty.T list *)  | 
|
184  | 
fun pretties_for_scope scope verbose =  | 
|
185  | 
let  | 
|
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
186  | 
val (primary_cards, secondary_cards, maxes, iters, bisim_depths) =  | 
| 33192 | 187  | 
quintuple_for_scope maybe_quote scope  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
188  | 
val ss = map (prefix "card ") primary_cards @  | 
| 33192 | 189  | 
(if verbose then  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
190  | 
map (prefix "card ") secondary_cards @  | 
| 33192 | 191  | 
map (prefix "max ") maxes @  | 
192  | 
map (prefix "iter ") iters @  | 
|
193  | 
bisim_depths  | 
|
194  | 
else  | 
|
195  | 
[])  | 
|
196  | 
in  | 
|
197  | 
if null ss then []  | 
|
198  | 
else serial_commas "and" ss |> map Pretty.str |> Pretty.breaks  | 
|
199  | 
end  | 
|
200  | 
||
201  | 
(* scope -> string *)  | 
|
202  | 
fun multiline_string_for_scope scope =  | 
|
203  | 
let  | 
|
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
204  | 
val (primary_cards, secondary_cards, maxes, iters, bisim_depths) =  | 
| 33192 | 205  | 
quintuple_for_scope I scope  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
206  | 
val cards = primary_cards @ secondary_cards  | 
| 33192 | 207  | 
in  | 
208  | 
case (if null cards then [] else ["card: " ^ commas cards]) @  | 
|
209  | 
(if null maxes then [] else ["max: " ^ commas maxes]) @  | 
|
210  | 
(if null iters then [] else ["iter: " ^ commas iters]) @  | 
|
211  | 
bisim_depths of  | 
|
212  | 
[] => "empty"  | 
|
213  | 
| lines => space_implode "\n" lines  | 
|
214  | 
end  | 
|
215  | 
||
| 35814 | 216  | 
(* scope * scope -> bool *)  | 
217  | 
fun scopes_equivalent (s1 : scope, s2 : scope) =  | 
|
| 33192 | 218  | 
#datatypes s1 = #datatypes s2 andalso #card_assigns s1 = #card_assigns s2  | 
219  | 
fun scope_less_eq (s1 : scope) (s2 : scope) =  | 
|
220  | 
(s1, s2) |> pairself (map snd o #card_assigns) |> op ~~ |> forall (op <=)  | 
|
221  | 
||
222  | 
(* row -> int *)  | 
|
223  | 
fun rank_of_row (_, ks) = length ks  | 
|
224  | 
(* block -> int *)  | 
|
225  | 
fun rank_of_block block = fold Integer.max (map rank_of_row block) 1  | 
|
226  | 
(* int -> typ * int list -> typ * int list *)  | 
|
227  | 
fun project_row column (y, ks) = (y, [nth ks (Int.min (column, length ks - 1))])  | 
|
228  | 
(* int -> block -> block *)  | 
|
229  | 
fun project_block (column, block) = map (project_row column) block  | 
|
230  | 
||
231  | 
(* (''a * ''a -> bool) -> (''a option * int list) list -> ''a -> int list *)
 | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
232  | 
fun lookup_ints_assign eq assigns key =  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
233  | 
case triple_lookup eq assigns key of  | 
| 33192 | 234  | 
SOME ks => ks  | 
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
235  | 
  | NONE => raise ARG ("Nitpick_Scope.lookup_ints_assign", "")
 | 
| 33192 | 236  | 
(* theory -> (typ option * int list) list -> typ -> int list *)  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
237  | 
fun lookup_type_ints_assign thy assigns T =  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
238  | 
map (curry Int.max 1) (lookup_ints_assign (type_match thy) assigns T)  | 
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
239  | 
  handle ARG ("Nitpick_Scope.lookup_ints_assign", _) =>
 | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
240  | 
         raise TYPE ("Nitpick_Scope.lookup_type_ints_assign", [T], [])
 | 
| 33192 | 241  | 
(* theory -> (styp option * int list) list -> styp -> int list *)  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
242  | 
fun lookup_const_ints_assign thy assigns x =  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
243  | 
lookup_ints_assign (const_match thy) assigns x  | 
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
244  | 
  handle ARG ("Nitpick_Scope.lookup_ints_assign", _) =>
 | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
245  | 
         raise TERM ("Nitpick_Scope.lookup_const_ints_assign", [Const x])
 | 
| 33192 | 246  | 
|
247  | 
(* theory -> (styp option * int list) list -> styp -> row option *)  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
248  | 
fun row_for_constr thy maxes_assigns constr =  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
249  | 
SOME (Max constr, lookup_const_ints_assign thy maxes_assigns constr)  | 
| 33192 | 250  | 
  handle TERM ("lookup_const_ints_assign", _) => NONE
 | 
251  | 
||
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
252  | 
val max_bits = 31 (* Kodkod limit *)  | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
253  | 
|
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
254  | 
(* hol_context -> bool -> (typ option * int list) list  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
255  | 
-> (styp option * int list) list -> (styp option * int list) list -> int list  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
256  | 
-> int list -> typ -> block *)  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
257  | 
fun block_for_type (hol_ctxt as {thy, ...}) binarize cards_assigns maxes_assigns
 | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
258  | 
iters_assigns bitss bisim_depths T =  | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
259  | 
  if T = @{typ unsigned_bit} then
 | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
260  | 
[(Card T, map (Integer.min max_bits o Integer.max 1) bitss)]  | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
261  | 
  else if T = @{typ signed_bit} then
 | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
262  | 
[(Card T, map (Integer.add 1 o Integer.min max_bits o Integer.max 1) bitss)]  | 
| 34126 | 263  | 
  else if T = @{typ "unsigned_bit word"} then
 | 
264  | 
[(Card T, lookup_type_ints_assign thy cards_assigns nat_T)]  | 
|
265  | 
  else if T = @{typ "signed_bit word"} then
 | 
|
266  | 
[(Card T, lookup_type_ints_assign thy cards_assigns int_T)]  | 
|
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
267  | 
  else if T = @{typ bisim_iterator} then
 | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
268  | 
[(Card T, map (Integer.add 1 o Integer.max 0) bisim_depths)]  | 
| 
33580
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33558 
diff
changeset
 | 
269  | 
else if is_fp_iterator_type T then  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
270  | 
[(Card T, map (Integer.add 1 o Integer.max 0)  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
271  | 
(lookup_const_ints_assign thy iters_assigns  | 
| 
33580
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33558 
diff
changeset
 | 
272  | 
(const_for_iterator_type T)))]  | 
| 
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33558 
diff
changeset
 | 
273  | 
else  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
274  | 
(Card T, lookup_type_ints_assign thy cards_assigns T) ::  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
275  | 
(case binarized_and_boxed_datatype_constrs hol_ctxt binarize T of  | 
| 
33580
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33558 
diff
changeset
 | 
276  | 
[_] => []  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
277  | 
| constrs => map_filter (row_for_constr thy maxes_assigns) constrs)  | 
| 33192 | 278  | 
|
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
279  | 
(* hol_context -> bool -> (typ option * int list) list  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
280  | 
-> (styp option * int list) list -> (styp option * int list) list -> int list  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
281  | 
-> int list -> typ list -> typ list -> block list *)  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
282  | 
fun blocks_for_types hol_ctxt binarize cards_assigns maxes_assigns iters_assigns  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
283  | 
bitss bisim_depths mono_Ts nonmono_Ts =  | 
| 33192 | 284  | 
let  | 
285  | 
(* typ -> block *)  | 
|
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
286  | 
val block_for = block_for_type hol_ctxt binarize cards_assigns maxes_assigns  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
287  | 
iters_assigns bitss bisim_depths  | 
| 33192 | 288  | 
val mono_block = maps block_for mono_Ts  | 
289  | 
val nonmono_blocks = map block_for nonmono_Ts  | 
|
290  | 
in mono_block :: nonmono_blocks end  | 
|
291  | 
||
292  | 
val sync_threshold = 5  | 
|
293  | 
||
294  | 
(* int list -> int list list *)  | 
|
295  | 
fun all_combinations_ordered_smartly ks =  | 
|
296  | 
let  | 
|
297  | 
(* int list -> int *)  | 
|
298  | 
fun cost_with_monos [] = 0  | 
|
299  | 
| cost_with_monos (k :: ks) =  | 
|
| 
34121
 
5e831d805118
get rid of polymorphic equality in Nitpick's code + a few minor cleanups
 
blanchet 
parents: 
33982 
diff
changeset
 | 
300  | 
if k < sync_threshold andalso forall (curry (op =) k) ks then  | 
| 33192 | 301  | 
k - sync_threshold  | 
302  | 
else  | 
|
303  | 
k * (k + 1) div 2 + Integer.sum ks  | 
|
304  | 
fun cost_without_monos [] = 0  | 
|
305  | 
| cost_without_monos [k] = k  | 
|
306  | 
| cost_without_monos (_ :: k :: ks) =  | 
|
| 
34121
 
5e831d805118
get rid of polymorphic equality in Nitpick's code + a few minor cleanups
 
blanchet 
parents: 
33982 
diff
changeset
 | 
307  | 
if k < sync_threshold andalso forall (curry (op =) k) ks then  | 
| 33192 | 308  | 
k - sync_threshold  | 
309  | 
else  | 
|
310  | 
Integer.sum (k :: ks)  | 
|
311  | 
in  | 
|
312  | 
ks |> all_combinations  | 
|
313  | 
|> map (`(if fst (hd ks) > 1 then cost_with_monos  | 
|
314  | 
else cost_without_monos))  | 
|
315  | 
|> sort (int_ord o pairself fst) |> map snd  | 
|
316  | 
end  | 
|
317  | 
||
318  | 
(* typ -> bool *)  | 
|
319  | 
fun is_self_recursive_constr_type T =  | 
|
| 
34121
 
5e831d805118
get rid of polymorphic equality in Nitpick's code + a few minor cleanups
 
blanchet 
parents: 
33982 
diff
changeset
 | 
320  | 
exists (exists_subtype (curry (op =) (body_type T))) (binder_types T)  | 
| 33192 | 321  | 
|
322  | 
(* (styp * int) list -> styp -> int *)  | 
|
323  | 
fun constr_max maxes x = the_default ~1 (AList.lookup (op =) maxes x)  | 
|
324  | 
||
325  | 
type scope_desc = (typ * int) list * (styp * int) list  | 
|
326  | 
||
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
327  | 
(* hol_context -> bool -> scope_desc -> typ * int -> bool *)  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
328  | 
fun is_surely_inconsistent_card_assign hol_ctxt binarize  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
329  | 
(card_assigns, max_assigns) (T, k) =  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
330  | 
case binarized_and_boxed_datatype_constrs hol_ctxt binarize T of  | 
| 33192 | 331  | 
[] => false  | 
332  | 
| xs =>  | 
|
333  | 
let  | 
|
| 34126 | 334  | 
val dom_cards =  | 
335  | 
map (Integer.prod o map (bounded_card_of_type k ~1 card_assigns)  | 
|
| 33192 | 336  | 
o binder_types o snd) xs  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
337  | 
val maxes = map (constr_max max_assigns) xs  | 
| 33192 | 338  | 
(* int -> int -> int *)  | 
| 34126 | 339  | 
fun effective_max card ~1 = card  | 
| 33192 | 340  | 
| effective_max card max = Int.min (card, max)  | 
| 34126 | 341  | 
val max = map2 effective_max dom_cards maxes |> Integer.sum  | 
342  | 
in max < k end  | 
|
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
343  | 
(* hol_context -> bool -> (typ * int) list -> (typ * int) list  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
344  | 
-> (styp * int) list -> bool *)  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
345  | 
fun is_surely_inconsistent_scope_description hol_ctxt binarize seen rest  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
346  | 
max_assigns =  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
347  | 
exists (is_surely_inconsistent_card_assign hol_ctxt binarize  | 
| 34126 | 348  | 
(seen @ rest, max_assigns)) seen  | 
| 33192 | 349  | 
|
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
350  | 
(* hol_context -> bool -> scope_desc -> (typ * int) list option *)  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
351  | 
fun repair_card_assigns hol_ctxt binarize (card_assigns, max_assigns) =  | 
| 33192 | 352  | 
let  | 
353  | 
(* (typ * int) list -> (typ * int) list -> (typ * int) list option *)  | 
|
354  | 
fun aux seen [] = SOME seen  | 
|
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
355  | 
| aux _ ((_, 0) :: _) = NONE  | 
| 34126 | 356  | 
| aux seen ((T, k) :: rest) =  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
357  | 
(if is_surely_inconsistent_scope_description hol_ctxt binarize  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
358  | 
((T, k) :: seen) rest max_assigns then  | 
| 33192 | 359  | 
raise SAME ()  | 
360  | 
else  | 
|
| 34126 | 361  | 
case aux ((T, k) :: seen) rest of  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
362  | 
SOME assigns => SOME assigns  | 
| 33192 | 363  | 
| NONE => raise SAME ())  | 
| 34126 | 364  | 
handle SAME () => aux seen ((T, k - 1) :: rest)  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
365  | 
in aux [] (rev card_assigns) end  | 
| 33192 | 366  | 
|
367  | 
(* theory -> (typ * int) list -> typ * int -> typ * int *)  | 
|
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
368  | 
fun repair_iterator_assign thy assigns (T as Type (_, Ts), k) =  | 
| 33192 | 369  | 
    (T, if T = @{typ bisim_iterator} then
 | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
370  | 
let  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
371  | 
val co_cards = map snd (filter (is_codatatype thy o fst) assigns)  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
372  | 
in Int.min (k, Integer.sum co_cards) end  | 
| 33192 | 373  | 
else if is_fp_iterator_type T then  | 
374  | 
case Ts of  | 
|
375  | 
[] => 1  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
376  | 
| _ => bounded_card_of_type k ~1 assigns (foldr1 HOLogic.mk_prodT Ts)  | 
| 33192 | 377  | 
else  | 
378  | 
k)  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
379  | 
| repair_iterator_assign _ _ assign = assign  | 
| 33192 | 380  | 
|
381  | 
(* row -> scope_desc -> scope_desc *)  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
382  | 
fun add_row_to_scope_descriptor (kind, ks) (card_assigns, max_assigns) =  | 
| 33192 | 383  | 
case kind of  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
384  | 
Card T => ((T, the_single ks) :: card_assigns, max_assigns)  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
385  | 
| Max x => (card_assigns, (x, the_single ks) :: max_assigns)  | 
| 33192 | 386  | 
(* block -> scope_desc *)  | 
387  | 
fun scope_descriptor_from_block block =  | 
|
388  | 
fold_rev add_row_to_scope_descriptor block ([], [])  | 
|
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
389  | 
(* hol_context -> bool -> block list -> int list -> scope_desc option *)  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
390  | 
fun scope_descriptor_from_combination (hol_ctxt as {thy, ...}) binarize blocks
 | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
391  | 
columns =  | 
| 33192 | 392  | 
let  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
393  | 
val (card_assigns, max_assigns) =  | 
| 33192 | 394  | 
maps project_block (columns ~~ blocks) |> scope_descriptor_from_block  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
395  | 
val card_assigns =  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
396  | 
repair_card_assigns hol_ctxt binarize (card_assigns, max_assigns) |> the  | 
| 33192 | 397  | 
in  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
398  | 
SOME (map (repair_iterator_assign thy card_assigns) card_assigns,  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
399  | 
max_assigns)  | 
| 33192 | 400  | 
end  | 
401  | 
handle Option.Option => NONE  | 
|
402  | 
||
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
403  | 
(* (typ * int) list -> dtype_spec list -> int Typtab.table *)  | 
| 
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
404  | 
fun offset_table_for_card_assigns assigns dtypes =  | 
| 33192 | 405  | 
let  | 
406  | 
(* int -> (int * int) list -> (typ * int) list -> int Typtab.table  | 
|
407  | 
-> int Typtab.table *)  | 
|
408  | 
fun aux next _ [] = Typtab.update_new (dummyT, next)  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
409  | 
| aux next reusable ((T, k) :: assigns) =  | 
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
410  | 
if k = 1 orelse is_iterator_type T orelse is_integer_type T  | 
| 
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
411  | 
orelse is_bit_type T then  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
412  | 
aux next reusable assigns  | 
| 33192 | 413  | 
else if length (these (Option.map #constrs (datatype_spec dtypes T)))  | 
414  | 
> 1 then  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
415  | 
Typtab.update_new (T, next) #> aux (next + k) reusable assigns  | 
| 33192 | 416  | 
else  | 
417  | 
case AList.lookup (op =) reusable k of  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
418  | 
SOME j0 => Typtab.update_new (T, j0) #> aux next reusable assigns  | 
| 33192 | 419  | 
| NONE => Typtab.update_new (T, next)  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
420  | 
#> aux (next + k) ((k, next) :: reusable) assigns  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
421  | 
in aux 0 [] assigns Typtab.empty end  | 
| 33192 | 422  | 
|
423  | 
(* int -> (typ * int) list -> typ -> int *)  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
424  | 
fun domain_card max card_assigns =  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
425  | 
Integer.prod o map (bounded_card_of_type max max card_assigns) o binder_types  | 
| 33192 | 426  | 
|
427  | 
(* scope_desc -> bool -> int -> (int -> int) -> int -> int -> bool * styp  | 
|
428  | 
-> constr_spec list -> constr_spec list *)  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
429  | 
fun add_constr_spec (card_assigns, max_assigns) co card sum_dom_cards  | 
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
430  | 
num_self_recs num_non_self_recs (self_rec, x as (_, T))  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
431  | 
constrs =  | 
| 33192 | 432  | 
let  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
433  | 
val max = constr_max max_assigns x  | 
| 33192 | 434  | 
(* unit -> int *)  | 
435  | 
fun next_delta () = if null constrs then 0 else #epsilon (hd constrs)  | 
|
436  | 
    val {delta, epsilon, exclusive, total} =
 | 
|
437  | 
if max = 0 then  | 
|
438  | 
let val delta = next_delta () in  | 
|
439  | 
          {delta = delta, epsilon = delta, exclusive = true, total = false}
 | 
|
440  | 
end  | 
|
441  | 
else if not co andalso num_self_recs > 0 then  | 
|
| 
35072
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
442  | 
(if num_self_recs = 1 andalso num_non_self_recs = 1 then  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
443  | 
if self_rec then  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
444  | 
case constrs of  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
445  | 
               [{delta = 0, epsilon = 1, exclusive = true, ...}] =>
 | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
446  | 
               {delta = 1, epsilon = card, exclusive = true, total = false}
 | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
447  | 
| _ => raise SAME ()  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
448  | 
else  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
449  | 
if domain_card 2 card_assigns T = 1 then  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
450  | 
               {delta = 0, epsilon = 1, exclusive = true, total = true}
 | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
451  | 
else  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
452  | 
raise SAME ()  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
453  | 
else  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
454  | 
raise SAME ())  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
455  | 
handle SAME () =>  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
456  | 
               {delta = 0, epsilon = card, exclusive = false, total = false}
 | 
| 33192 | 457  | 
else if card = sum_dom_cards (card + 1) then  | 
458  | 
let val delta = next_delta () in  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
459  | 
          {delta = delta, epsilon = delta + domain_card card card_assigns T,
 | 
| 33192 | 460  | 
exclusive = true, total = true}  | 
461  | 
end  | 
|
462  | 
else  | 
|
463  | 
        {delta = 0, epsilon = card,
 | 
|
464  | 
exclusive = (num_self_recs + num_non_self_recs = 1), total = false}  | 
|
465  | 
in  | 
|
466  | 
    {const = x, delta = delta, epsilon = epsilon, exclusive = exclusive,
 | 
|
467  | 
explicit_max = max, total = total} :: constrs  | 
|
468  | 
end  | 
|
469  | 
||
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
470  | 
(* hol_context -> bool -> typ list -> (typ * int) list -> typ -> bool *)  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
471  | 
fun has_exact_card hol_ctxt facto finitizable_dataTs card_assigns T =  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
472  | 
let val card = card_of_type card_assigns T in  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
473  | 
card = bounded_exact_card_of_type hol_ctxt  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
474  | 
(if facto then finitizable_dataTs else []) (card + 1) 0  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
475  | 
card_assigns T  | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
476  | 
end  | 
| 
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
477  | 
|
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
478  | 
(* hol_context -> bool -> typ list -> typ list -> scope_desc -> typ * int  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
479  | 
-> dtype_spec *)  | 
| 
35220
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
480  | 
fun datatype_spec_from_scope_descriptor (hol_ctxt as {thy, stds, ...}) binarize
 | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
481  | 
deep_dataTs finitizable_dataTs (desc as (card_assigns, _)) (T, card) =  | 
| 33192 | 482  | 
let  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34936 
diff
changeset
 | 
483  | 
val deep = member (op =) deep_dataTs T  | 
| 33192 | 484  | 
val co = is_codatatype thy T  | 
| 
35220
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
485  | 
val standard = is_standard_datatype thy stds T  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
486  | 
val xs = binarized_and_boxed_datatype_constrs hol_ctxt binarize T  | 
| 33192 | 487  | 
val self_recs = map (is_self_recursive_constr_type o snd) xs  | 
488  | 
val (num_self_recs, num_non_self_recs) =  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
489  | 
List.partition I self_recs |> pairself length  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
490  | 
(* bool -> bool *)  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
491  | 
fun is_complete facto =  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
492  | 
has_exact_card hol_ctxt facto finitizable_dataTs card_assigns T  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
493  | 
fun is_concrete facto =  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
494  | 
is_word_type T orelse  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
495  | 
xs |> maps (binder_types o snd) |> maps binder_types  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
496  | 
|> forall (has_exact_card hol_ctxt facto finitizable_dataTs  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
497  | 
card_assigns)  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
498  | 
val complete = pair_from_fun is_complete  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
499  | 
val concrete = pair_from_fun is_concrete  | 
| 33192 | 500  | 
(* int -> int *)  | 
501  | 
fun sum_dom_cards max =  | 
|
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
502  | 
map (domain_card max card_assigns o snd) xs |> Integer.sum  | 
| 33192 | 503  | 
val constrs =  | 
504  | 
fold_rev (add_constr_spec desc co card sum_dom_cards num_self_recs  | 
|
| 
35072
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
505  | 
num_non_self_recs)  | 
| 
 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 
blanchet 
parents: 
35071 
diff
changeset
 | 
506  | 
(sort (bool_ord o swap o pairself fst) (self_recs ~~ xs)) []  | 
| 
33558
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33232 
diff
changeset
 | 
507  | 
in  | 
| 
35179
 
4b198af5beb5
redo Nitpick's nonstandard values as cyclic values (instead of additional constructors)
 
blanchet 
parents: 
35178 
diff
changeset
 | 
508  | 
    {typ = T, card = card, co = co, standard = standard, complete = complete,
 | 
| 
 
4b198af5beb5
redo Nitpick's nonstandard values as cyclic values (instead of additional constructors)
 
blanchet 
parents: 
35178 
diff
changeset
 | 
509  | 
concrete = concrete, deep = deep, constrs = constrs}  | 
| 
33558
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33232 
diff
changeset
 | 
510  | 
end  | 
| 33192 | 511  | 
|
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
512  | 
(* hol_context -> bool -> int -> typ list -> typ list -> scope_desc -> scope *)  | 
| 
35220
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
513  | 
fun scope_from_descriptor (hol_ctxt as {thy, stds, ...}) binarize sym_break
 | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
514  | 
deep_dataTs finitizable_dataTs  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
515  | 
(desc as (card_assigns, _)) =  | 
| 33192 | 516  | 
let  | 
| 
33558
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33232 
diff
changeset
 | 
517  | 
val datatypes =  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
518  | 
map (datatype_spec_from_scope_descriptor hol_ctxt binarize deep_dataTs  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
519  | 
finitizable_dataTs desc)  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
520  | 
(filter (is_datatype thy stds o fst) card_assigns)  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
521  | 
    val bits = card_of_type card_assigns @{typ signed_bit} - 1
 | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
522  | 
               handle TYPE ("Nitpick_HOL.card_of_type", _, _) =>
 | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
523  | 
                      card_of_type card_assigns @{typ unsigned_bit}
 | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
524  | 
                      handle TYPE ("Nitpick_HOL.card_of_type", _, _) => 0
 | 
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
525  | 
    val bisim_depth = card_of_type card_assigns @{typ bisim_iterator} - 1
 | 
| 33192 | 526  | 
in  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
527  | 
    {hol_ctxt = hol_ctxt, binarize = binarize, card_assigns = card_assigns,
 | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
528  | 
datatypes = datatypes, bits = bits, bisim_depth = bisim_depth,  | 
| 33192 | 529  | 
ofs = if sym_break <= 0 then Typtab.empty  | 
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
530  | 
else offset_table_for_card_assigns card_assigns datatypes}  | 
| 33192 | 531  | 
end  | 
532  | 
||
533  | 
(* theory -> typ list -> (typ option * int list) list  | 
|
534  | 
-> (typ option * int list) list *)  | 
|
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
535  | 
fun repair_cards_assigns_wrt_boxing_etc _ _ [] = []  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
536  | 
| repair_cards_assigns_wrt_boxing_etc thy Ts ((SOME T, ks) :: cards_assigns) =  | 
| 33192 | 537  | 
(if is_fun_type T orelse is_pair_type T then  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
538  | 
Ts |> filter (curry (type_match thy o swap) T) |> map (rpair ks o SOME)  | 
| 33192 | 539  | 
else  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
540  | 
[(SOME T, ks)]) @  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
541  | 
repair_cards_assigns_wrt_boxing_etc thy Ts cards_assigns  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
542  | 
| repair_cards_assigns_wrt_boxing_etc thy Ts ((NONE, ks) :: cards_assigns) =  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
543  | 
(NONE, ks) :: repair_cards_assigns_wrt_boxing_etc thy Ts cards_assigns  | 
| 33192 | 544  | 
|
| 
33580
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33558 
diff
changeset
 | 
545  | 
val max_scopes = 4096  | 
| 33192 | 546  | 
val distinct_threshold = 512  | 
547  | 
||
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
548  | 
(* hol_context -> bool -> int -> (typ option * int list) list  | 
| 33192 | 549  | 
-> (styp option * int list) list -> (styp option * int list) list -> int list  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
550  | 
-> typ list -> typ list -> typ list ->typ list -> int * scope list *)  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
551  | 
fun all_scopes (hol_ctxt as {thy, ...}) binarize sym_break cards_assigns
 | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
552  | 
maxes_assigns iters_assigns bitss bisim_depths mono_Ts nonmono_Ts  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
553  | 
deep_dataTs finitizable_dataTs =  | 
| 33192 | 554  | 
let  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
555  | 
val cards_assigns = repair_cards_assigns_wrt_boxing_etc thy mono_Ts  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35385 
diff
changeset
 | 
556  | 
cards_assigns  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
557  | 
val blocks = blocks_for_types hol_ctxt binarize cards_assigns maxes_assigns  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
558  | 
iters_assigns bitss bisim_depths mono_Ts  | 
| 
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
559  | 
nonmono_Ts  | 
| 33192 | 560  | 
val ranks = map rank_of_block blocks  | 
| 
33580
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33558 
diff
changeset
 | 
561  | 
val all = all_combinations_ordered_smartly (map (rpair 0) ranks)  | 
| 33957 | 562  | 
val head = take max_scopes all  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
563  | 
val descs =  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
564  | 
map_filter (scope_descriptor_from_combination hol_ctxt binarize blocks)  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
565  | 
head  | 
| 33192 | 566  | 
in  | 
| 
33580
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33558 
diff
changeset
 | 
567  | 
(length all - length head,  | 
| 
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33558 
diff
changeset
 | 
568  | 
descs |> length descs <= distinct_threshold ? distinct (op =)  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35179 
diff
changeset
 | 
569  | 
|> map (scope_from_descriptor hol_ctxt binarize sym_break  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
570  | 
deep_dataTs finitizable_dataTs))  | 
| 33192 | 571  | 
end  | 
572  | 
||
573  | 
end;  |