| author | kuncar | 
| Tue, 09 Oct 2012 16:58:36 +0200 | |
| changeset 49758 | 718f10c8bbfc | 
| parent 49358 | 0fa351b1bd14 | 
| child 50163 | c62ce309dc26 | 
| permissions | -rw-r--r-- | 
| 33982 | 1  | 
(* Title: HOL/Tools/Nitpick/nitpick.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: 
34938 
diff
changeset
 | 
3  | 
Copyright 2008, 2009, 2010  | 
| 33192 | 4  | 
|
5  | 
Finite model generation for HOL formulas using Kodkod.  | 
|
6  | 
*)  | 
|
7  | 
||
8  | 
signature NITPICK =  | 
|
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  | 
| 
35711
 
548d3f16404b
added term postprocessor to Nitpick, to provide custom syntax for typedefs
 
blanchet 
parents: 
35696 
diff
changeset
 | 
11  | 
type term_postprocessor = Nitpick_Model.term_postprocessor  | 
| 43022 | 12  | 
|
| 47560 | 13  | 
datatype mode = Auto_Try | Try | Normal | TPTP  | 
| 43022 | 14  | 
|
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
15  | 
type params =  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
16  | 
    {cards_assigns: (typ option * int list) list,
 | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
17  | 
maxes_assigns: (styp option * int list) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
18  | 
iters_assigns: (styp option * int list) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
19  | 
bitss: int list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
20  | 
bisim_depths: int list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
21  | 
boxes: (typ option * bool option) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
22  | 
finitizes: (typ option * bool option) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
23  | 
monos: (typ option * bool option) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
24  | 
stds: (typ option * bool) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
25  | 
wfs: (styp option * bool option) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
26  | 
sat_solver: string,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
27  | 
blocking: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
28  | 
falsify: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
29  | 
debug: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
30  | 
verbose: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
31  | 
overlord: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
32  | 
user_axioms: bool option,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
33  | 
assms: bool,  | 
| 38209 | 34  | 
whacks: term list,  | 
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
35  | 
merge_type_vars: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
36  | 
binary_ints: bool option,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
37  | 
destroy_constrs: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
38  | 
specialize: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
39  | 
star_linear_preds: bool,  | 
| 41856 | 40  | 
total_consts: bool option,  | 
| 41876 | 41  | 
needs: term list option,  | 
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
42  | 
peephole_optim: bool,  | 
| 38124 | 43  | 
datatype_sym_break: int,  | 
44  | 
kodkod_sym_break: int,  | 
|
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
45  | 
timeout: Time.time option,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
46  | 
tac_timeout: Time.time option,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
47  | 
max_threads: int,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
48  | 
show_datatypes: bool,  | 
| 
41993
 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 
blanchet 
parents: 
41992 
diff
changeset
 | 
49  | 
show_skolems: bool,  | 
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
50  | 
show_consts: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
51  | 
evals: term list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
52  | 
formats: (term option * int list) list,  | 
| 
37260
 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 
blanchet 
parents: 
37257 
diff
changeset
 | 
53  | 
atomss: (typ option * string list) list,  | 
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
54  | 
max_potential: int,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
55  | 
max_genuine: int,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
56  | 
check_potential: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
57  | 
check_genuine: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
58  | 
batch_size: int,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
59  | 
expect: string}  | 
| 33192 | 60  | 
|
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
61  | 
val genuineN : string  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
62  | 
val quasi_genuineN : string  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
63  | 
val potentialN : string  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
64  | 
val noneN : string  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
65  | 
val unknownN : string  | 
| 33192 | 66  | 
val register_frac_type : string -> (string * string) list -> theory -> theory  | 
67  | 
val unregister_frac_type : string -> theory -> theory  | 
|
68  | 
val register_codatatype : typ -> string -> styp list -> theory -> theory  | 
|
69  | 
val unregister_codatatype : typ -> theory -> theory  | 
|
| 
35711
 
548d3f16404b
added term postprocessor to Nitpick, to provide custom syntax for typedefs
 
blanchet 
parents: 
35696 
diff
changeset
 | 
70  | 
val register_term_postprocessor :  | 
| 
 
548d3f16404b
added term postprocessor to Nitpick, to provide custom syntax for typedefs
 
blanchet 
parents: 
35696 
diff
changeset
 | 
71  | 
typ -> term_postprocessor -> theory -> theory  | 
| 
 
548d3f16404b
added term postprocessor to Nitpick, to provide custom syntax for typedefs
 
blanchet 
parents: 
35696 
diff
changeset
 | 
72  | 
val unregister_term_postprocessor : typ -> theory -> theory  | 
| 33192 | 73  | 
val pick_nits_in_term :  | 
| 43022 | 74  | 
Proof.state -> params -> mode -> int -> int -> int -> (term * term) list  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
75  | 
-> term list -> term list -> term -> string * Proof.state  | 
| 33192 | 76  | 
val pick_nits_in_subgoal :  | 
| 43022 | 77  | 
Proof.state -> params -> mode -> int -> int -> string * Proof.state  | 
| 33192 | 78  | 
end;  | 
79  | 
||
80  | 
structure Nitpick : NITPICK =  | 
|
81  | 
struct  | 
|
82  | 
||
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
83  | 
open Nitpick_Util  | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
84  | 
open Nitpick_HOL  | 
| 
35070
 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 
blanchet 
parents: 
34998 
diff
changeset
 | 
85  | 
open Nitpick_Preproc  | 
| 
33232
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
86  | 
open Nitpick_Mono  | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
87  | 
open Nitpick_Scope  | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
88  | 
open Nitpick_Peephole  | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
89  | 
open Nitpick_Rep  | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
90  | 
open Nitpick_Nut  | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
91  | 
open Nitpick_Kodkod  | 
| 
 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 
blanchet 
parents: 
33192 
diff
changeset
 | 
92  | 
open Nitpick_Model  | 
| 33192 | 93  | 
|
| 34126 | 94  | 
structure KK = Kodkod  | 
95  | 
||
| 47560 | 96  | 
datatype mode = Auto_Try | Try | Normal | TPTP  | 
97  | 
||
98  | 
fun is_mode_nt mode = (mode = Normal orelse mode = TPTP)  | 
|
| 43022 | 99  | 
|
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
100  | 
type params =  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
101  | 
  {cards_assigns: (typ option * int list) list,
 | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
102  | 
maxes_assigns: (styp option * int list) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
103  | 
iters_assigns: (styp option * int list) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
104  | 
bitss: int list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
105  | 
bisim_depths: int list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
106  | 
boxes: (typ option * bool option) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
107  | 
finitizes: (typ option * bool option) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
108  | 
monos: (typ option * bool option) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
109  | 
stds: (typ option * bool) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
110  | 
wfs: (styp option * bool option) list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
111  | 
sat_solver: string,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
112  | 
blocking: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
113  | 
falsify: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
114  | 
debug: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
115  | 
verbose: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
116  | 
overlord: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
117  | 
user_axioms: bool option,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
118  | 
assms: bool,  | 
| 38209 | 119  | 
whacks: term list,  | 
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
120  | 
merge_type_vars: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
121  | 
binary_ints: bool option,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
122  | 
destroy_constrs: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
123  | 
specialize: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
124  | 
star_linear_preds: bool,  | 
| 41856 | 125  | 
total_consts: bool option,  | 
| 41876 | 126  | 
needs: term list option,  | 
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
127  | 
peephole_optim: bool,  | 
| 38124 | 128  | 
datatype_sym_break: int,  | 
129  | 
kodkod_sym_break: int,  | 
|
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
130  | 
timeout: Time.time option,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
131  | 
tac_timeout: Time.time option,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
132  | 
max_threads: int,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
133  | 
show_datatypes: bool,  | 
| 
41993
 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 
blanchet 
parents: 
41992 
diff
changeset
 | 
134  | 
show_skolems: bool,  | 
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
135  | 
show_consts: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
136  | 
evals: term list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
137  | 
formats: (term option * int list) list,  | 
| 
37260
 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 
blanchet 
parents: 
37257 
diff
changeset
 | 
138  | 
atomss: (typ option * string list) list,  | 
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
139  | 
max_potential: int,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
140  | 
max_genuine: int,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
141  | 
check_potential: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
142  | 
check_genuine: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
143  | 
batch_size: int,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
144  | 
expect: string}  | 
| 33192 | 145  | 
|
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
146  | 
val genuineN = "genuine"  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
147  | 
val quasi_genuineN = "quasi_genuine"  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
148  | 
val potentialN = "potential"  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
149  | 
val noneN = "none"  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
150  | 
val unknownN = "unknown"  | 
| 
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
151  | 
|
| 
38240
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
152  | 
(* TODO: eliminate these historical aliases *)  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
153  | 
val register_frac_type = Nitpick_HOL.register_frac_type_global  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
154  | 
val unregister_frac_type = Nitpick_HOL.unregister_frac_type_global  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
155  | 
val register_codatatype = Nitpick_HOL.register_codatatype_global  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
156  | 
val unregister_codatatype = Nitpick_HOL.unregister_codatatype_global  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
157  | 
val register_term_postprocessor =  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
158  | 
Nitpick_Model.register_term_postprocessor_global  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
159  | 
val unregister_term_postprocessor =  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
160  | 
Nitpick_Model.unregister_term_postprocessor_global  | 
| 
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
161  | 
|
| 
36390
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
162  | 
type problem_extension =  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
163  | 
  {free_names: nut list,
 | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
164  | 
sel_names: nut list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
165  | 
nonsel_names: nut list,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
166  | 
rel_table: nut NameTable.table,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
167  | 
unsound: bool,  | 
| 
 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 
blanchet 
parents: 
36389 
diff
changeset
 | 
168  | 
scope: scope}  | 
| 
39316
 
b6c4385ab400
change defaults of Auto Nitpick so that it consumes less resources (time and Kodkod threads)
 
blanchet 
parents: 
38857 
diff
changeset
 | 
169  | 
|
| 34126 | 170  | 
type rich_problem = KK.problem * problem_extension  | 
| 33192 | 171  | 
|
172  | 
fun pretties_for_formulas _ _ [] = []  | 
|
173  | 
| pretties_for_formulas ctxt s ts =  | 
|
174  | 
[Pretty.str (s ^ plural_s_for_list ts ^ ":"),  | 
|
175  | 
Pretty.indent indent_size (Pretty.chunks  | 
|
176  | 
(map2 (fn j => fn t =>  | 
|
| 
34121
 
5e831d805118
get rid of polymorphic equality in Nitpick's code + a few minor cleanups
 
blanchet 
parents: 
34039 
diff
changeset
 | 
177  | 
Pretty.block [t |> shorten_names_in_term  | 
| 33192 | 178  | 
|> Syntax.pretty_term ctxt,  | 
179  | 
Pretty.str (if j = 1 then "." else ";")])  | 
|
180  | 
(length ts downto 1) ts))]  | 
|
181  | 
||
| 49024 | 182  | 
val isabelle_wrong_message =  | 
183  | 
"Something appears to be wrong with your Isabelle installation."  | 
|
184  | 
fun java_not_found_message () =  | 
|
185  | 
"Java could not be launched. " ^ isabelle_wrong_message  | 
|
186  | 
fun java_too_old_message () =  | 
|
187  | 
"The Java version is too old. " ^ isabelle_wrong_message  | 
|
188  | 
fun kodkodi_not_installed_message () =  | 
|
| 
33568
 
532b915afa14
don't run Nitpick at all if Kodkodi is not installed (as indicated by the $KODKODI variable)
 
blanchet 
parents: 
33566 
diff
changeset
 | 
189  | 
"Nitpick requires the external Java program Kodkodi. To install it, download \  | 
| 46243 | 190  | 
\the package from \"http://www21.in.tum.de/~blanchet/#software\" and add the \  | 
191  | 
\\"kodkodi-x.y.z\" directory's full path to " ^  | 
|
| 43602 | 192  | 
Path.print (Path.expand (Path.explode "$ISABELLE_HOME_USER/etc/components")) ^  | 
193  | 
" on a line of its own."  | 
|
| 
33568
 
532b915afa14
don't run Nitpick at all if Kodkodi is not installed (as indicated by the $KODKODI variable)
 
blanchet 
parents: 
33566 
diff
changeset
 | 
194  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
195  | 
val max_unsound_delay_ms = 200  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
196  | 
val max_unsound_delay_percent = 2  | 
| 33192 | 197  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
198  | 
fun unsound_delay_for_timeout NONE = max_unsound_delay_ms  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
199  | 
| unsound_delay_for_timeout (SOME timeout) =  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
200  | 
Int.max (0, Int.min (max_unsound_delay_ms,  | 
| 33192 | 201  | 
Time.toMilliseconds timeout  | 
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
202  | 
* max_unsound_delay_percent div 100))  | 
| 33192 | 203  | 
|
204  | 
fun passed_deadline NONE = false  | 
|
205  | 
| passed_deadline (SOME time) = Time.compare (Time.now (), time) <> LESS  | 
|
206  | 
||
| 
34123
 
c4988215a691
distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
 
blanchet 
parents: 
34121 
diff
changeset
 | 
207  | 
fun none_true assigns = forall (not_equal (SOME true) o snd) assigns  | 
| 33192 | 208  | 
|
| 
41048
 
d5ebe94248ad
added a hint when the user obviously just forgot a colon after the lemma's name
 
blanchet 
parents: 
41007 
diff
changeset
 | 
209  | 
fun has_lonely_bool_var (@{const Pure.conjunction}
 | 
| 
 
d5ebe94248ad
added a hint when the user obviously just forgot a colon after the lemma's name
 
blanchet 
parents: 
41007 
diff
changeset
 | 
210  | 
                         $ (@{const Trueprop} $ Free _) $ _) = true
 | 
| 
 
d5ebe94248ad
added a hint when the user obviously just forgot a colon after the lemma's name
 
blanchet 
parents: 
41007 
diff
changeset
 | 
211  | 
| has_lonely_bool_var _ = false  | 
| 
 
d5ebe94248ad
added a hint when the user obviously just forgot a colon after the lemma's name
 
blanchet 
parents: 
41007 
diff
changeset
 | 
212  | 
|
| 
34038
 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 
blanchet 
parents: 
33982 
diff
changeset
 | 
213  | 
val syntactic_sorts =  | 
| 
38857
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38517 
diff
changeset
 | 
214  | 
  @{sort "{default,zero,one,plus,minus,uminus,times,inverse,abs,sgn,ord,equal}"} @
 | 
| 
47108
 
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
 
huffman 
parents: 
46243 
diff
changeset
 | 
215  | 
  @{sort numeral}
 | 
| 
34038
 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 
blanchet 
parents: 
33982 
diff
changeset
 | 
216  | 
fun has_tfree_syntactic_sort (TFree (_, S as _ :: _)) =  | 
| 
 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 
blanchet 
parents: 
33982 
diff
changeset
 | 
217  | 
subset (op =) (S, syntactic_sorts)  | 
| 
 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 
blanchet 
parents: 
33982 
diff
changeset
 | 
218  | 
| has_tfree_syntactic_sort _ = false  | 
| 
 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 
blanchet 
parents: 
33982 
diff
changeset
 | 
219  | 
val has_syntactic_sorts = exists_type (exists_subtype has_tfree_syntactic_sort)  | 
| 33192 | 220  | 
|
| 
33568
 
532b915afa14
don't run Nitpick at all if Kodkodi is not installed (as indicated by the $KODKODI variable)
 
blanchet 
parents: 
33566 
diff
changeset
 | 
221  | 
fun plazy f = Pretty.blk (0, pstrs (f ()))  | 
| 
 
532b915afa14
don't run Nitpick at all if Kodkodi is not installed (as indicated by the $KODKODI variable)
 
blanchet 
parents: 
33566 
diff
changeset
 | 
222  | 
|
| 43022 | 223  | 
fun pick_them_nits_in_term deadline state (params : params) mode i n step  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
224  | 
subst def_assm_ts nondef_assm_ts orig_t =  | 
| 33192 | 225  | 
let  | 
226  | 
val timer = Timer.startRealTimer ()  | 
|
| 
34935
 
cb011ba38950
removed the Nitpick code that loaded the "Nitpick" theory explicitly if it's not already loaded, because this didn't work properly and is of doubtful value
 
blanchet 
parents: 
34126 
diff
changeset
 | 
227  | 
val thy = Proof.theory_of state  | 
| 
 
cb011ba38950
removed the Nitpick code that loaded the "Nitpick" theory explicitly if it's not already loaded, because this didn't work properly and is of doubtful value
 
blanchet 
parents: 
34126 
diff
changeset
 | 
228  | 
val ctxt = Proof.context_of state  | 
| 
35386
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
229  | 
(* FIXME: reintroduce code before new release:  | 
| 
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
230  | 
|
| 
37216
 
3165bc303f66
modernized some structure names, keeping a few legacy aliases;
 
wenzelm 
parents: 
37213 
diff
changeset
 | 
231  | 
val nitpick_thy = Thy_Info.get_theory "Nitpick"  | 
| 
34936
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
232  | 
val _ = Theory.subthy (nitpick_thy, thy) orelse  | 
| 
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
233  | 
error "You must import the theory \"Nitpick\" to use Nitpick"  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
234  | 
*)  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
235  | 
    val {cards_assigns, maxes_assigns, iters_assigns, bitss, bisim_depths,
 | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
236  | 
boxes, finitizes, monos, stds, wfs, sat_solver, falsify, debug,  | 
| 38209 | 237  | 
verbose, overlord, user_axioms, assms, whacks, merge_type_vars,  | 
238  | 
binary_ints, destroy_constrs, specialize, star_linear_preds,  | 
|
| 41875 | 239  | 
total_consts, needs, peephole_optim, datatype_sym_break,  | 
| 41856 | 240  | 
kodkod_sym_break, tac_timeout, max_threads, show_datatypes,  | 
| 
41993
 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 
blanchet 
parents: 
41992 
diff
changeset
 | 
241  | 
show_skolems, show_consts, evals, formats, atomss, max_potential,  | 
| 
 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 
blanchet 
parents: 
41992 
diff
changeset
 | 
242  | 
max_genuine, check_potential, check_genuine, batch_size, ...} = params  | 
| 33192 | 243  | 
val state_ref = Unsynchronized.ref state  | 
| 46086 | 244  | 
fun pprint print =  | 
| 43022 | 245  | 
if mode = Auto_Try then  | 
| 33192 | 246  | 
Unsynchronized.change state_ref o Proof.goal_message o K  | 
| 
33561
 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 
blanchet 
parents: 
33558 
diff
changeset
 | 
247  | 
o Pretty.chunks o cons (Pretty.str "") o single  | 
| 49358 | 248  | 
o Pretty.mark Isabelle_Markup.intensify  | 
| 33192 | 249  | 
else  | 
| 46086 | 250  | 
print o Pretty.string_of  | 
| 47559 | 251  | 
val pprint_a = pprint Output.urgent_message  | 
| 47560 | 252  | 
fun pprint_nt f = () |> is_mode_nt mode ? pprint Output.urgent_message o f  | 
| 46086 | 253  | 
fun pprint_v f = () |> verbose ? pprint Output.urgent_message o f  | 
254  | 
fun pprint_d f = () |> debug ? pprint tracing o f  | 
|
255  | 
val print = pprint Output.urgent_message o curry Pretty.blk 0 o pstrs  | 
|
| 47560 | 256  | 
fun print_t f = () |> mode = TPTP ? print o f  | 
| 39345 | 257  | 
(*  | 
| 46086 | 258  | 
val print_g = pprint tracing o Pretty.str  | 
| 39345 | 259  | 
*)  | 
| 47560 | 260  | 
val print_nt = pprint_nt o K o plazy  | 
| 
33568
 
532b915afa14
don't run Nitpick at all if Kodkodi is not installed (as indicated by the $KODKODI variable)
 
blanchet 
parents: 
33566 
diff
changeset
 | 
261  | 
val print_v = pprint_v o K o plazy  | 
| 33192 | 262  | 
|
263  | 
fun check_deadline () =  | 
|
| 
41051
 
2ed1b971fc20
give the inner timeout mechanism a chance, since it gives more precise information to the user
 
blanchet 
parents: 
41048 
diff
changeset
 | 
264  | 
if passed_deadline deadline then raise TimeLimit.TimeOut else ()  | 
| 33192 | 265  | 
|
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
266  | 
val (def_assm_ts, nondef_assm_ts) =  | 
| 
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
267  | 
if assms orelse mode <> Normal then (def_assm_ts, nondef_assm_ts)  | 
| 
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
268  | 
else ([], [])  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
269  | 
val _ =  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
270  | 
if step = 0 then  | 
| 47560 | 271  | 
print_nt (fn () => "Nitpicking formula...")  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
272  | 
else  | 
| 47560 | 273  | 
pprint_nt (fn () => Pretty.chunks (  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
274  | 
            pretties_for_formulas ctxt ("Nitpicking " ^
 | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
275  | 
(if i <> 1 orelse n <> 1 then  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
276  | 
"subgoal " ^ string_of_int i ^ " of " ^ string_of_int n  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
277  | 
else  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
278  | 
"goal")) [Logic.list_implies (nondef_assm_ts, orig_t)]))  | 
| 
41278
 
8e1cde88aae6
added a timestamp to Nitpick in verbose mode for debugging purposes;
 
blanchet 
parents: 
41052 
diff
changeset
 | 
279  | 
val _ = print_v (enclose "Timestamp: " "." o Date.fmt "%H:%M:%S"  | 
| 
 
8e1cde88aae6
added a timestamp to Nitpick in verbose mode for debugging purposes;
 
blanchet 
parents: 
41052 
diff
changeset
 | 
280  | 
o Date.fromTimeLocal o Time.now)  | 
| 33192 | 281  | 
    val neg_t = if falsify then Logic.mk_implies (orig_t, @{prop False})
 | 
282  | 
else orig_t  | 
|
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
283  | 
val conj_ts = neg_t :: def_assm_ts @ nondef_assm_ts @ evals @ these needs  | 
| 
38169
 
b51784515471
optimize local "def"s by treating them as definitions
 
blanchet 
parents: 
38126 
diff
changeset
 | 
284  | 
val tfree_table =  | 
| 
41869
 
9e367f1c9570
robust handling of types occurring in "eval" and "preconstr" options but not in the goal
 
blanchet 
parents: 
41868 
diff
changeset
 | 
285  | 
if merge_type_vars then merged_type_var_table_for_terms thy conj_ts  | 
| 
 
9e367f1c9570
robust handling of types occurring in "eval" and "preconstr" options but not in the goal
 
blanchet 
parents: 
41868 
diff
changeset
 | 
286  | 
else []  | 
| 
 
9e367f1c9570
robust handling of types occurring in "eval" and "preconstr" options but not in the goal
 
blanchet 
parents: 
41868 
diff
changeset
 | 
287  | 
val merge_tfrees = merge_type_vars_in_term thy merge_type_vars tfree_table  | 
| 
 
9e367f1c9570
robust handling of types occurring in "eval" and "preconstr" options but not in the goal
 
blanchet 
parents: 
41868 
diff
changeset
 | 
288  | 
val neg_t = neg_t |> merge_tfrees  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
289  | 
val def_assm_ts = def_assm_ts |> map merge_tfrees  | 
| 
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
290  | 
val nondef_assm_ts = nondef_assm_ts |> map merge_tfrees  | 
| 
41869
 
9e367f1c9570
robust handling of types occurring in "eval" and "preconstr" options but not in the goal
 
blanchet 
parents: 
41868 
diff
changeset
 | 
291  | 
val evals = evals |> map merge_tfrees  | 
| 41876 | 292  | 
val needs = needs |> Option.map (map merge_tfrees)  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
293  | 
val conj_ts = neg_t :: def_assm_ts @ nondef_assm_ts @ evals @ these needs  | 
| 33192 | 294  | 
val original_max_potential = max_potential  | 
295  | 
val original_max_genuine = max_genuine  | 
|
296  | 
val max_bisim_depth = fold Integer.max bisim_depths ~1  | 
|
| 
38240
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
297  | 
val case_names = case_const_names ctxt stds  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
298  | 
val defs = def_assm_ts @ all_defs_of thy subst  | 
| 
42415
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
299  | 
val nondefs = all_nondefs_of ctxt subst  | 
| 
41791
 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 
blanchet 
parents: 
41789 
diff
changeset
 | 
300  | 
val def_tables = const_def_tables ctxt subst defs  | 
| 
42415
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
301  | 
val nondef_table = const_nondef_table nondefs  | 
| 35335 | 302  | 
val simp_table = Unsynchronized.ref (const_simp_table ctxt subst)  | 
303  | 
val psimp_table = const_psimp_table ctxt subst  | 
|
| 
35807
 
e4d1b5cbd429
added support for "specification" and "ax_specification" constructs to Nitpick
 
blanchet 
parents: 
35711 
diff
changeset
 | 
304  | 
val choice_spec_table = const_choice_spec_table ctxt subst  | 
| 
42415
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
305  | 
val nondefs =  | 
| 
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
306  | 
nondefs |> filter_out (is_choice_spec_axiom thy choice_spec_table)  | 
| 
41791
 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 
blanchet 
parents: 
41789 
diff
changeset
 | 
307  | 
val intro_table = inductive_intro_table ctxt subst def_tables  | 
| 33192 | 308  | 
val ground_thm_table = ground_theorem_table thy  | 
| 
38240
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
309  | 
val ersatz_table = ersatz_table ctxt  | 
| 
41007
 
75275c796b46
use ML SAT solvers up to a certain time limit, then switch to faster solvers with a timeout -- this becomes necessary with the new, more powerful monotonicity calculus
 
blanchet 
parents: 
41001 
diff
changeset
 | 
310  | 
    val hol_ctxt as {wf_cache, ...} =
 | 
| 33192 | 311  | 
      {thy = thy, ctxt = ctxt, max_bisim_depth = max_bisim_depth, boxes = boxes,
 | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
312  | 
stds = stds, wfs = wfs, user_axioms = user_axioms, debug = debug,  | 
| 38209 | 313  | 
whacks = whacks, binary_ints = binary_ints,  | 
314  | 
destroy_constrs = destroy_constrs, specialize = specialize,  | 
|
| 
41871
 
394eef237bd1
lower threshold for implicitly using "nitpick_simp" for predicate definitions when "total_consts" is on
 
blanchet 
parents: 
41869 
diff
changeset
 | 
315  | 
star_linear_preds = star_linear_preds, total_consts = total_consts,  | 
| 41875 | 316  | 
needs = needs, tac_timeout = tac_timeout, evals = evals,  | 
| 
41871
 
394eef237bd1
lower threshold for implicitly using "nitpick_simp" for predicate definitions when "total_consts" is on
 
blanchet 
parents: 
41869 
diff
changeset
 | 
317  | 
case_names = case_names, def_tables = def_tables,  | 
| 
42415
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
318  | 
nondef_table = nondef_table, nondefs = nondefs, simp_table = simp_table,  | 
| 
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
319  | 
psimp_table = psimp_table, choice_spec_table = choice_spec_table,  | 
| 
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
320  | 
intro_table = intro_table, ground_thm_table = ground_thm_table,  | 
| 
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
321  | 
ersatz_table = ersatz_table, skolems = Unsynchronized.ref [],  | 
| 
 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 
blanchet 
parents: 
42361 
diff
changeset
 | 
322  | 
special_funs = Unsynchronized.ref [],  | 
| 
33580
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33568 
diff
changeset
 | 
323  | 
unrolled_preds = Unsynchronized.ref [], wf_cache = Unsynchronized.ref [],  | 
| 
 
45c33e97cb86
added datatype constructor cache in Nitpick (to speed up the scope enumeration) and never test more than 4096 scopes
 
blanchet 
parents: 
33568 
diff
changeset
 | 
324  | 
constr_cache = Unsynchronized.ref []}  | 
| 
41789
 
7c7b68b06c1a
don't distinguish between "fixes" and other free variables -- this confuses users
 
blanchet 
parents: 
41772 
diff
changeset
 | 
325  | 
val pseudo_frees = []  | 
| 
41869
 
9e367f1c9570
robust handling of types occurring in "eval" and "preconstr" options but not in the goal
 
blanchet 
parents: 
41868 
diff
changeset
 | 
326  | 
val real_frees = fold Term.add_frees conj_ts []  | 
| 
 
9e367f1c9570
robust handling of types occurring in "eval" and "preconstr" options but not in the goal
 
blanchet 
parents: 
41868 
diff
changeset
 | 
327  | 
val _ = null (fold Term.add_tvars conj_ts []) orelse  | 
| 
 
9e367f1c9570
robust handling of types occurring in "eval" and "preconstr" options but not in the goal
 
blanchet 
parents: 
41868 
diff
changeset
 | 
328  | 
error "Nitpick cannot handle goals with schematic type variables."  | 
| 41875 | 329  | 
val (nondef_ts, def_ts, need_ts, got_all_mono_user_axioms,  | 
| 
41803
 
ef13e3b7cbaf
more work on "fix_datatype_vals" optimization (renamed "preconstruct")
 
blanchet 
parents: 
41802 
diff
changeset
 | 
330  | 
no_poly_user_axioms, binarize) =  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
331  | 
preprocess_formulas hol_ctxt nondef_assm_ts neg_t  | 
| 33192 | 332  | 
val got_all_user_axioms =  | 
333  | 
got_all_mono_user_axioms andalso no_poly_user_axioms  | 
|
334  | 
||
335  | 
fun print_wf (x, (gfp, wf)) =  | 
|
| 47560 | 336  | 
pprint_nt (fn () => Pretty.blk (0,  | 
| 33192 | 337  | 
          pstrs ("The " ^ (if gfp then "co" else "") ^ "inductive predicate \"")
 | 
338  | 
@ Syntax.pretty_term ctxt (Const x) ::  | 
|
339  | 
pstrs (if wf then  | 
|
340  | 
"\" was proved well-founded. Nitpick can compute it \  | 
|
341  | 
\efficiently."  | 
|
342  | 
else  | 
|
343  | 
"\" could not be proved well-founded. Nitpick might need to \  | 
|
344  | 
\unroll it.")))  | 
|
345  | 
val _ = if verbose then List.app print_wf (!wf_cache) else ()  | 
|
| 
38171
 
5f2ea92319e0
fix soundness bug w.r.t. "Suc" with "binary_ints"
 
blanchet 
parents: 
38170 
diff
changeset
 | 
346  | 
val das_wort_formula = if falsify then "Negated conjecture" else "Formula"  | 
| 33192 | 347  | 
val _ =  | 
| 
35386
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
348  | 
pprint_d (fn () => Pretty.chunks  | 
| 
38171
 
5f2ea92319e0
fix soundness bug w.r.t. "Suc" with "binary_ints"
 
blanchet 
parents: 
38170 
diff
changeset
 | 
349  | 
(pretties_for_formulas ctxt das_wort_formula [hd nondef_ts] @  | 
| 
35386
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
350  | 
pretties_for_formulas ctxt "Relevant definitional axiom" def_ts @  | 
| 
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
351  | 
pretties_for_formulas ctxt "Relevant nondefinitional axiom"  | 
| 
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
352  | 
(tl nondef_ts)))  | 
| 
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
353  | 
val _ = List.app (ignore o Term.type_of) (nondef_ts @ def_ts)  | 
| 33192 | 354  | 
handle TYPE (_, Ts, ts) =>  | 
355  | 
                   raise TYPE ("Nitpick.pick_them_nits_in_term", Ts, ts)
 | 
|
356  | 
||
| 
41801
 
ed77524f3429
first steps in implementing "fix_datatype_vals" optimization
 
blanchet 
parents: 
41793 
diff
changeset
 | 
357  | 
val nondef_us = nondef_ts |> map (nut_from_term hol_ctxt Eq)  | 
| 
 
ed77524f3429
first steps in implementing "fix_datatype_vals" optimization
 
blanchet 
parents: 
41793 
diff
changeset
 | 
358  | 
val def_us = def_ts |> map (nut_from_term hol_ctxt DefEq)  | 
| 41875 | 359  | 
val need_us = need_ts |> map (nut_from_term hol_ctxt Eq)  | 
| 
33558
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33556 
diff
changeset
 | 
360  | 
val (free_names, const_names) =  | 
| 
41888
 
79f837c2e33b
don't forget to look for constants appearing only in "need" option -- otherwise we get exceptions in "the_name" later on
 
blanchet 
parents: 
41876 
diff
changeset
 | 
361  | 
fold add_free_and_const_names (nondef_us @ def_us @ need_us) ([], [])  | 
| 
33558
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33556 
diff
changeset
 | 
362  | 
val (sel_names, nonsel_names) =  | 
| 
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33556 
diff
changeset
 | 
363  | 
List.partition (is_sel o nickname_of) const_names  | 
| 
46114
 
e6d33b200f42
remove subtlety whose justification got lost in time -- the new code is possibly less precise but sounder
 
blanchet 
parents: 
46103 
diff
changeset
 | 
364  | 
val sound_finitizes = none_true finitizes  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
365  | 
val standard = forall snd stds  | 
| 
33558
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33556 
diff
changeset
 | 
366  | 
(*  | 
| 
41888
 
79f837c2e33b
don't forget to look for constants appearing only in "need" option -- otherwise we get exceptions in "the_name" later on
 
blanchet 
parents: 
41876 
diff
changeset
 | 
367  | 
val _ =  | 
| 
 
79f837c2e33b
don't forget to look for constants appearing only in "need" option -- otherwise we get exceptions in "the_name" later on
 
blanchet 
parents: 
41876 
diff
changeset
 | 
368  | 
List.app (print_g o string_for_nut ctxt) (nondef_us @ def_us @ need_us)  | 
| 
33558
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33556 
diff
changeset
 | 
369  | 
*)  | 
| 
 
a2db56854b83
optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
 
blanchet 
parents: 
33556 
diff
changeset
 | 
370  | 
|
| 
34121
 
5e831d805118
get rid of polymorphic equality in Nitpick's code + a few minor cleanups
 
blanchet 
parents: 
34039 
diff
changeset
 | 
371  | 
val unique_scope = forall (curry (op =) 1 o length o snd) cards_assigns  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
372  | 
fun monotonicity_message Ts extra =  | 
| 38188 | 373  | 
let val pretties = map (pretty_maybe_quote o pretty_for_type ctxt) Ts in  | 
374  | 
Pretty.blk (0,  | 
|
375  | 
          pstrs ("The type" ^ plural_s_for_list pretties ^ " ") @
 | 
|
376  | 
pretty_serial_commas "and" pretties @  | 
|
377  | 
          pstrs (" " ^
 | 
|
| 42959 | 378  | 
(if none_true monos then  | 
379  | 
"passed the monotonicity test"  | 
|
380  | 
else  | 
|
381  | 
(if length pretties = 1 then "is" else "are") ^  | 
|
382  | 
" considered monotonic") ^  | 
|
383  | 
". " ^ extra))  | 
|
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
384  | 
end  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
385  | 
fun is_type_fundamentally_monotonic T =  | 
| 
38240
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
386  | 
(is_datatype ctxt stds T andalso not (is_quot_type ctxt T) andalso  | 
| 
37256
 
0dca1ec52999
thread along context instead of theory for typedef lookup
 
blanchet 
parents: 
37213 
diff
changeset
 | 
387  | 
(not (is_pure_typedef ctxt T) orelse is_univ_typedef ctxt T)) orelse  | 
| 
38240
 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 
blanchet 
parents: 
38214 
diff
changeset
 | 
388  | 
is_number_type ctxt T orelse is_bit_type T  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
389  | 
fun is_type_actually_monotonic T =  | 
| 47716 | 390  | 
time_limit tac_timeout (formulas_monotonic hol_ctxt binarize T)  | 
391  | 
(nondef_ts, def_ts)  | 
|
392  | 
handle TimeLimit.TimeOut => false  | 
|
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
393  | 
fun is_type_kind_of_monotonic T =  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
394  | 
case triple_lookup (type_match thy) monos T of  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
395  | 
SOME (SOME false) => false  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
396  | 
| _ => is_type_actually_monotonic T  | 
| 
34936
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
397  | 
fun is_type_monotonic T =  | 
| 33192 | 398  | 
unique_scope orelse  | 
399  | 
case triple_lookup (type_match thy) monos T of  | 
|
400  | 
SOME (SOME b) => b  | 
|
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
401  | 
| _ => is_type_fundamentally_monotonic T orelse  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
402  | 
is_type_actually_monotonic T  | 
| 
41793
 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 
blanchet 
parents: 
41791 
diff
changeset
 | 
403  | 
fun is_deep_datatype_finitizable T =  | 
| 
 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 
blanchet 
parents: 
41791 
diff
changeset
 | 
404  | 
triple_lookup (type_match thy) finitizes T = SOME (SOME true)  | 
| 
41052
 
3db267a01c1d
remove the "fin_fun" optimization in Nitpick -- it was always a hack and didn't help much
 
blanchet 
parents: 
41051 
diff
changeset
 | 
405  | 
    fun is_shallow_datatype_finitizable (T as Type (@{type_name fun_box}, _)) =
 | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
406  | 
is_type_kind_of_monotonic T  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
407  | 
| is_shallow_datatype_finitizable T =  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
408  | 
case triple_lookup (type_match thy) finitizes T of  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
409  | 
SOME (SOME b) => b  | 
| 
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
410  | 
| _ => is_type_kind_of_monotonic T  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
411  | 
fun is_datatype_deep T =  | 
| 
46103
 
1e35730bd869
always treat "unit" as a deep datatype, so that we get a good interaction with the record syntax (2.7 of the Nitpick manual)
 
blanchet 
parents: 
46086 
diff
changeset
 | 
412  | 
      not standard orelse T = @{typ unit} orelse T = nat_T orelse
 | 
| 
 
1e35730bd869
always treat "unit" as a deep datatype, so that we get a good interaction with the record syntax (2.7 of the Nitpick manual)
 
blanchet 
parents: 
46086 
diff
changeset
 | 
413  | 
is_word_type T orelse  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
414  | 
exists (curry (op =) T o domain_type o type_of) sel_names  | 
| 
35386
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
415  | 
val all_Ts = ground_types_in_terms hol_ctxt binarize (nondef_ts @ def_ts)  | 
| 35408 | 416  | 
|> sort Term_Ord.typ_ord  | 
| 38214 | 417  | 
val _ =  | 
418  | 
if verbose andalso binary_ints = SOME true andalso  | 
|
419  | 
exists (member (op =) [nat_T, int_T]) all_Ts then  | 
|
420  | 
print_v (K "The option \"binary_ints\" will be ignored because of the \  | 
|
421  | 
\presence of rationals, reals, \"Suc\", \"gcd\", or \"lcm\" \  | 
|
422  | 
\in the problem or because of the \"non_std\" option.")  | 
|
423  | 
else  | 
|
424  | 
()  | 
|
425  | 
val _ =  | 
|
| 43022 | 426  | 
if mode = Normal andalso  | 
| 38214 | 427  | 
         exists (fn Type (@{type_name Datatype.node}, _) => true | _ => false)
 | 
428  | 
all_Ts then  | 
|
| 47560 | 429  | 
        print_nt (K ("Warning: The problem involves directly or indirectly the \
 | 
430  | 
                     \internal type " ^ quote @{type_name Datatype.node} ^
 | 
|
431  | 
". This type is very Nitpick-unfriendly, and its presence \  | 
|
432  | 
\usually indicates either a failure of abstraction or a \  | 
|
433  | 
\quirk in Nitpick."))  | 
|
| 38214 | 434  | 
else  | 
435  | 
()  | 
|
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
436  | 
val (mono_Ts, nonmono_Ts) = List.partition is_type_monotonic all_Ts  | 
| 33192 | 437  | 
val _ =  | 
| 
34936
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
438  | 
if verbose andalso not unique_scope then  | 
| 
35665
 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 
blanchet 
parents: 
35408 
diff
changeset
 | 
439  | 
case filter_out is_type_fundamentally_monotonic mono_Ts of  | 
| 
34936
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
440  | 
[] => ()  | 
| 
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
441  | 
| interesting_mono_Ts =>  | 
| 38188 | 442  | 
pprint_v (K (monotonicity_message interesting_mono_Ts  | 
443  | 
"Nitpick might be able to skip some scopes."))  | 
|
| 33192 | 444  | 
else  | 
445  | 
()  | 
|
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
446  | 
val (deep_dataTs, shallow_dataTs) =  | 
| 
37256
 
0dca1ec52999
thread along context instead of theory for typedef lookup
 
blanchet 
parents: 
37213 
diff
changeset
 | 
447  | 
all_Ts |> filter (is_datatype ctxt stds)  | 
| 
 
0dca1ec52999
thread along context instead of theory for typedef lookup
 
blanchet 
parents: 
37213 
diff
changeset
 | 
448  | 
|> List.partition is_datatype_deep  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
449  | 
val finitizable_dataTs =  | 
| 
41793
 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 
blanchet 
parents: 
41791 
diff
changeset
 | 
450  | 
(deep_dataTs |> filter_out (is_finite_type hol_ctxt)  | 
| 
 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 
blanchet 
parents: 
41791 
diff
changeset
 | 
451  | 
|> filter is_deep_datatype_finitizable) @  | 
| 
 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 
blanchet 
parents: 
41791 
diff
changeset
 | 
452  | 
(shallow_dataTs |> filter_out (is_finite_type hol_ctxt)  | 
| 
 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 
blanchet 
parents: 
41791 
diff
changeset
 | 
453  | 
|> filter is_shallow_datatype_finitizable)  | 
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
454  | 
val _ =  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
455  | 
if verbose andalso not (null finitizable_dataTs) then  | 
| 38188 | 456  | 
pprint_v (K (monotonicity_message finitizable_dataTs  | 
457  | 
"Nitpick can use a more precise finite encoding."))  | 
|
| 
35385
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
458  | 
else  | 
| 
 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 
blanchet 
parents: 
35384 
diff
changeset
 | 
459  | 
()  | 
| 
35183
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
460  | 
(* This detection code is an ugly hack. Fortunately, it is used only to  | 
| 
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
461  | 
provide a hint to the user. *)  | 
| 
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
462  | 
    fun is_struct_induct_step (name, (Rule_Cases.Case {fixes, assumes, ...}, _)) =
 | 
| 
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
463  | 
not (null fixes) andalso  | 
| 
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
464  | 
exists (String.isSuffix ".hyps" o fst) assumes andalso  | 
| 
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
465  | 
exists (exists (curry (op =) name o shortest_name o fst)  | 
| 
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
466  | 
o datatype_constrs hol_ctxt) deep_dataTs  | 
| 
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
467  | 
val likely_in_struct_induct_step =  | 
| 42361 | 468  | 
exists is_struct_induct_step (Proof_Context.cases_of ctxt)  | 
| 
35183
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
469  | 
val _ = if standard andalso likely_in_struct_induct_step then  | 
| 47560 | 470  | 
pprint_nt (fn () => Pretty.blk (0,  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
471  | 
pstrs "Hint: To check that the induction hypothesis is \  | 
| 35177 | 472  | 
\general enough, try this command: " @  | 
| 45666 | 473  | 
[Pretty.mark Isabelle_Markup.sendback (Pretty.blk (0,  | 
| 
35183
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
474  | 
                       pstrs ("nitpick [non_std, show_all]")))] @ pstrs "."))
 | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
475  | 
else  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
476  | 
()  | 
| 33192 | 477  | 
(*  | 
| 
36128
 
a3d8d5329438
make Nitpick output everything to tracing in debug mode;
 
blanchet 
parents: 
36126 
diff
changeset
 | 
478  | 
val _ = print_g "Monotonic types:"  | 
| 
 
a3d8d5329438
make Nitpick output everything to tracing in debug mode;
 
blanchet 
parents: 
36126 
diff
changeset
 | 
479  | 
val _ = List.app (print_g o string_for_type ctxt) mono_Ts  | 
| 
 
a3d8d5329438
make Nitpick output everything to tracing in debug mode;
 
blanchet 
parents: 
36126 
diff
changeset
 | 
480  | 
val _ = print_g "Nonmonotonic types:"  | 
| 
 
a3d8d5329438
make Nitpick output everything to tracing in debug mode;
 
blanchet 
parents: 
36126 
diff
changeset
 | 
481  | 
val _ = List.app (print_g o string_for_type ctxt) nonmono_Ts  | 
| 33192 | 482  | 
*)  | 
483  | 
||
| 36384 | 484  | 
val incremental = Int.max (max_potential, max_genuine) >= 2  | 
485  | 
val actual_sat_solver =  | 
|
| 33192 | 486  | 
if sat_solver <> "smart" then  | 
| 36384 | 487  | 
if incremental andalso  | 
| 
34936
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
488  | 
not (member (op =) (Kodkod_SAT.configured_sat_solvers true)  | 
| 
35333
 
f61de25f71f9
distinguish between Kodkodi warnings and errors in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
489  | 
sat_solver) then  | 
| 47560 | 490  | 
          (print_nt (K ("An incremental SAT solver is required: \"SAT4J\" will \
 | 
491  | 
\be used instead of " ^ quote sat_solver ^ "."));  | 
|
| 33192 | 492  | 
"SAT4J")  | 
493  | 
else  | 
|
494  | 
sat_solver  | 
|
495  | 
else  | 
|
| 36384 | 496  | 
Kodkod_SAT.smart_sat_solver_name incremental  | 
| 33192 | 497  | 
val _ =  | 
498  | 
if sat_solver = "smart" then  | 
|
| 36384 | 499  | 
print_v (fn () =>  | 
500  | 
"Using SAT solver " ^ quote actual_sat_solver ^ ". The following" ^  | 
|
501  | 
(if incremental then " incremental " else " ") ^  | 
|
502  | 
"solvers are configured: " ^  | 
|
503  | 
commas_quote (Kodkod_SAT.configured_sat_solvers incremental) ^ ".")  | 
|
| 33192 | 504  | 
else  | 
505  | 
()  | 
|
506  | 
||
507  | 
val too_big_scopes = Unsynchronized.ref []  | 
|
508  | 
||
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
509  | 
fun problem_for_scope unsound  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
510  | 
            (scope as {card_assigns, bits, bisim_depth, datatypes, ofs, ...}) =
 | 
| 33192 | 511  | 
let  | 
512  | 
val _ = not (exists (fn other => scope_less_eq other scope)  | 
|
| 
34936
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
513  | 
(!too_big_scopes)) orelse  | 
| 
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
514  | 
                raise TOO_LARGE ("Nitpick.pick_them_nits_in_term.\
 | 
| 
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
515  | 
\problem_for_scope", "too large scope")  | 
| 33192 | 516  | 
(*  | 
| 
36128
 
a3d8d5329438
make Nitpick output everything to tracing in debug mode;
 
blanchet 
parents: 
36126 
diff
changeset
 | 
517  | 
val _ = print_g "Offsets:"  | 
| 33192 | 518  | 
val _ = List.app (fn (T, j0) =>  | 
| 
36128
 
a3d8d5329438
make Nitpick output everything to tracing in debug mode;
 
blanchet 
parents: 
36126 
diff
changeset
 | 
519  | 
print_g (string_for_type ctxt T ^ " = " ^  | 
| 
 
a3d8d5329438
make Nitpick output everything to tracing in debug mode;
 
blanchet 
parents: 
36126 
diff
changeset
 | 
520  | 
string_of_int j0))  | 
| 33192 | 521  | 
(Typtab.dest ofs)  | 
522  | 
*)  | 
|
| 
41858
 
37ce158d6266
if "total_consts" is set, report cex's as quasi-genuine
 
blanchet 
parents: 
41856 
diff
changeset
 | 
523  | 
val effective_total_consts =  | 
| 41856 | 524  | 
case total_consts of  | 
525  | 
SOME b => b  | 
|
526  | 
| NONE => forall (is_exact_type datatypes true) all_Ts  | 
|
| 33192 | 527  | 
val main_j0 = offset_of_type ofs bool_T  | 
528  | 
val (nat_card, nat_j0) = spec_of_type scope nat_T  | 
|
529  | 
val (int_card, int_j0) = spec_of_type scope int_T  | 
|
| 
34936
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
530  | 
val _ = (nat_j0 = main_j0 andalso int_j0 = main_j0) orelse  | 
| 
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
531  | 
                raise BAD ("Nitpick.pick_them_nits_in_term.problem_for_scope",
 | 
| 
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
532  | 
"bad offsets")  | 
| 33192 | 533  | 
val kk = kodkod_constrs peephole_optim nat_card int_card main_j0  | 
534  | 
val (free_names, rep_table) =  | 
|
| 38170 | 535  | 
choose_reps_for_free_vars scope pseudo_frees free_names  | 
536  | 
NameTable.empty  | 
|
| 33192 | 537  | 
val (sel_names, rep_table) = choose_reps_for_all_sels scope rep_table  | 
| 38170 | 538  | 
val (nonsel_names, rep_table) =  | 
| 
41858
 
37ce158d6266
if "total_consts" is set, report cex's as quasi-genuine
 
blanchet 
parents: 
41856 
diff
changeset
 | 
539  | 
choose_reps_for_consts scope effective_total_consts nonsel_names  | 
| 
 
37ce158d6266
if "total_consts" is set, report cex's as quasi-genuine
 
blanchet 
parents: 
41856 
diff
changeset
 | 
540  | 
rep_table  | 
| 38182 | 541  | 
val (guiltiest_party, min_highest_arity) =  | 
542  | 
NameTable.fold (fn (name, R) => fn (s, n) =>  | 
|
543  | 
let val n' = arity_of_rep R in  | 
|
544  | 
if n' > n then (nickname_of name, n') else (s, n)  | 
|
545  | 
                             end) rep_table ("", 1)
 | 
|
| 33192 | 546  | 
val min_univ_card =  | 
| 36384 | 547  | 
NameTable.fold (Integer.max o min_univ_card_of_rep o snd) rep_table  | 
| 34126 | 548  | 
(univ_card nat_card int_card main_j0 [] KK.True)  | 
| 
41897
 
c24e7fd17464
perform no arity check in debug mode so that we get to see the Kodkod problem
 
blanchet 
parents: 
41888 
diff
changeset
 | 
549  | 
val _ = if debug then ()  | 
| 
 
c24e7fd17464
perform no arity check in debug mode so that we get to see the Kodkod problem
 
blanchet 
parents: 
41888 
diff
changeset
 | 
550  | 
else check_arity guiltiest_party min_univ_card min_highest_arity  | 
| 33192 | 551  | 
|
| 41802 | 552  | 
val def_us =  | 
553  | 
def_us |> map (choose_reps_in_nut scope unsound rep_table true)  | 
|
554  | 
val nondef_us =  | 
|
555  | 
nondef_us |> map (choose_reps_in_nut scope unsound rep_table false)  | 
|
| 41875 | 556  | 
val need_us =  | 
557  | 
need_us |> map (choose_reps_in_nut scope unsound rep_table false)  | 
|
| 33745 | 558  | 
(*  | 
| 
36128
 
a3d8d5329438
make Nitpick output everything to tracing in debug mode;
 
blanchet 
parents: 
36126 
diff
changeset
 | 
559  | 
val _ = List.app (print_g o string_for_nut ctxt)  | 
| 33192 | 560  | 
(free_names @ sel_names @ nonsel_names @  | 
| 
41888
 
79f837c2e33b
don't forget to look for constants appearing only in "need" option -- otherwise we get exceptions in "the_name" later on
 
blanchet 
parents: 
41876 
diff
changeset
 | 
561  | 
nondef_us @ def_us @ need_us)  | 
| 33745 | 562  | 
*)  | 
| 33192 | 563  | 
val (free_rels, pool, rel_table) =  | 
564  | 
rename_free_vars free_names initial_pool NameTable.empty  | 
|
565  | 
val (sel_rels, pool, rel_table) =  | 
|
566  | 
rename_free_vars sel_names pool rel_table  | 
|
567  | 
val (other_rels, pool, rel_table) =  | 
|
568  | 
rename_free_vars nonsel_names pool rel_table  | 
|
| 41802 | 569  | 
val nondef_us = nondef_us |> map (rename_vars_in_nut pool rel_table)  | 
570  | 
val def_us = def_us |> map (rename_vars_in_nut pool rel_table)  | 
|
| 41875 | 571  | 
val need_us = need_us |> map (rename_vars_in_nut pool rel_table)  | 
| 
35386
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
572  | 
val nondef_fs = map (kodkod_formula_from_nut ofs kk) nondef_us  | 
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
573  | 
val def_fs = map (kodkod_formula_from_nut ofs kk) def_us  | 
| 
35386
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
574  | 
val formula = fold (fold s_and) [def_fs, nondef_fs] KK.True  | 
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
575  | 
val comment = (if unsound then "unsound" else "sound") ^ "\n" ^  | 
| 
37146
 
f652333bbf8e
renamed structure PrintMode to Print_Mode, keeping the old name as legacy alias for some time;
 
wenzelm 
parents: 
36913 
diff
changeset
 | 
576  | 
Print_Mode.setmp [] multiline_string_for_scope scope  | 
| 34998 | 577  | 
val kodkod_sat_solver =  | 
| 36384 | 578  | 
Kodkod_SAT.sat_solver_spec actual_sat_solver |> snd  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
579  | 
val bit_width = if bits = 0 then 16 else bits + 1  | 
| 36384 | 580  | 
val delay =  | 
581  | 
if unsound then  | 
|
582  | 
Option.map (fn time => Time.- (time, Time.now ())) deadline  | 
|
583  | 
|> unsound_delay_for_timeout  | 
|
584  | 
else  | 
|
585  | 
0  | 
|
586  | 
        val settings = [("solver", commas_quote kodkod_sat_solver),
 | 
|
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
587  | 
                        ("bit_width", string_of_int bit_width),
 | 
| 38124 | 588  | 
                        ("symmetry_breaking", string_of_int kodkod_sym_break),
 | 
| 
36386
 
2132f15b366f
Fruhjahrsputz: remove three mostly useless Nitpick options
 
blanchet 
parents: 
36385 
diff
changeset
 | 
589  | 
                        ("sharing", "3"),
 | 
| 
 
2132f15b366f
Fruhjahrsputz: remove three mostly useless Nitpick options
 
blanchet 
parents: 
36385 
diff
changeset
 | 
590  | 
                        ("flatten", "false"),
 | 
| 33192 | 591  | 
                        ("delay", signed_string_of_int delay)]
 | 
592  | 
val plain_rels = free_rels @ other_rels  | 
|
593  | 
val plain_bounds = map (bound_for_plain_rel ctxt debug) plain_rels  | 
|
594  | 
val plain_axioms = map (declarative_axiom_for_plain_rel kk) plain_rels  | 
|
| 41995 | 595  | 
val need_vals =  | 
596  | 
          map (fn dtype as {typ, ...} =>
 | 
|
597  | 
(typ, needed_values_for_datatype need_us ofs dtype)) datatypes  | 
|
598  | 
val sel_bounds =  | 
|
599  | 
map (bound_for_sel_rel ctxt debug need_vals datatypes) sel_rels  | 
|
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35185 
diff
changeset
 | 
600  | 
val dtype_axioms =  | 
| 41995 | 601  | 
declarative_axioms_for_datatypes hol_ctxt binarize need_us need_vals  | 
| 
41801
 
ed77524f3429
first steps in implementing "fix_datatype_vals" optimization
 
blanchet 
parents: 
41793 
diff
changeset
 | 
602  | 
datatype_sym_break bits ofs kk rel_table datatypes  | 
| 33192 | 603  | 
val declarative_axioms = plain_axioms @ dtype_axioms  | 
| 
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
 | 
604  | 
val univ_card = Int.max (univ_card nat_card int_card main_j0  | 
| 
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
605  | 
(plain_bounds @ sel_bounds) formula,  | 
| 
 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 
blanchet 
parents: 
35190 
diff
changeset
 | 
606  | 
main_j0 |> bits > 0 ? Integer.add (bits + 1))  | 
| 38126 | 607  | 
val (built_in_bounds, built_in_axioms) =  | 
| 39345 | 608  | 
bounds_and_axioms_for_built_in_rels_in_formulas debug univ_card  | 
609  | 
nat_card int_card main_j0 (formula :: declarative_axioms)  | 
|
| 33192 | 610  | 
val bounds = built_in_bounds @ plain_bounds @ sel_bounds  | 
611  | 
|> not debug ? merge_bounds  | 
|
| 38126 | 612  | 
val axioms = built_in_axioms @ declarative_axioms  | 
| 33192 | 613  | 
val highest_arity =  | 
614  | 
fold Integer.max (map (fst o fst) (maps fst bounds)) 0  | 
|
| 38126 | 615  | 
val formula = fold_rev s_and axioms formula  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
616  | 
val _ = if bits = 0 then () else check_bits bits formula  | 
| 
41897
 
c24e7fd17464
perform no arity check in debug mode so that we get to see the Kodkod problem
 
blanchet 
parents: 
41888 
diff
changeset
 | 
617  | 
val _ = if debug orelse formula = KK.False then ()  | 
| 38182 | 618  | 
else check_arity "" univ_card highest_arity  | 
| 33192 | 619  | 
in  | 
620  | 
        SOME ({comment = comment, settings = settings, univ_card = univ_card,
 | 
|
621  | 
tuple_assigns = [], bounds = bounds,  | 
|
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
622  | 
int_bounds = if bits = 0 then sequential_int_bounds univ_card  | 
| 
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
623  | 
else pow_of_two_int_bounds bits main_j0,  | 
| 33192 | 624  | 
expr_assigns = [], formula = formula},  | 
625  | 
              {free_names = free_names, sel_names = sel_names,
 | 
|
626  | 
nonsel_names = nonsel_names, rel_table = rel_table,  | 
|
| 
35386
 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 
blanchet 
parents: 
35385 
diff
changeset
 | 
627  | 
unsound = unsound, scope = scope})  | 
| 33192 | 628  | 
end  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
629  | 
handle TOO_LARGE (loc, msg) =>  | 
| 
34936
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
630  | 
if loc = "Nitpick_Kodkod.check_arity" andalso  | 
| 
 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 
blanchet 
parents: 
34935 
diff
changeset
 | 
631  | 
not (Typtab.is_empty ofs) then  | 
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
632  | 
problem_for_scope unsound  | 
| 
35190
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35185 
diff
changeset
 | 
633  | 
                   {hol_ctxt = hol_ctxt, binarize = binarize,
 | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35185 
diff
changeset
 | 
634  | 
card_assigns = card_assigns, bits = bits,  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35185 
diff
changeset
 | 
635  | 
bisim_depth = bisim_depth, datatypes = datatypes,  | 
| 
 
ce653cc27a94
make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
 
blanchet 
parents: 
35185 
diff
changeset
 | 
636  | 
ofs = Typtab.empty}  | 
| 33192 | 637  | 
else if loc = "Nitpick.pick_them_nits_in_term.\  | 
638  | 
\problem_for_scope" then  | 
|
639  | 
NONE  | 
|
640  | 
else  | 
|
641  | 
(Unsynchronized.change too_big_scopes (cons scope);  | 
|
| 
41992
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
642  | 
print_v (fn () =>  | 
| 
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
643  | 
"Limit reached: " ^ msg ^ ". Skipping " ^  | 
| 
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
644  | 
(if unsound then "potential component of " else "") ^  | 
| 
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
645  | 
"scope.");  | 
| 33192 | 646  | 
NONE)  | 
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
647  | 
| TOO_SMALL (_, msg) =>  | 
| 
41992
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
648  | 
(print_v (fn () =>  | 
| 
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
649  | 
"Limit reached: " ^ msg ^ ". Skipping " ^  | 
| 
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
650  | 
(if unsound then "potential component of " else "") ^  | 
| 
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
651  | 
"scope.");  | 
| 
34124
 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 
blanchet 
parents: 
34123 
diff
changeset
 | 
652  | 
NONE)  | 
| 33192 | 653  | 
|
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
654  | 
val das_wort_model =  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
655  | 
(if falsify then "counterexample" else "model")  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
656  | 
|> not standard ? prefix "nonstandard "  | 
| 33192 | 657  | 
|
658  | 
val scopes = Unsynchronized.ref []  | 
|
659  | 
val generated_scopes = Unsynchronized.ref []  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
660  | 
val generated_problems = Unsynchronized.ref ([] : rich_problem list)  | 
| 33192 | 661  | 
val checked_problems = Unsynchronized.ref (SOME [])  | 
662  | 
val met_potential = Unsynchronized.ref 0  | 
|
663  | 
||
664  | 
fun update_checked_problems problems =  | 
|
665  | 
List.app (Unsynchronized.change checked_problems o Option.map o cons  | 
|
666  | 
o nth problems)  | 
|
| 
35333
 
f61de25f71f9
distinguish between Kodkodi warnings and errors in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
667  | 
fun show_kodkod_warning "" = ()  | 
| 47560 | 668  | 
| show_kodkod_warning s = print_nt (fn () => "Kodkod warning: " ^ s ^ ".")  | 
| 33192 | 669  | 
|
670  | 
fun print_and_check_model genuine bounds  | 
|
671  | 
            ({free_names, sel_names, nonsel_names, rel_table, scope, ...}
 | 
|
672  | 
: problem_extension) =  | 
|
673  | 
let  | 
|
| 47752 | 674  | 
val _ =  | 
675  | 
print_t (fn () =>  | 
|
676  | 
"% SZS status " ^  | 
|
677  | 
(if genuine then  | 
|
678  | 
if falsify then "CounterSatisfiable" else "Satisfiable"  | 
|
679  | 
else  | 
|
680  | 
"Unknown") ^ "\n" ^  | 
|
681  | 
"% SZS output start FiniteModel")  | 
|
| 33192 | 682  | 
val (reconstructed_model, codatatypes_ok) =  | 
| 
41993
 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 
blanchet 
parents: 
41992 
diff
changeset
 | 
683  | 
reconstruct_hol_model  | 
| 
 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 
blanchet 
parents: 
41992 
diff
changeset
 | 
684  | 
              {show_datatypes = show_datatypes, show_skolems = show_skolems,
 | 
| 
 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 
blanchet 
parents: 
41992 
diff
changeset
 | 
685  | 
show_consts = show_consts}  | 
| 38170 | 686  | 
scope formats atomss real_frees pseudo_frees free_names sel_names  | 
687  | 
nonsel_names rel_table bounds  | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
688  | 
val genuine_means_genuine =  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
689  | 
got_all_user_axioms andalso none_true wfs andalso  | 
| 
41858
 
37ce158d6266
if "total_consts" is set, report cex's as quasi-genuine
 
blanchet 
parents: 
41856 
diff
changeset
 | 
690  | 
sound_finitizes andalso total_consts <> SOME true andalso  | 
| 
 
37ce158d6266
if "total_consts" is set, report cex's as quasi-genuine
 
blanchet 
parents: 
41856 
diff
changeset
 | 
691  | 
codatatypes_ok  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
692  | 
fun assms_prop () =  | 
| 
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
693  | 
Logic.mk_conjunction_list (neg_t :: def_assm_ts @ nondef_assm_ts)  | 
| 33192 | 694  | 
in  | 
| 47752 | 695  | 
(pprint_a (Pretty.chunks  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
696  | 
[Pretty.blk (0,  | 
| 43022 | 697  | 
(pstrs ((if mode = Auto_Try then "Auto " else "") ^  | 
698  | 
"Nitpick found a" ^  | 
|
| 
41992
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
699  | 
(if not genuine then " potentially spurious "  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
700  | 
else if genuine_means_genuine then " "  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
701  | 
else " quasi genuine ") ^ das_wort_model) @  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
702  | 
(case pretties_for_scope scope verbose of  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
703  | 
[] => []  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
704  | 
| pretties => pstrs " for " @ pretties) @  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
705  | 
[Pretty.str ":\n"])),  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
706  | 
Pretty.indent indent_size reconstructed_model]);  | 
| 47564 | 707  | 
print_t (K "% SZS output end FiniteModel");  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
708  | 
if genuine then  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
709  | 
(if check_genuine andalso standard then  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
710  | 
case prove_hol_model scope tac_timeout free_names sel_names  | 
| 
38169
 
b51784515471
optimize local "def"s by treating them as definitions
 
blanchet 
parents: 
38126 
diff
changeset
 | 
711  | 
rel_table bounds (assms_prop ()) of  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
712  | 
SOME true =>  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
713  | 
                print ("Confirmation by \"auto\": The above " ^
 | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
714  | 
das_wort_model ^ " is really genuine.")  | 
| 33192 | 715  | 
| SOME false =>  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
716  | 
if genuine_means_genuine then  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
717  | 
                  error ("A supposedly genuine " ^ das_wort_model ^ " was \
 | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
718  | 
\shown to be spurious by \"auto\".\nThis should never \  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
719  | 
\happen.\nPlease send a bug report to blanchet\  | 
| 33192 | 720  | 
\te@in.tum.de.")  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
721  | 
else  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
722  | 
                   print ("Refutation by \"auto\": The above " ^
 | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
723  | 
das_wort_model ^ " is spurious.")  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
724  | 
| NONE => print "No confirmation by \"auto\"."  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
725  | 
else  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
726  | 
();  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
727  | 
if not standard andalso likely_in_struct_induct_step then  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
728  | 
print "The existence of a nonstandard model suggests that the \  | 
| 36126 | 729  | 
\induction hypothesis is not general enough or may even be \  | 
730  | 
\wrong. See the Nitpick manual's \"Inductive Properties\" \  | 
|
731  | 
\section for details (\"isabelle doc nitpick\")."  | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
732  | 
else  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
733  | 
();  | 
| 
41048
 
d5ebe94248ad
added a hint when the user obviously just forgot a colon after the lemma's name
 
blanchet 
parents: 
41007 
diff
changeset
 | 
734  | 
if has_lonely_bool_var orig_t then  | 
| 
 
d5ebe94248ad
added a hint when the user obviously just forgot a colon after the lemma's name
 
blanchet 
parents: 
41007 
diff
changeset
 | 
735  | 
print "Hint: Maybe you forgot a colon after the lemma's name?"  | 
| 
 
d5ebe94248ad
added a hint when the user obviously just forgot a colon after the lemma's name
 
blanchet 
parents: 
41007 
diff
changeset
 | 
736  | 
else if has_syntactic_sorts orig_t then  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
737  | 
print "Hint: Maybe you forgot a type constraint?"  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
738  | 
else  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
739  | 
();  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
740  | 
if not genuine_means_genuine then  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
741  | 
if no_poly_user_axioms then  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
742  | 
let  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
743  | 
val options =  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
744  | 
[] |> not got_all_mono_user_axioms  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
745  | 
                          ? cons ("user_axioms", "\"true\"")
 | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
746  | 
|> not (none_true wfs)  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
747  | 
                          ? cons ("wf", "\"smart\" or \"false\"")
 | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
748  | 
|> not sound_finitizes  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
749  | 
                          ? cons ("finitize", "\"smart\" or \"false\"")
 | 
| 
41858
 
37ce158d6266
if "total_consts" is set, report cex's as quasi-genuine
 
blanchet 
parents: 
41856 
diff
changeset
 | 
750  | 
|> total_consts = SOME true  | 
| 
 
37ce158d6266
if "total_consts" is set, report cex's as quasi-genuine
 
blanchet 
parents: 
41856 
diff
changeset
 | 
751  | 
                          ? cons ("total_consts", "\"smart\" or \"false\"")
 | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
752  | 
|> not codatatypes_ok  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
753  | 
                          ? cons ("bisim_depth", "a nonnegative value")
 | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
754  | 
val ss =  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
755  | 
map (fn (name, value) => quote name ^ " set to " ^ value)  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
756  | 
options  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
757  | 
in  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
758  | 
                  print ("Try again with " ^
 | 
| 41872 | 759  | 
space_implode " " (serial_commas "and" ss) ^  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
760  | 
" to confirm that the " ^ das_wort_model ^  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
761  | 
" is genuine.")  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
762  | 
end  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
763  | 
else  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
764  | 
                print ("Nitpick is unable to guarantee the authenticity of \
 | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
765  | 
\the " ^ das_wort_model ^ " in the presence of \  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
766  | 
\polymorphic axioms.")  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
767  | 
else  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
768  | 
();  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
769  | 
NONE)  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
770  | 
else  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
771  | 
if not genuine then  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
772  | 
(Unsynchronized.inc met_potential;  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
773  | 
if check_potential then  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
774  | 
let  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
775  | 
val status = prove_hol_model scope tac_timeout free_names  | 
| 
38169
 
b51784515471
optimize local "def"s by treating them as definitions
 
blanchet 
parents: 
38126 
diff
changeset
 | 
776  | 
sel_names rel_table bounds  | 
| 
 
b51784515471
optimize local "def"s by treating them as definitions
 
blanchet 
parents: 
38126 
diff
changeset
 | 
777  | 
(assms_prop ())  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
778  | 
in  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
779  | 
(case status of  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
780  | 
                     SOME true => print ("Confirmation by \"auto\": The \
 | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
781  | 
\above " ^ das_wort_model ^  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
782  | 
" is genuine.")  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
783  | 
                   | SOME false => print ("Refutation by \"auto\": The above " ^
 | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
784  | 
das_wort_model ^ " is spurious.")  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
785  | 
| NONE => print "No confirmation by \"auto\".");  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
786  | 
status  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
787  | 
end  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
788  | 
else  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
789  | 
NONE)  | 
| 33192 | 790  | 
else  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
791  | 
NONE)  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
792  | 
|> pair genuine_means_genuine  | 
| 33192 | 793  | 
end  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
794  | 
fun solve_any_problem (found_really_genuine, max_potential, max_genuine,  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
795  | 
donno) first_time problems =  | 
| 33192 | 796  | 
let  | 
797  | 
val max_potential = Int.max (0, max_potential)  | 
|
798  | 
val max_genuine = Int.max (0, max_genuine)  | 
|
799  | 
fun print_and_check genuine (j, bounds) =  | 
|
800  | 
print_and_check_model genuine bounds (snd (nth problems j))  | 
|
801  | 
val max_solutions = max_potential + max_genuine  | 
|
| 36384 | 802  | 
|> not incremental ? Integer.min 1  | 
| 33192 | 803  | 
in  | 
804  | 
if max_solutions <= 0 then  | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
805  | 
(found_really_genuine, 0, 0, donno)  | 
| 33192 | 806  | 
else  | 
| 
41793
 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 
blanchet 
parents: 
41791 
diff
changeset
 | 
807  | 
case KK.solve_any_problem debug overlord deadline max_threads  | 
| 
 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 
blanchet 
parents: 
41791 
diff
changeset
 | 
808  | 
max_solutions (map fst problems) of  | 
| 49024 | 809  | 
KK.JavaNotFound =>  | 
810  | 
(print_nt java_not_found_message;  | 
|
| 
35696
 
17ae461d6133
show nice error message in Nitpick when "java" is not available
 
blanchet 
parents: 
35671 
diff
changeset
 | 
811  | 
(found_really_genuine, max_potential, max_genuine, donno + 1))  | 
| 
38516
 
307669429dc1
gracefully handle the case where the JVM is too old in Nitpick
 
blanchet 
parents: 
38240 
diff
changeset
 | 
812  | 
| KK.JavaTooOld =>  | 
| 49024 | 813  | 
(print_nt java_too_old_message;  | 
| 
38516
 
307669429dc1
gracefully handle the case where the JVM is too old in Nitpick
 
blanchet 
parents: 
38240 
diff
changeset
 | 
814  | 
(found_really_genuine, max_potential, max_genuine, donno + 1))  | 
| 
35696
 
17ae461d6133
show nice error message in Nitpick when "java" is not available
 
blanchet 
parents: 
35671 
diff
changeset
 | 
815  | 
| KK.KodkodiNotInstalled =>  | 
| 49024 | 816  | 
(print_nt kodkodi_not_installed_message;  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
817  | 
(found_really_genuine, max_potential, max_genuine, donno + 1))  | 
| 
35333
 
f61de25f71f9
distinguish between Kodkodi warnings and errors in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
818  | 
| KK.Normal ([], unsat_js, s) =>  | 
| 
 
f61de25f71f9
distinguish between Kodkodi warnings and errors in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
819  | 
(update_checked_problems problems unsat_js; show_kodkod_warning s;  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
820  | 
(found_really_genuine, max_potential, max_genuine, donno))  | 
| 
35333
 
f61de25f71f9
distinguish between Kodkodi warnings and errors in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
821  | 
| KK.Normal (sat_ps, unsat_js, s) =>  | 
| 33192 | 822  | 
let  | 
823  | 
val (lib_ps, con_ps) =  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
824  | 
List.partition (#unsound o snd o nth problems o fst) sat_ps  | 
| 33192 | 825  | 
in  | 
826  | 
update_checked_problems problems (unsat_js @ map fst lib_ps);  | 
|
| 
35333
 
f61de25f71f9
distinguish between Kodkodi warnings and errors in Nitpick;
 
blanchet 
parents: 
35280 
diff
changeset
 | 
827  | 
show_kodkod_warning s;  | 
| 33192 | 828  | 
if null con_ps then  | 
829  | 
let  | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
830  | 
val genuine_codes =  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
831  | 
lib_ps |> take max_potential  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
832  | 
|> map (print_and_check false)  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
833  | 
|> filter (curry (op =) (SOME true) o snd)  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
834  | 
val found_really_genuine =  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
835  | 
found_really_genuine orelse exists fst genuine_codes  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
836  | 
val num_genuine = length genuine_codes  | 
| 33192 | 837  | 
val max_genuine = max_genuine - num_genuine  | 
838  | 
val max_potential = max_potential  | 
|
839  | 
- (length lib_ps - num_genuine)  | 
|
840  | 
in  | 
|
841  | 
if max_genuine <= 0 then  | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
842  | 
(found_really_genuine, 0, 0, donno)  | 
| 33192 | 843  | 
else  | 
844  | 
let  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
845  | 
(* "co_js" is the list of sound problems whose unsound  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
846  | 
pendants couldn't be satisfied and hence that most  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
847  | 
probably can't be satisfied themselves. *)  | 
| 33192 | 848  | 
val co_js =  | 
849  | 
map (fn j => j - 1) unsat_js  | 
|
850  | 
|> filter (fn j =>  | 
|
851  | 
j >= 0 andalso  | 
|
852  | 
scopes_equivalent  | 
|
| 35814 | 853  | 
(#scope (snd (nth problems j)),  | 
854  | 
#scope (snd (nth problems (j + 1)))))  | 
|
| 33192 | 855  | 
val bye_js = sort_distinct int_ord (map fst sat_ps @  | 
856  | 
unsat_js @ co_js)  | 
|
857  | 
val problems =  | 
|
858  | 
problems |> filter_out_indices bye_js  | 
|
859  | 
|> max_potential <= 0  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
860  | 
? filter_out (#unsound o snd)  | 
| 33192 | 861  | 
in  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
862  | 
solve_any_problem (found_really_genuine, max_potential,  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
863  | 
max_genuine, donno) false problems  | 
| 33192 | 864  | 
end  | 
865  | 
end  | 
|
866  | 
else  | 
|
867  | 
let  | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
868  | 
val genuine_codes =  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
869  | 
con_ps |> take max_genuine  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
870  | 
|> map (print_and_check true)  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
871  | 
val max_genuine = max_genuine - length genuine_codes  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
872  | 
val found_really_genuine =  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
873  | 
found_really_genuine orelse exists fst genuine_codes  | 
| 33192 | 874  | 
in  | 
875  | 
if max_genuine <= 0 orelse not first_time then  | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
876  | 
(found_really_genuine, 0, max_genuine, donno)  | 
| 33192 | 877  | 
else  | 
878  | 
let  | 
|
879  | 
val bye_js = sort_distinct int_ord  | 
|
880  | 
(map fst sat_ps @ unsat_js)  | 
|
881  | 
val problems =  | 
|
882  | 
problems |> filter_out_indices bye_js  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
883  | 
|> filter_out (#unsound o snd)  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
884  | 
in  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
885  | 
solve_any_problem (found_really_genuine, 0, max_genuine,  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
886  | 
donno) false problems  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
887  | 
end  | 
| 33192 | 888  | 
end  | 
889  | 
end  | 
|
| 34126 | 890  | 
| KK.TimedOut unsat_js =>  | 
| 33192 | 891  | 
(update_checked_problems problems unsat_js; raise TimeLimit.TimeOut)  | 
| 34126 | 892  | 
| KK.Error (s, unsat_js) =>  | 
| 33192 | 893  | 
(update_checked_problems problems unsat_js;  | 
894  | 
             print_v (K ("Kodkod error: " ^ s ^ "."));
 | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
895  | 
(found_really_genuine, max_potential, max_genuine, donno + 1))  | 
| 33192 | 896  | 
end  | 
897  | 
||
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
898  | 
fun run_batch j n scopes (found_really_genuine, max_potential, max_genuine,  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
899  | 
donno) =  | 
| 33192 | 900  | 
let  | 
901  | 
val _ =  | 
|
902  | 
if null scopes then  | 
|
| 47560 | 903  | 
print_nt (K "The scope specification is inconsistent.")  | 
| 33192 | 904  | 
else if verbose then  | 
| 47560 | 905  | 
pprint_nt (fn () => Pretty.chunks  | 
| 33192 | 906  | 
[Pretty.blk (0,  | 
907  | 
pstrs ((if n > 1 then  | 
|
908  | 
"Batch " ^ string_of_int (j + 1) ^ " of " ^  | 
|
909  | 
signed_string_of_int n ^ ": "  | 
|
910  | 
else  | 
|
911  | 
"") ^  | 
|
912  | 
"Trying " ^ string_of_int (length scopes) ^  | 
|
913  | 
" scope" ^ plural_s_for_list scopes ^ ":")),  | 
|
914  | 
Pretty.indent indent_size  | 
|
915  | 
(Pretty.chunks (map2  | 
|
916  | 
(fn j => fn scope =>  | 
|
917  | 
Pretty.block (  | 
|
918  | 
(case pretties_for_scope scope true of  | 
|
919  | 
[] => [Pretty.str "Empty"]  | 
|
920  | 
| pretties => pretties) @  | 
|
921  | 
[Pretty.str (if j = 1 then "." else ";")]))  | 
|
922  | 
(length scopes downto 1) scopes))])  | 
|
923  | 
else  | 
|
924  | 
()  | 
|
| 
35280
 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 
blanchet 
parents: 
35220 
diff
changeset
 | 
925  | 
fun add_problem_for_scope (scope, unsound) (problems, donno) =  | 
| 33192 | 926  | 
(check_deadline ();  | 
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
927  | 
case problem_for_scope unsound scope of  | 
| 33192 | 928  | 
SOME problem =>  | 
929  | 
(problems  | 
|
930  | 
|> (null problems orelse  | 
|
| 35814 | 931  | 
not (KK.problems_equivalent (fst problem, fst (hd problems))))  | 
| 33192 | 932  | 
? cons problem, donno)  | 
933  | 
| NONE => (problems, donno + 1))  | 
|
934  | 
val (problems, donno) =  | 
|
935  | 
fold add_problem_for_scope  | 
|
936  | 
(map_product pair scopes  | 
|
937  | 
((if max_genuine > 0 then [false] else []) @  | 
|
938  | 
(if max_potential > 0 then [true] else [])))  | 
|
939  | 
([], donno)  | 
|
940  | 
val _ = Unsynchronized.change generated_problems (append problems)  | 
|
941  | 
val _ = Unsynchronized.change generated_scopes (append scopes)  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
942  | 
val _ =  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
943  | 
if j + 1 = n then  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
944  | 
let  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
945  | 
val (unsound_problems, sound_problems) =  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
946  | 
List.partition (#unsound o snd) (!generated_problems)  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
947  | 
in  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
948  | 
if not (null sound_problems) andalso  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
949  | 
forall (KK.is_problem_trivially_false o fst)  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
950  | 
sound_problems then  | 
| 47560 | 951  | 
print_nt (fn () =>  | 
| 44395 | 952  | 
"Warning: The conjecture " ^  | 
953  | 
(if falsify then "either trivially holds"  | 
|
954  | 
else "is either trivially unsatisfiable") ^  | 
|
955  | 
" for the given scopes or lies outside Nitpick's supported \  | 
|
| 35384 | 956  | 
\fragment." ^  | 
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
957  | 
(if exists (not o KK.is_problem_trivially_false o fst)  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
958  | 
unsound_problems then  | 
| 
41992
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
959  | 
" Only potentially spurious " ^ das_wort_model ^  | 
| 
 
0e4716fa330a
reword Nitpick's wording concerning potential counterexamples
 
blanchet 
parents: 
41985 
diff
changeset
 | 
960  | 
"s may be found."  | 
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
961  | 
else  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
962  | 
""))  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
963  | 
else  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
964  | 
()  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
965  | 
end  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
966  | 
else  | 
| 
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
967  | 
()  | 
| 33192 | 968  | 
in  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
969  | 
solve_any_problem (found_really_genuine, max_potential, max_genuine,  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
970  | 
donno) true (rev problems)  | 
| 33192 | 971  | 
end  | 
972  | 
||
973  | 
fun scope_count (problems : rich_problem list) scope =  | 
|
| 35814 | 974  | 
length (filter (curry scopes_equivalent scope o #scope o snd) problems)  | 
| 33192 | 975  | 
fun excipit did_so_and_so =  | 
976  | 
let  | 
|
977  | 
val do_filter =  | 
|
| 
35185
 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 
blanchet 
parents: 
35183 
diff
changeset
 | 
978  | 
if !met_potential = max_potential then filter_out (#unsound o snd)  | 
| 33192 | 979  | 
else I  | 
980  | 
val total = length (!scopes)  | 
|
981  | 
val unsat =  | 
|
982  | 
fold (fn scope =>  | 
|
983  | 
case scope_count (do_filter (!generated_problems)) scope of  | 
|
984  | 
0 => I  | 
|
985  | 
| n =>  | 
|
| 
33556
 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 
blanchet 
parents: 
33233 
diff
changeset
 | 
986  | 
scope_count (do_filter (these (!checked_problems)))  | 
| 
 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 
blanchet 
parents: 
33233 
diff
changeset
 | 
987  | 
scope = n  | 
| 
 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 
blanchet 
parents: 
33233 
diff
changeset
 | 
988  | 
? Integer.add 1) (!generated_scopes) 0  | 
| 33192 | 989  | 
in  | 
| 47560 | 990  | 
(if mode = TPTP then "% SZS status Unknown\n" else "") ^  | 
| 33192 | 991  | 
"Nitpick " ^ did_so_and_so ^  | 
992  | 
(if is_some (!checked_problems) andalso total > 0 then  | 
|
| 39361 | 993  | 
" " ^ string_of_int unsat ^ " of " ^ string_of_int total ^ " scope"  | 
994  | 
^ plural_s total  | 
|
| 33192 | 995  | 
else  | 
996  | 
"") ^ "."  | 
|
997  | 
end  | 
|
998  | 
||
| 
37704
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
999  | 
val (skipped, the_scopes) =  | 
| 
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
1000  | 
all_scopes hol_ctxt binarize cards_assigns maxes_assigns iters_assigns  | 
| 
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
1001  | 
bitss bisim_depths mono_Ts nonmono_Ts deep_dataTs  | 
| 
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
1002  | 
finitizable_dataTs  | 
| 
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
1003  | 
val _ = if skipped > 0 then  | 
| 47560 | 1004  | 
print_nt (fn () => "Too many scopes. Skipping " ^  | 
1005  | 
string_of_int skipped ^ " scope" ^  | 
|
1006  | 
plural_s skipped ^  | 
|
1007  | 
". (Consider using \"mono\" or \  | 
|
1008  | 
\\"merge_type_vars\" to prevent this.)")  | 
|
| 
37704
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
1009  | 
else  | 
| 
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
1010  | 
()  | 
| 
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
1011  | 
val _ = scopes := the_scopes  | 
| 
 
c6161bee8486
adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
 
blanchet 
parents: 
37497 
diff
changeset
 | 
1012  | 
|
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
1013  | 
fun run_batches _ _ []  | 
| 
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
1014  | 
(found_really_genuine, max_potential, max_genuine, donno) =  | 
| 33192 | 1015  | 
if donno > 0 andalso max_genuine > 0 then  | 
| 47560 | 1016  | 
(print_nt (fn () => excipit "checked"); unknownN)  | 
| 33192 | 1017  | 
else if max_genuine = original_max_genuine then  | 
1018  | 
if max_potential = original_max_potential then  | 
|
| 47562 | 1019  | 
(print_t (K "% SZS status Unknown");  | 
| 47560 | 1020  | 
print_nt (fn () =>  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
1021  | 
"Nitpick found no " ^ das_wort_model ^ "." ^  | 
| 
35183
 
8580ba651489
reintroduce structural induction hint in Nitpick
 
blanchet 
parents: 
35181 
diff
changeset
 | 
1022  | 
(if not standard andalso likely_in_struct_induct_step then  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
1023  | 
" This suggests that the induction hypothesis might be \  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
1024  | 
\general enough to prove this subgoal."  | 
| 
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
1025  | 
else  | 
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
1026  | 
"")); if skipped > 0 then unknownN else noneN)  | 
| 33192 | 1027  | 
else  | 
| 47560 | 1028  | 
(print_nt (fn () =>  | 
| 
38123
 
36f649db4a6c
clarify Nitpick's output in case of a potential counterexample
 
blanchet 
parents: 
37928 
diff
changeset
 | 
1029  | 
                 excipit ("could not find a" ^
 | 
| 
 
36f649db4a6c
clarify Nitpick's output in case of a potential counterexample
 
blanchet 
parents: 
37928 
diff
changeset
 | 
1030  | 
(if max_genuine = 1 then  | 
| 
 
36f649db4a6c
clarify Nitpick's output in case of a potential counterexample
 
blanchet 
parents: 
37928 
diff
changeset
 | 
1031  | 
" better " ^ das_wort_model ^ "."  | 
| 
 
36f649db4a6c
clarify Nitpick's output in case of a potential counterexample
 
blanchet 
parents: 
37928 
diff
changeset
 | 
1032  | 
else  | 
| 
 
36f649db4a6c
clarify Nitpick's output in case of a potential counterexample
 
blanchet 
parents: 
37928 
diff
changeset
 | 
1033  | 
"ny better " ^ das_wort_model ^ "s.") ^  | 
| 
 
36f649db4a6c
clarify Nitpick's output in case of a potential counterexample
 
blanchet 
parents: 
37928 
diff
changeset
 | 
1034  | 
" It checked"));  | 
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
1035  | 
potentialN)  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
1036  | 
else if found_really_genuine then  | 
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
1037  | 
genuineN  | 
| 33192 | 1038  | 
else  | 
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
1039  | 
quasi_genuineN  | 
| 33192 | 1040  | 
| run_batches j n (batch :: batches) z =  | 
| 
35671
 
ed2c3830d881
improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
 
blanchet 
parents: 
35665 
diff
changeset
 | 
1041  | 
let val (z as (_, _, max_genuine, _)) = run_batch j n batch z in  | 
| 33192 | 1042  | 
run_batches (j + 1) n (if max_genuine > 0 then batches else []) z  | 
1043  | 
end  | 
|
1044  | 
||
| 48323 | 1045  | 
val batches = chunk_list batch_size (!scopes)  | 
| 33192 | 1046  | 
val outcome_code =  | 
| 
40411
 
36b7ed41ca9f
removed explicit "Interrupt" handling for conformity with async model -- unfortunately the user loses the information about how many scopes were checked, but this needs to be retought with the new interface anyway
 
blanchet 
parents: 
40381 
diff
changeset
 | 
1047  | 
run_batches 0 (length batches) batches  | 
| 
 
36b7ed41ca9f
removed explicit "Interrupt" handling for conformity with async model -- unfortunately the user loses the information about how many scopes were checked, but this needs to be retought with the new interface anyway
 
blanchet 
parents: 
40381 
diff
changeset
 | 
1048  | 
(false, max_potential, max_genuine, 0)  | 
| 33192 | 1049  | 
handle TimeLimit.TimeOut =>  | 
| 47560 | 1050  | 
(print_nt (fn () => excipit "ran out of time after checking");  | 
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
1051  | 
if !met_potential > 0 then potentialN else unknownN)  | 
| 
40341
 
03156257040f
standardize on seconds for Nitpick and Sledgehammer timeouts
 
blanchet 
parents: 
40223 
diff
changeset
 | 
1052  | 
val _ = print_v (fn () =>  | 
| 
 
03156257040f
standardize on seconds for Nitpick and Sledgehammer timeouts
 
blanchet 
parents: 
40223 
diff
changeset
 | 
1053  | 
"Total time: " ^ string_from_time (Timer.checkRealTimer timer) ^  | 
| 
 
03156257040f
standardize on seconds for Nitpick and Sledgehammer timeouts
 
blanchet 
parents: 
40223 
diff
changeset
 | 
1054  | 
".")  | 
| 33192 | 1055  | 
in (outcome_code, !state_ref) end  | 
1056  | 
||
| 
41051
 
2ed1b971fc20
give the inner timeout mechanism a chance, since it gives more precise information to the user
 
blanchet 
parents: 
41048 
diff
changeset
 | 
1057  | 
(* Give the inner timeout a chance. *)  | 
| 
41772
 
27d4c768cf20
make Nitpick's timeout mechanism somewhat more reliable/friendly;
 
blanchet 
parents: 
41278 
diff
changeset
 | 
1058  | 
val timeout_bonus = seconds 1.0  | 
| 
41051
 
2ed1b971fc20
give the inner timeout mechanism a chance, since it gives more precise information to the user
 
blanchet 
parents: 
41048 
diff
changeset
 | 
1059  | 
|
| 43022 | 1060  | 
fun pick_nits_in_term state (params as {debug, timeout, expect, ...}) mode i n
 | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
1061  | 
step subst def_assm_ts nondef_assm_ts orig_t =  | 
| 47670 | 1062  | 
let  | 
1063  | 
val print_nt = if is_mode_nt mode then Output.urgent_message else K ()  | 
|
1064  | 
val print_t = if mode = TPTP then Output.urgent_message else K ()  | 
|
1065  | 
in  | 
|
| 
37213
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1066  | 
if getenv "KODKODI" = "" then  | 
| 
37497
 
71fdbffe3275
distinguish between "unknown" and "no Kodkodi installed" errors
 
blanchet 
parents: 
37273 
diff
changeset
 | 
1067  | 
(* The "expect" argument is deliberately ignored if Kodkodi is missing so  | 
| 
 
71fdbffe3275
distinguish between "unknown" and "no Kodkodi installed" errors
 
blanchet 
parents: 
37273 
diff
changeset
 | 
1068  | 
that the "Nitpick_Examples" can be processed on any machine. *)  | 
| 49024 | 1069  | 
(print_nt (Pretty.string_of (plazy kodkodi_not_installed_message));  | 
| 
37497
 
71fdbffe3275
distinguish between "unknown" and "no Kodkodi installed" errors
 
blanchet 
parents: 
37273 
diff
changeset
 | 
1070  | 
       ("no_kodkodi", state))
 | 
| 
37213
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1071  | 
else  | 
| 
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1072  | 
let  | 
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
1073  | 
val unknown_outcome = (unknownN, state)  | 
| 
37213
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1074  | 
val deadline = Option.map (curry Time.+ (Time.now ())) timeout  | 
| 
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1075  | 
val outcome as (outcome_code, _) =  | 
| 
41051
 
2ed1b971fc20
give the inner timeout mechanism a chance, since it gives more precise information to the user
 
blanchet 
parents: 
41048 
diff
changeset
 | 
1076  | 
time_limit (if debug orelse is_none timeout then NONE  | 
| 
 
2ed1b971fc20
give the inner timeout mechanism a chance, since it gives more precise information to the user
 
blanchet 
parents: 
41048 
diff
changeset
 | 
1077  | 
else SOME (Time.+ (the timeout, timeout_bonus)))  | 
| 43022 | 1078  | 
(pick_them_nits_in_term deadline state params mode i n step subst  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
1079  | 
def_assm_ts nondef_assm_ts) orig_t  | 
| 
37213
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1080  | 
handle TOO_LARGE (_, details) =>  | 
| 47670 | 1081  | 
(print_t "% SZS status Unknown";  | 
1082  | 
                  print_nt ("Limit reached: " ^ details ^ "."); unknown_outcome)
 | 
|
| 
37213
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1083  | 
| TOO_SMALL (_, details) =>  | 
| 47670 | 1084  | 
(print_t "% SZS status Unknown";  | 
1085  | 
                  print_nt ("Limit reached: " ^ details ^ "."); unknown_outcome)
 | 
|
| 
37213
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1086  | 
| Kodkod.SYNTAX (_, details) =>  | 
| 47670 | 1087  | 
(print_t "% SZS status Unknown";  | 
1088  | 
                  print_nt ("Malformed Kodkodi output: " ^ details ^ ".");
 | 
|
| 
37213
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1089  | 
unknown_outcome)  | 
| 
41772
 
27d4c768cf20
make Nitpick's timeout mechanism somewhat more reliable/friendly;
 
blanchet 
parents: 
41278 
diff
changeset
 | 
1090  | 
| TimeLimit.TimeOut =>  | 
| 47670 | 1091  | 
(print_t "% SZS status TimedOut";  | 
1092  | 
print_nt "Nitpick ran out of time."; unknown_outcome)  | 
|
| 
37213
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1093  | 
in  | 
| 
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1094  | 
if expect = "" orelse outcome_code = expect then outcome  | 
| 
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1095  | 
        else error ("Unexpected outcome: " ^ quote outcome_code ^ ".")
 | 
| 
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1096  | 
end  | 
| 
 
efcad7594872
fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
 
blanchet 
parents: 
37146 
diff
changeset
 | 
1097  | 
end  | 
| 33192 | 1098  | 
|
| 42486 | 1099  | 
fun is_fixed_equation ctxt  | 
| 35335 | 1100  | 
                      (Const (@{const_name "=="}, _) $ Free (s, _) $ Const _) =
 | 
| 42486 | 1101  | 
Variable.is_fixed ctxt s  | 
| 35335 | 1102  | 
| is_fixed_equation _ _ = false  | 
1103  | 
fun extract_fixed_frees ctxt (assms, t) =  | 
|
1104  | 
let  | 
|
1105  | 
val (subst, other_assms) =  | 
|
| 42486 | 1106  | 
List.partition (is_fixed_equation ctxt) assms  | 
| 35335 | 1107  | 
|>> map Logic.dest_equals  | 
1108  | 
in (subst, other_assms, subst_atomic subst t) end  | 
|
1109  | 
||
| 43022 | 1110  | 
fun pick_nits_in_subgoal state params mode i step =  | 
| 33192 | 1111  | 
let  | 
1112  | 
val ctxt = Proof.context_of state  | 
|
| 33292 | 1113  | 
val t = state |> Proof.raw_goal |> #goal |> prop_of  | 
| 33192 | 1114  | 
in  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
1115  | 
case Logic.count_prems t of  | 
| 
43020
 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 
blanchet 
parents: 
42959 
diff
changeset
 | 
1116  | 
0 => (Output.urgent_message "No subgoal!"; (noneN, state))  | 
| 
34982
 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 
blanchet 
parents: 
34938 
diff
changeset
 | 
1117  | 
| n =>  | 
| 33192 | 1118  | 
let  | 
| 36406 | 1119  | 
val t = Logic.goal_params t i |> fst  | 
| 33192 | 1120  | 
val assms = map term_of (Assumption.all_assms_of ctxt)  | 
| 35335 | 1121  | 
val (subst, assms, t) = extract_fixed_frees ctxt (assms, t)  | 
| 
47715
 
04400144c6fc
handle TPTP definitions as definitions in Nitpick rather than as axioms
 
blanchet 
parents: 
47670 
diff
changeset
 | 
1122  | 
in pick_nits_in_term state params mode i n step subst [] assms t end  | 
| 33192 | 1123  | 
end  | 
1124  | 
||
1125  | 
end;  |