src/HOL/Tools/Nitpick/nitpick.ML
author wenzelm
Mon, 11 Sep 2023 19:30:48 +0200
changeset 78659 b5f3d1051b13
parent 76501 7956b822f239
child 79799 2746dfc9ceae
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33982
1ae222745c4a fixed paths in Nitpick's ML file headers
blanchet
parents: 33955
diff changeset
     1
(*  Title:      HOL/Tools/Nitpick/nitpick.ML
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
     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
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
     4
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
     5
Finite model generation for HOL formulas using Kodkod.
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
     6
*)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
     7
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
     8
signature NITPICK =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
     9
sig
35711
548d3f16404b added term postprocessor to Nitpick, to provide custom syntax for typedefs
blanchet
parents: 35696
diff changeset
    10
  type term_postprocessor = Nitpick_Model.term_postprocessor
43022
7d3ce43d9464 handle non-auto try case gracefully in Nitpick
blanchet
parents: 43020
diff changeset
    11
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
    12
  datatype mode = Auto_Try | Try | Normal | TPTP
43022
7d3ce43d9464 handle non-auto try case gracefully in Nitpick
blanchet
parents: 43020
diff changeset
    13
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    14
  type params =
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    15
    {cards_assigns: (typ option * int list) list,
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
    16
     maxes_assigns: ((string * typ) option * int list) list,
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
    17
     iters_assigns: ((string * typ) option * int list) list,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    18
     bitss: int list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    19
     bisim_depths: int list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    20
     boxes: (typ option * bool option) list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    21
     finitizes: (typ option * bool option) list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    22
     monos: (typ option * bool option) list,
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
    23
     wfs: ((string * typ) option * bool option) list,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    24
     sat_solver: string,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    25
     falsify: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    26
     debug: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    27
     verbose: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    28
     overlord: bool,
53802
44bc6ff8f350 added "spy" option to Nitpick
blanchet
parents: 53380
diff changeset
    29
     spy: bool,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    30
     user_axioms: bool option,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    31
     assms: bool,
38209
3d1d928dce50 added "whack"
blanchet
parents: 38188
diff changeset
    32
     whacks: term list,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    33
     merge_type_vars: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    34
     binary_ints: bool option,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    35
     destroy_constrs: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    36
     specialize: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    37
     star_linear_preds: bool,
41856
7244589c8ccc added "total_consts" option
blanchet
parents: 41803
diff changeset
    38
     total_consts: bool option,
41876
03f699556955 simplify "need" option's syntax
blanchet
parents: 41875
diff changeset
    39
     needs: term list option,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    40
     peephole_optim: bool,
38124
6538e25cf5dd started implementation of custom sym break
blanchet
parents: 38123
diff changeset
    41
     datatype_sym_break: int,
6538e25cf5dd started implementation of custom sym break
blanchet
parents: 38123
diff changeset
    42
     kodkod_sym_break: int,
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
    43
     timeout: Time.time,
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
    44
     tac_timeout: Time.time,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    45
     max_threads: int,
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
    46
     show_types: bool,
41993
bd6296de1432 reintroduced "show_skolems" option -- useful when too many Skolems are displayed
blanchet
parents: 41992
diff changeset
    47
     show_skolems: bool,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    48
     show_consts: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    49
     evals: term list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    50
     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
    51
     atomss: (typ option * string list) list,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    52
     max_potential: int,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    53
     max_genuine: int,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    54
     batch_size: int,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    55
     expect: string}
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    56
43020
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
    57
  val genuineN : string
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
    58
  val quasi_genuineN : string
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
    59
  val potentialN : string
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
    60
  val noneN : string
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
    61
  val unknownN : string
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    62
  val register_frac_type : string -> (string * string) list -> theory -> theory
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    63
  val unregister_frac_type : string -> theory -> theory
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
    64
  val register_codatatype : typ -> string -> (string * typ) list -> theory ->
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
    65
    theory
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    66
  val unregister_codatatype : typ -> theory -> theory
35711
548d3f16404b added term postprocessor to Nitpick, to provide custom syntax for typedefs
blanchet
parents: 35696
diff changeset
    67
  val register_term_postprocessor :
548d3f16404b added term postprocessor to Nitpick, to provide custom syntax for typedefs
blanchet
parents: 35696
diff changeset
    68
    typ -> term_postprocessor -> theory -> theory
548d3f16404b added term postprocessor to Nitpick, to provide custom syntax for typedefs
blanchet
parents: 35696
diff changeset
    69
  val unregister_term_postprocessor : typ -> theory -> theory
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    70
  val pick_nits_in_term :
43022
7d3ce43d9464 handle non-auto try case gracefully in Nitpick
blanchet
parents: 43020
diff changeset
    71
    Proof.state -> params -> mode -> int -> int -> int -> (term * term) list
58892
20aa19ecf2cc eliminated obsolete Proof.goal_message -- print outcome more directly;
wenzelm
parents: 58843
diff changeset
    72
    -> term list -> term list -> term -> string * string list
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    73
  val pick_nits_in_subgoal :
58892
20aa19ecf2cc eliminated obsolete Proof.goal_message -- print outcome more directly;
wenzelm
parents: 58843
diff changeset
    74
    Proof.state -> params -> mode -> int -> int -> string * string list
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    75
end;
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    76
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    77
structure Nitpick : NITPICK =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    78
struct
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    79
33232
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    80
open Nitpick_Util
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    81
open Nitpick_HOL
35070
96136eb6218f split "nitpick_hol.ML" into two files to make it more manageable;
blanchet
parents: 34998
diff changeset
    82
open Nitpick_Preproc
33232
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    83
open Nitpick_Mono
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    84
open Nitpick_Scope
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    85
open Nitpick_Peephole
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    86
open Nitpick_Rep
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    87
open Nitpick_Nut
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    88
open Nitpick_Kodkod
f93390060bbe internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
blanchet
parents: 33192
diff changeset
    89
open Nitpick_Model
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
    90
34126
8a2c5d7aff51 polished Nitpick's binary integer support etc.;
blanchet
parents: 34124
diff changeset
    91
structure KK = Kodkod
8a2c5d7aff51 polished Nitpick's binary integer support etc.;
blanchet
parents: 34124
diff changeset
    92
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
    93
datatype mode = Auto_Try | Try | Normal | TPTP
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
    94
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
    95
fun is_mode_nt mode = (mode = Normal orelse mode = TPTP)
43022
7d3ce43d9464 handle non-auto try case gracefully in Nitpick
blanchet
parents: 43020
diff changeset
    96
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    97
type params =
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
    98
  {cards_assigns: (typ option * int list) list,
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
    99
   maxes_assigns: ((string * typ) option * int list) list,
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
   100
   iters_assigns: ((string * typ) option * int list) list,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   101
   bitss: int list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   102
   bisim_depths: int list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   103
   boxes: (typ option * bool option) list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   104
   finitizes: (typ option * bool option) list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   105
   monos: (typ option * bool option) list,
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
   106
   wfs: ((string * typ) option * bool option) list,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   107
   sat_solver: string,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   108
   falsify: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   109
   debug: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   110
   verbose: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   111
   overlord: bool,
53802
44bc6ff8f350 added "spy" option to Nitpick
blanchet
parents: 53380
diff changeset
   112
   spy: bool,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   113
   user_axioms: bool option,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   114
   assms: bool,
38209
3d1d928dce50 added "whack"
blanchet
parents: 38188
diff changeset
   115
   whacks: term list,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   116
   merge_type_vars: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   117
   binary_ints: bool option,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   118
   destroy_constrs: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   119
   specialize: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   120
   star_linear_preds: bool,
41856
7244589c8ccc added "total_consts" option
blanchet
parents: 41803
diff changeset
   121
   total_consts: bool option,
41876
03f699556955 simplify "need" option's syntax
blanchet
parents: 41875
diff changeset
   122
   needs: term list option,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   123
   peephole_optim: bool,
38124
6538e25cf5dd started implementation of custom sym break
blanchet
parents: 38123
diff changeset
   124
   datatype_sym_break: int,
6538e25cf5dd started implementation of custom sym break
blanchet
parents: 38123
diff changeset
   125
   kodkod_sym_break: int,
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
   126
   timeout: Time.time,
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
   127
   tac_timeout: Time.time,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   128
   max_threads: int,
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
   129
   show_types: bool,
41993
bd6296de1432 reintroduced "show_skolems" option -- useful when too many Skolems are displayed
blanchet
parents: 41992
diff changeset
   130
   show_skolems: bool,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   131
   show_consts: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   132
   evals: term list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   133
   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
   134
   atomss: (typ option * string list) list,
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   135
   max_potential: int,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   136
   max_genuine: int,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   137
   batch_size: int,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   138
   expect: string}
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   139
43020
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
   140
val genuineN = "genuine"
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
   141
val quasi_genuineN = "quasi_genuine"
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
   142
val potentialN = "potential"
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
   143
val noneN = "none"
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
   144
val unknownN = "unknown"
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
   145
38240
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   146
(* TODO: eliminate these historical aliases *)
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   147
val register_frac_type = Nitpick_HOL.register_frac_type_global
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   148
val unregister_frac_type = Nitpick_HOL.unregister_frac_type_global
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   149
val register_codatatype = Nitpick_HOL.register_codatatype_global
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   150
val unregister_codatatype = Nitpick_HOL.unregister_codatatype_global
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   151
val register_term_postprocessor =
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   152
  Nitpick_Model.register_term_postprocessor_global
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   153
val unregister_term_postprocessor =
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   154
  Nitpick_Model.unregister_term_postprocessor_global
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   155
36390
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   156
type problem_extension =
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   157
  {free_names: nut list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   158
   sel_names: nut list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   159
   nonsel_names: nut list,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   160
   rel_table: nut NameTable.table,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   161
   unsound: bool,
eee4ee6a5cbe remove "show_skolems" option and change style of record declarations
blanchet
parents: 36389
diff changeset
   162
   scope: scope}
39316
b6c4385ab400 change defaults of Auto Nitpick so that it consumes less resources (time and Kodkod threads)
blanchet
parents: 38857
diff changeset
   163
34126
8a2c5d7aff51 polished Nitpick's binary integer support etc.;
blanchet
parents: 34124
diff changeset
   164
type rich_problem = KK.problem * problem_extension
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   165
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   166
fun pretties_for_formulas _ _ [] = []
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   167
  | pretties_for_formulas ctxt s ts =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   168
    [Pretty.str (s ^ plural_s_for_list ts ^ ":"),
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   169
     Pretty.indent indent_size (Pretty.chunks
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   170
         (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
   171
                   Pretty.block [t |> shorten_names_in_term
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   172
                                   |> Syntax.pretty_term ctxt])
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   173
               (length ts downto 1) ts))]
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   174
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
   175
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
   176
val max_unsound_delay_percent = 2
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   177
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
   178
fun unsound_delay_for_timeout timeout =
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
   179
  Int.max (0, Int.min (max_unsound_delay_ms,
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
   180
                       Time.toMilliseconds timeout
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
   181
                       * max_unsound_delay_percent div 100))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   182
34123
c4988215a691 distinguish better between "complete" (vs. incomplete) types and "concrete" (vs. abstract) types in Nitpick;
blanchet
parents: 34121
diff changeset
   183
fun none_true assigns = forall (not_equal (SOME true) o snd) assigns
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   184
74380
79ac28db185c clarified antiquotations;
wenzelm
parents: 73387
diff changeset
   185
fun has_lonely_bool_var \<^Const_>\<open>Pure.conjunction for \<^Const_>\<open>Trueprop for \<open>Free _\<close>\<close> _\<close> = true
41048
d5ebe94248ad added a hint when the user obviously just forgot a colon after the lemma's name
blanchet
parents: 41007
diff changeset
   186
  | 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
   187
34038
a2736debeabd make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
blanchet
parents: 33982
diff changeset
   188
val syntactic_sorts =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 63693
diff changeset
   189
  \<^sort>\<open>{default,zero,one,plus,minus,uminus,times,inverse,abs,sgn,ord,equal}\<close> @
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 63693
diff changeset
   190
  \<^sort>\<open>numeral\<close>
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
   191
34038
a2736debeabd make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
blanchet
parents: 33982
diff changeset
   192
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
   193
    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
   194
  | 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
   195
val has_syntactic_sorts = exists_type (exists_subtype has_tfree_syntactic_sort)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   196
59432
wenzelm
parents: 59429
diff changeset
   197
fun plazy f = Pretty.para (f ())
33568
532b915afa14 don't run Nitpick at all if Kodkodi is not installed (as indicated by the $KODKODI variable)
blanchet
parents: 33566
diff changeset
   198
43022
7d3ce43d9464 handle non-auto try case gracefully in Nitpick
blanchet
parents: 43020
diff changeset
   199
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
   200
                           subst def_assm_ts nondef_assm_ts orig_t =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   201
  let
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   202
    val time_start = Time.now ()
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
   203
    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
   204
    val ctxt = Proof.context_of state
58928
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58892
diff changeset
   205
    val keywords = Thy_Header.get_keywords thy
34124
c4628a1dcf75 added support for binary nat/int representation to Nitpick
blanchet
parents: 34123
diff changeset
   206
    val {cards_assigns, maxes_assigns, iters_assigns, bitss, bisim_depths,
55888
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   207
         boxes, finitizes, monos, wfs, sat_solver, falsify, debug, verbose,
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   208
         overlord, spy, user_axioms, assms, whacks, merge_type_vars,
38209
3d1d928dce50 added "whack"
blanchet
parents: 38188
diff changeset
   209
         binary_ints, destroy_constrs, specialize, star_linear_preds,
41875
e3cd0dce9b1a renamed "preconstr" option "need"
blanchet
parents: 41872
diff changeset
   210
         total_consts, needs, peephole_optim, datatype_sym_break,
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
   211
         kodkod_sym_break, tac_timeout, max_threads, show_types, show_skolems,
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
   212
         show_consts, evals, formats, atomss, max_potential, max_genuine,
60310
932221b62e89 removed model checks from Nitpick
blanchet
parents: 60023
diff changeset
   213
         batch_size, ...} = params
58892
20aa19ecf2cc eliminated obsolete Proof.goal_message -- print outcome more directly;
wenzelm
parents: 58843
diff changeset
   214
    val outcome = Synchronized.var "Nitpick.outcome" (Queue.empty: string Queue.T)
20aa19ecf2cc eliminated obsolete Proof.goal_message -- print outcome more directly;
wenzelm
parents: 58843
diff changeset
   215
    fun pprint print prt =
43022
7d3ce43d9464 handle non-auto try case gracefully in Nitpick
blanchet
parents: 43020
diff changeset
   216
      if mode = Auto_Try then
59184
830bb7ddb3ab explicit message channels for "state", "information";
wenzelm
parents: 58928
diff changeset
   217
        Synchronized.change outcome (Queue.enqueue (Pretty.string_of prt))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   218
      else
58892
20aa19ecf2cc eliminated obsolete Proof.goal_message -- print outcome more directly;
wenzelm
parents: 58843
diff changeset
   219
        print (Pretty.string_of prt)
58843
521cea5fa777 discontinued obsolete Output.urgent_message;
wenzelm
parents: 57996
diff changeset
   220
    val pprint_a = pprint writeln
521cea5fa777 discontinued obsolete Output.urgent_message;
wenzelm
parents: 57996
diff changeset
   221
    fun pprint_nt f = () |> is_mode_nt mode ? pprint writeln o f
521cea5fa777 discontinued obsolete Output.urgent_message;
wenzelm
parents: 57996
diff changeset
   222
    fun pprint_v f = () |> verbose ? pprint writeln o f
46086
096697aec8a7 rationalized output (a bit)
blanchet
parents: 45666
diff changeset
   223
    fun pprint_d f = () |> debug ? pprint tracing o f
59432
wenzelm
parents: 59429
diff changeset
   224
    val print = pprint writeln o Pretty.para
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   225
    fun print_t f = () |> mode = TPTP ? print o f
39345
062c10ff848c remove unreferenced identifiers
blanchet
parents: 39316
diff changeset
   226
(*
46086
096697aec8a7 rationalized output (a bit)
blanchet
parents: 45666
diff changeset
   227
    val print_g = pprint tracing o Pretty.str
39345
062c10ff848c remove unreferenced identifiers
blanchet
parents: 39316
diff changeset
   228
*)
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   229
    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
   230
    val print_v = pprint_v o K o plazy
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   231
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   232
    fun check_deadline () =
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   233
      let val t = Time.now () in
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   234
        if Time.compare (t, deadline) <> LESS
62826
eb94e570c1a4 prefer infix operations;
wenzelm
parents: 62519
diff changeset
   235
        then raise Timeout.TIMEOUT (t - time_start)
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   236
        else ()
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   237
      end
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   238
47715
04400144c6fc handle TPTP definitions as definitions in Nitpick rather than as axioms
blanchet
parents: 47670
diff changeset
   239
    val (def_assm_ts, nondef_assm_ts) =
04400144c6fc handle TPTP definitions as definitions in Nitpick rather than as axioms
blanchet
parents: 47670
diff changeset
   240
      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
   241
      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
   242
    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
   243
      if step = 0 then
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   244
        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
   245
      else
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   246
        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
   247
            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
   248
                (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
   249
                   "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
   250
                 else
47715
04400144c6fc handle TPTP definitions as definitions in Nitpick rather than as axioms
blanchet
parents: 47670
diff changeset
   251
                   "goal")) [Logic.list_implies (nondef_assm_ts, orig_t)]))
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 63693
diff changeset
   252
    val _ = spying spy (fn () => (state, i, "starting " ^ \<^make_string> mode ^ " mode"))
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   253
    val _ = print_v (prefix "Timestamp: " o Date.fmt "%H:%M:%S"
41278
8e1cde88aae6 added a timestamp to Nitpick in verbose mode for debugging purposes;
blanchet
parents: 41052
diff changeset
   254
                     o Date.fromTimeLocal o Time.now)
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 63693
diff changeset
   255
    val neg_t = if falsify then Logic.mk_implies (orig_t, \<^prop>\<open>False\<close>)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   256
                else orig_t
47715
04400144c6fc handle TPTP definitions as definitions in Nitpick rather than as axioms
blanchet
parents: 47670
diff changeset
   257
    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
   258
    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
   259
      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
   260
      else []
9e367f1c9570 robust handling of types occurring in "eval" and "preconstr" options but not in the goal
blanchet
parents: 41868
diff changeset
   261
    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
   262
    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
   263
    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
   264
    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
   265
    val evals = evals |> map merge_tfrees
41876
03f699556955 simplify "need" option's syntax
blanchet
parents: 41875
diff changeset
   266
    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
   267
    val conj_ts = neg_t :: def_assm_ts @ nondef_assm_ts @ evals @ these needs
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   268
    val original_max_potential = max_potential
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   269
    val original_max_genuine = max_genuine
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   270
    val max_bisim_depth = fold Integer.max bisim_depths ~1
55888
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   271
    val case_names = case_const_names ctxt
47715
04400144c6fc handle TPTP definitions as definitions in Nitpick rather than as axioms
blanchet
parents: 47670
diff changeset
   272
    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
   273
    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
   274
    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
   275
    val nondef_table = const_nondef_table nondefs
35335
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   276
    val simp_table = Unsynchronized.ref (const_simp_table ctxt subst)
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   277
    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
   278
    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
   279
    val nondefs =
59970
e9f73d87d904 proper context for Object_Logic operations;
wenzelm
parents: 59582
diff changeset
   280
      nondefs |> filter_out (is_choice_spec_axiom ctxt 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
   281
    val intro_table = inductive_intro_table ctxt subst def_tables
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   282
    val ground_thm_table = ground_theorem_table thy
38240
a44d108a8d39 local versions of Nitpick.register_xxx functions
blanchet
parents: 38214
diff changeset
   283
    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
   284
    val hol_ctxt as {wf_cache, ...} =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   285
      {thy = thy, ctxt = ctxt, max_bisim_depth = max_bisim_depth, boxes = boxes,
55888
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   286
       wfs = wfs, user_axioms = user_axioms, debug = debug, whacks = whacks,
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   287
       binary_ints = binary_ints, destroy_constrs = destroy_constrs,
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   288
       specialize = specialize, star_linear_preds = star_linear_preds,
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   289
       total_consts = total_consts, needs = needs, tac_timeout = tac_timeout,
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   290
       evals = evals, 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
   291
       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
   292
       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
   293
       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
   294
       ersatz_table = ersatz_table, skolems = Unsynchronized.ref [],
10accf397ab6 use "Spec_Rules" for finding axioms -- more reliable and cleaner
blanchet
parents: 42361
diff changeset
   295
       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
   296
       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
   297
       constr_cache = Unsynchronized.ref []}
41789
7c7b68b06c1a don't distinguish between "fixes" and other free variables -- this confuses users
blanchet
parents: 41772
diff changeset
   298
    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
   299
    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
   300
    val _ = null (fold Term.add_tvars conj_ts []) orelse
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   301
            error "Nitpick cannot handle goals with schematic type variables"
41875
e3cd0dce9b1a renamed "preconstr" option "need"
blanchet
parents: 41872
diff changeset
   302
    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
   303
         no_poly_user_axioms, binarize) =
47715
04400144c6fc handle TPTP definitions as definitions in Nitpick rather than as axioms
blanchet
parents: 47670
diff changeset
   304
      preprocess_formulas hol_ctxt nondef_assm_ts neg_t
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   305
    val got_all_user_axioms =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   306
      got_all_mono_user_axioms andalso no_poly_user_axioms
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   307
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   308
    fun print_wf (x, (gfp, wf)) =
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   309
      pprint_nt (fn () => Pretty.blk (0,
60023
f3e70d74a686 proper Pretty.brk -- redundant spaces do not survive Pretty.text (see also 42b7b76b37b8, e06eabc421e7);
wenzelm
parents: 59970
diff changeset
   310
          Pretty.text ("The " ^ (if gfp then "co" else "") ^ "inductive predicate") @
f3e70d74a686 proper Pretty.brk -- redundant spaces do not survive Pretty.text (see also 42b7b76b37b8, e06eabc421e7);
wenzelm
parents: 59970
diff changeset
   311
          [Pretty.brk 1, Pretty.quote (Syntax.pretty_term ctxt (Const x)), Pretty.brk 1] @
59432
wenzelm
parents: 59429
diff changeset
   312
          Pretty.text (if wf then
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   313
                   "was proved well-founded; Nitpick can compute it \
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   314
                   \efficiently"
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   315
                 else
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   316
                   "could not be proved well-founded; Nitpick might need to \
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   317
                   \unroll it")))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   318
    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
   319
    val das_wort_formula = if falsify then "Negated conjecture" else "Formula"
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   320
    val _ =
35386
45a4e19d3ebd more work on the new monotonicity stuff in Nitpick
blanchet
parents: 35385
diff changeset
   321
      pprint_d (fn () => Pretty.chunks
38171
5f2ea92319e0 fix soundness bug w.r.t. "Suc" with "binary_ints"
blanchet
parents: 38170
diff changeset
   322
          (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
   323
           pretties_for_formulas ctxt "Relevant definitional axiom" def_ts @
45a4e19d3ebd more work on the new monotonicity stuff in Nitpick
blanchet
parents: 35385
diff changeset
   324
           pretties_for_formulas ctxt "Relevant nondefinitional axiom"
45a4e19d3ebd more work on the new monotonicity stuff in Nitpick
blanchet
parents: 35385
diff changeset
   325
                                 (tl nondef_ts)))
45a4e19d3ebd more work on the new monotonicity stuff in Nitpick
blanchet
parents: 35385
diff changeset
   326
    val _ = List.app (ignore o Term.type_of) (nondef_ts @ def_ts)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   327
            handle TYPE (_, Ts, ts) =>
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   328
                   raise TYPE ("Nitpick.pick_them_nits_in_term", Ts, ts)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   329
41801
ed77524f3429 first steps in implementing "fix_datatype_vals" optimization
blanchet
parents: 41793
diff changeset
   330
    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
   331
    val def_us = def_ts |> map (nut_from_term hol_ctxt DefEq)
41875
e3cd0dce9b1a renamed "preconstr" option "need"
blanchet
parents: 41872
diff changeset
   332
    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
   333
    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
   334
      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
   335
    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
   336
      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
   337
    val sound_finitizes = none_true finitizes
33558
a2db56854b83 optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
blanchet
parents: 33556
diff changeset
   338
(*
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
   339
    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
   340
      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
   341
*)
a2db56854b83 optimized Nitpick's encoding and rendering of datatypes whose constructors don't appear in the problem
blanchet
parents: 33556
diff changeset
   342
34121
5e831d805118 get rid of polymorphic equality in Nitpick's code + a few minor cleanups
blanchet
parents: 34039
diff changeset
   343
    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
   344
    fun monotonicity_message Ts extra =
58928
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58892
diff changeset
   345
      let val pretties = map (pretty_maybe_quote keywords o pretty_for_type ctxt) Ts in
38188
7f12a03c513c better "Pretty" handling
blanchet
parents: 38182
diff changeset
   346
        Pretty.blk (0,
60023
f3e70d74a686 proper Pretty.brk -- redundant spaces do not survive Pretty.text (see also 42b7b76b37b8, e06eabc421e7);
wenzelm
parents: 59970
diff changeset
   347
          Pretty.text ("The type" ^ plural_s_for_list pretties) @ [Pretty.brk 1] @
f3e70d74a686 proper Pretty.brk -- redundant spaces do not survive Pretty.text (see also 42b7b76b37b8, e06eabc421e7);
wenzelm
parents: 59970
diff changeset
   348
          pretty_serial_commas "and" pretties @ [Pretty.brk 1] @
f3e70d74a686 proper Pretty.brk -- redundant spaces do not survive Pretty.text (see also 42b7b76b37b8, e06eabc421e7);
wenzelm
parents: 59970
diff changeset
   349
          Pretty.text (
42959
ee829022381d use \<emdash> rather than \<midarrow>
blanchet
parents: 42486
diff changeset
   350
                 (if none_true monos then
ee829022381d use \<emdash> rather than \<midarrow>
blanchet
parents: 42486
diff changeset
   351
                    "passed the monotonicity test"
ee829022381d use \<emdash> rather than \<midarrow>
blanchet
parents: 42486
diff changeset
   352
                  else
ee829022381d use \<emdash> rather than \<midarrow>
blanchet
parents: 42486
diff changeset
   353
                    (if length pretties = 1 then "is" else "are") ^
ee829022381d use \<emdash> rather than \<midarrow>
blanchet
parents: 42486
diff changeset
   354
                    " considered monotonic") ^
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   355
                 "; " ^ extra))
35385
29f81babefd7 improved precision of infinite "shallow" datatypes in Nitpick;
blanchet
parents: 35384
diff changeset
   356
      end
35665
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   357
    fun is_type_fundamentally_monotonic T =
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   358
      (is_data_type ctxt 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
   359
       (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
   360
      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
   361
    fun is_type_actually_monotonic T =
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   362
      Timeout.apply tac_timeout (formulas_monotonic hol_ctxt binarize T)
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 53815
diff changeset
   363
                          (nondef_ts, def_ts)
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   364
        handle Timeout.TIMEOUT _ => false
35665
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   365
    fun is_type_kind_of_monotonic T =
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   366
      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
   367
        SOME (SOME false) => false
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   368
      | _ => is_type_actually_monotonic T
34936
c4f04bee79f3 some work on Nitpick's support for quotient types;
blanchet
parents: 34935
diff changeset
   369
    fun is_type_monotonic T =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   370
      unique_scope orelse
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   371
      case triple_lookup (type_match thy) monos T of
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   372
        SOME (SOME b) => b
35665
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   373
      | _ => is_type_fundamentally_monotonic T orelse
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   374
             is_type_actually_monotonic T
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   375
    fun is_deep_data_type_finitizable T =
41793
c7a2669ae75d tweaked Nitpick based on C++ memory model example
blanchet
parents: 41791
diff changeset
   376
      triple_lookup (type_match thy) finitizes T = SOME (SOME true)
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 63693
diff changeset
   377
    fun is_shallow_data_type_finitizable (T as Type (\<^type_name>\<open>fun_box\<close>, _)) =
35665
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   378
        is_type_kind_of_monotonic T
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   379
      | is_shallow_data_type_finitizable T =
35665
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   380
        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
   381
          SOME (SOME b) => b
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   382
        | _ => is_type_kind_of_monotonic T
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   383
    fun is_data_type_deep T =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 63693
diff changeset
   384
      T = \<^typ>\<open>unit\<close> orelse T = nat_T orelse is_word_type T orelse
35385
29f81babefd7 improved precision of infinite "shallow" datatypes in Nitpick;
blanchet
parents: 35384
diff changeset
   385
      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
   386
    val all_Ts = ground_types_in_terms hol_ctxt binarize (nondef_ts @ def_ts)
35408
b48ab741683b modernized structure Term_Ord;
wenzelm
parents: 35386
diff changeset
   387
                 |> sort Term_Ord.typ_ord
38214
8164c91039ea added a friendly warning
blanchet
parents: 38212
diff changeset
   388
    val _ =
8164c91039ea added a friendly warning
blanchet
parents: 38212
diff changeset
   389
      if verbose andalso binary_ints = SOME true andalso
8164c91039ea added a friendly warning
blanchet
parents: 38212
diff changeset
   390
         exists (member (op =) [nat_T, int_T]) all_Ts then
8164c91039ea added a friendly warning
blanchet
parents: 38212
diff changeset
   391
        print_v (K "The option \"binary_ints\" will be ignored because of the \
8164c91039ea added a friendly warning
blanchet
parents: 38212
diff changeset
   392
                   \presence of rationals, reals, \"Suc\", \"gcd\", or \"lcm\" \
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   393
                   \in the problem")
38214
8164c91039ea added a friendly warning
blanchet
parents: 38212
diff changeset
   394
      else
8164c91039ea added a friendly warning
blanchet
parents: 38212
diff changeset
   395
        ()
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
   396
    val (mono_Ts, nonmono_Ts) = List.partition is_type_monotonic all_Ts
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   397
    val _ =
34936
c4f04bee79f3 some work on Nitpick's support for quotient types;
blanchet
parents: 34935
diff changeset
   398
      if verbose andalso not unique_scope then
35665
ff2bf50505ab added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
blanchet
parents: 35408
diff changeset
   399
        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
   400
          [] => ()
c4f04bee79f3 some work on Nitpick's support for quotient types;
blanchet
parents: 34935
diff changeset
   401
        | interesting_mono_Ts =>
38188
7f12a03c513c better "Pretty" handling
blanchet
parents: 38182
diff changeset
   402
          pprint_v (K (monotonicity_message interesting_mono_Ts
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   403
                          "Nitpick might be able to skip some scopes"))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   404
      else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   405
        ()
35385
29f81babefd7 improved precision of infinite "shallow" datatypes in Nitpick;
blanchet
parents: 35384
diff changeset
   406
    val (deep_dataTs, shallow_dataTs) =
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   407
      all_Ts |> filter (is_data_type ctxt)
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   408
             |> List.partition is_data_type_deep
35385
29f81babefd7 improved precision of infinite "shallow" datatypes in Nitpick;
blanchet
parents: 35384
diff changeset
   409
    val finitizable_dataTs =
41793
c7a2669ae75d tweaked Nitpick based on C++ memory model example
blanchet
parents: 41791
diff changeset
   410
      (deep_dataTs |> filter_out (is_finite_type hol_ctxt)
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   411
                   |> filter is_deep_data_type_finitizable) @
41793
c7a2669ae75d tweaked Nitpick based on C++ memory model example
blanchet
parents: 41791
diff changeset
   412
      (shallow_dataTs |> filter_out (is_finite_type hol_ctxt)
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   413
                      |> filter is_shallow_data_type_finitizable)
35385
29f81babefd7 improved precision of infinite "shallow" datatypes in Nitpick;
blanchet
parents: 35384
diff changeset
   414
    val _ =
29f81babefd7 improved precision of infinite "shallow" datatypes in Nitpick;
blanchet
parents: 35384
diff changeset
   415
      if verbose andalso not (null finitizable_dataTs) then
38188
7f12a03c513c better "Pretty" handling
blanchet
parents: 38182
diff changeset
   416
        pprint_v (K (monotonicity_message finitizable_dataTs
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   417
                         "Nitpick can use a more precise finite encoding"))
35385
29f81babefd7 improved precision of infinite "shallow" datatypes in Nitpick;
blanchet
parents: 35384
diff changeset
   418
      else
29f81babefd7 improved precision of infinite "shallow" datatypes in Nitpick;
blanchet
parents: 35384
diff changeset
   419
        ()
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   420
(*
36128
a3d8d5329438 make Nitpick output everything to tracing in debug mode;
blanchet
parents: 36126
diff changeset
   421
    val _ = print_g "Monotonic types:"
a3d8d5329438 make Nitpick output everything to tracing in debug mode;
blanchet
parents: 36126
diff changeset
   422
    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
   423
    val _ = print_g "Nonmonotonic types:"
a3d8d5329438 make Nitpick output everything to tracing in debug mode;
blanchet
parents: 36126
diff changeset
   424
    val _ = List.app (print_g o string_for_type ctxt) nonmono_Ts
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   425
*)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   426
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   427
    val incremental = Int.max (max_potential, max_genuine) >= 2
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   428
    val actual_sat_solver =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   429
      if sat_solver <> "smart" then
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   430
        if incremental andalso
34936
c4f04bee79f3 some work on Nitpick's support for quotient types;
blanchet
parents: 34935
diff changeset
   431
           not (member (op =) (Kodkod_SAT.configured_sat_solvers true)
35333
f61de25f71f9 distinguish between Kodkodi warnings and errors in Nitpick;
blanchet
parents: 35280
diff changeset
   432
                       sat_solver) then
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   433
          (print_nt (K ("An incremental SAT solver is required: \"SAT4J\" will \
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   434
                        \be used instead of " ^ quote sat_solver));
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   435
           "SAT4J")
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   436
        else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   437
          sat_solver
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   438
      else
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   439
        Kodkod_SAT.smart_sat_solver_name incremental
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   440
    val _ =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   441
      if sat_solver = "smart" then
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   442
        print_v (fn () =>
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   443
            "Using SAT solver " ^ quote actual_sat_solver ^ "\nThe following" ^
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   444
            (if incremental then " incremental " else " ") ^
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   445
            "solvers are configured: " ^
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   446
            commas_quote (Kodkod_SAT.configured_sat_solvers incremental))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   447
      else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   448
        ()
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   449
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   450
    val too_big_scopes = Unsynchronized.ref []
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   451
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
   452
    fun problem_for_scope unsound
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   453
            (scope as {card_assigns, bits, bisim_depth, data_types, ofs, ...}) =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   454
      let
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   455
        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
   456
                            (!too_big_scopes)) orelse
c4f04bee79f3 some work on Nitpick's support for quotient types;
blanchet
parents: 34935
diff changeset
   457
                raise TOO_LARGE ("Nitpick.pick_them_nits_in_term.\
c4f04bee79f3 some work on Nitpick's support for quotient types;
blanchet
parents: 34935
diff changeset
   458
                                 \problem_for_scope", "too large scope")
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   459
(*
36128
a3d8d5329438 make Nitpick output everything to tracing in debug mode;
blanchet
parents: 36126
diff changeset
   460
        val _ = print_g "Offsets:"
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   461
        val _ = List.app (fn (T, j0) =>
36128
a3d8d5329438 make Nitpick output everything to tracing in debug mode;
blanchet
parents: 36126
diff changeset
   462
                             print_g (string_for_type ctxt T ^ " = " ^
a3d8d5329438 make Nitpick output everything to tracing in debug mode;
blanchet
parents: 36126
diff changeset
   463
                                    string_of_int j0))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   464
                         (Typtab.dest ofs)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   465
*)
41858
37ce158d6266 if "total_consts" is set, report cex's as quasi-genuine
blanchet
parents: 41856
diff changeset
   466
        val effective_total_consts =
41856
7244589c8ccc added "total_consts" option
blanchet
parents: 41803
diff changeset
   467
          case total_consts of
7244589c8ccc added "total_consts" option
blanchet
parents: 41803
diff changeset
   468
            SOME b => b
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   469
          | NONE => forall (is_exact_type data_types true) all_Ts
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   470
        val main_j0 = offset_of_type ofs bool_T
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   471
        val (nat_card, nat_j0) = spec_of_type scope nat_T
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   472
        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
   473
        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
   474
                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
   475
                           "bad offsets")
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   476
        val kk = kodkod_constrs peephole_optim nat_card int_card main_j0
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   477
        val (free_names, rep_table) =
38170
d74b66ec02ce handle free variables even more gracefully;
blanchet
parents: 38169
diff changeset
   478
          choose_reps_for_free_vars scope pseudo_frees free_names
d74b66ec02ce handle free variables even more gracefully;
blanchet
parents: 38169
diff changeset
   479
                                    NameTable.empty
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   480
        val (sel_names, rep_table) = choose_reps_for_all_sels scope rep_table
38170
d74b66ec02ce handle free variables even more gracefully;
blanchet
parents: 38169
diff changeset
   481
        val (nonsel_names, rep_table) =
41858
37ce158d6266 if "total_consts" is set, report cex's as quasi-genuine
blanchet
parents: 41856
diff changeset
   482
          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
   483
                                 rep_table
38182
747f8077b09a more helpful message
blanchet
parents: 38171
diff changeset
   484
        val (guiltiest_party, min_highest_arity) =
747f8077b09a more helpful message
blanchet
parents: 38171
diff changeset
   485
          NameTable.fold (fn (name, R) => fn (s, n) =>
747f8077b09a more helpful message
blanchet
parents: 38171
diff changeset
   486
                             let val n' = arity_of_rep R in
747f8077b09a more helpful message
blanchet
parents: 38171
diff changeset
   487
                               if n' > n then (nickname_of name, n') else (s, n)
747f8077b09a more helpful message
blanchet
parents: 38171
diff changeset
   488
                             end) rep_table ("", 1)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   489
        val min_univ_card =
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   490
          NameTable.fold (Integer.max o min_univ_card_of_rep o snd) rep_table
34126
8a2c5d7aff51 polished Nitpick's binary integer support etc.;
blanchet
parents: 34124
diff changeset
   491
                         (univ_card nat_card int_card main_j0 [] KK.True)
52202
d5c80b12a1f2 no confusing special behavior in debug mode
blanchet
parents: 52031
diff changeset
   492
        val _ = check_arity guiltiest_party min_univ_card min_highest_arity
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   493
41802
7592a165fa0b more work on "fix_datatype_vals"
blanchet
parents: 41801
diff changeset
   494
        val def_us =
7592a165fa0b more work on "fix_datatype_vals"
blanchet
parents: 41801
diff changeset
   495
          def_us |> map (choose_reps_in_nut scope unsound rep_table true)
7592a165fa0b more work on "fix_datatype_vals"
blanchet
parents: 41801
diff changeset
   496
        val nondef_us =
7592a165fa0b more work on "fix_datatype_vals"
blanchet
parents: 41801
diff changeset
   497
          nondef_us |> map (choose_reps_in_nut scope unsound rep_table false)
41875
e3cd0dce9b1a renamed "preconstr" option "need"
blanchet
parents: 41872
diff changeset
   498
        val need_us =
e3cd0dce9b1a renamed "preconstr" option "need"
blanchet
parents: 41872
diff changeset
   499
          need_us |> map (choose_reps_in_nut scope unsound rep_table false)
33745
daf236998f82 comment out debugging code in Nitpick
blanchet
parents: 33744
diff changeset
   500
(*
36128
a3d8d5329438 make Nitpick output everything to tracing in debug mode;
blanchet
parents: 36126
diff changeset
   501
        val _ = List.app (print_g o string_for_nut ctxt)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   502
                         (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
   503
                          nondef_us @ def_us @ need_us)
33745
daf236998f82 comment out debugging code in Nitpick
blanchet
parents: 33744
diff changeset
   504
*)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   505
        val (free_rels, pool, rel_table) =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   506
          rename_free_vars free_names initial_pool NameTable.empty
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   507
        val (sel_rels, pool, rel_table) =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   508
          rename_free_vars sel_names pool rel_table
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   509
        val (other_rels, pool, rel_table) =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   510
          rename_free_vars nonsel_names pool rel_table
41802
7592a165fa0b more work on "fix_datatype_vals"
blanchet
parents: 41801
diff changeset
   511
        val nondef_us = nondef_us |> map (rename_vars_in_nut pool rel_table)
7592a165fa0b more work on "fix_datatype_vals"
blanchet
parents: 41801
diff changeset
   512
        val def_us = def_us |> map (rename_vars_in_nut pool rel_table)
41875
e3cd0dce9b1a renamed "preconstr" option "need"
blanchet
parents: 41872
diff changeset
   513
        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
   514
        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
   515
        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
   516
        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
   517
        val comment = (if unsound then "unsound" else "sound") ^ "\n" ^
72195
16f2288b30cf avoid odd PIDE markup, notably in kokodi input;
wenzelm
parents: 69597
diff changeset
   518
                      multiline_string_for_scope scope
34998
5e492a862b34 four changes to Nitpick:
blanchet
parents: 34982
diff changeset
   519
        val kodkod_sat_solver =
76501
7956b822f239 use timeout with MiniSat
blanchet
parents: 74844
diff changeset
   520
          Kodkod_SAT.sat_solver_spec (deadline - Time.now ()) actual_sat_solver
7956b822f239 use timeout with MiniSat
blanchet
parents: 74844
diff changeset
   521
          |> snd
34124
c4628a1dcf75 added support for binary nat/int representation to Nitpick
blanchet
parents: 34123
diff changeset
   522
        val bit_width = if bits = 0 then 16 else bits + 1
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   523
        val delay =
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   524
          if unsound then
62826
eb94e570c1a4 prefer infix operations;
wenzelm
parents: 62519
diff changeset
   525
            unsound_delay_for_timeout (deadline - Time.now ())
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   526
          else
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   527
            0
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   528
        val settings = [("solver", commas_quote kodkod_sat_solver),
34124
c4628a1dcf75 added support for binary nat/int representation to Nitpick
blanchet
parents: 34123
diff changeset
   529
                        ("bit_width", string_of_int bit_width),
38124
6538e25cf5dd started implementation of custom sym break
blanchet
parents: 38123
diff changeset
   530
                        ("symmetry_breaking", string_of_int kodkod_sym_break),
36386
2132f15b366f Fruhjahrsputz: remove three mostly useless Nitpick options
blanchet
parents: 36385
diff changeset
   531
                        ("sharing", "3"),
2132f15b366f Fruhjahrsputz: remove three mostly useless Nitpick options
blanchet
parents: 36385
diff changeset
   532
                        ("flatten", "false"),
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   533
                        ("delay", signed_string_of_int delay)]
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   534
        val plain_rels = free_rels @ other_rels
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   535
        val plain_bounds = map (bound_for_plain_rel ctxt debug) plain_rels
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   536
        val plain_axioms = map (declarative_axiom_for_plain_rel kk) plain_rels
41995
03c2d29ec790 optimize Kodkod bounds when "need" is specified
blanchet
parents: 41993
diff changeset
   537
        val need_vals =
03c2d29ec790 optimize Kodkod bounds when "need" is specified
blanchet
parents: 41993
diff changeset
   538
          map (fn dtype as {typ, ...} =>
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   539
                  (typ, needed_values_for_data_type need_us ofs dtype))
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   540
              data_types
41995
03c2d29ec790 optimize Kodkod bounds when "need" is specified
blanchet
parents: 41993
diff changeset
   541
        val sel_bounds =
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   542
          map (bound_for_sel_rel ctxt debug need_vals data_types) sel_rels
35190
ce653cc27a94 make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
blanchet
parents: 35185
diff changeset
   543
        val dtype_axioms =
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   544
          declarative_axioms_for_data_types hol_ctxt binarize need_us need_vals
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   545
              datatype_sym_break bits ofs kk rel_table data_types
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   546
        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
   547
        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
   548
                                     (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
   549
                                 main_j0 |> bits > 0 ? Integer.add (bits + 1))
38126
8031d099379a added manual symmetry breaking for datatypes
blanchet
parents: 38124
diff changeset
   550
        val (built_in_bounds, built_in_axioms) =
39345
062c10ff848c remove unreferenced identifiers
blanchet
parents: 39316
diff changeset
   551
          bounds_and_axioms_for_built_in_rels_in_formulas debug univ_card
062c10ff848c remove unreferenced identifiers
blanchet
parents: 39316
diff changeset
   552
              nat_card int_card main_j0 (formula :: declarative_axioms)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   553
        val bounds = built_in_bounds @ plain_bounds @ sel_bounds
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   554
                     |> not debug ? merge_bounds
38126
8031d099379a added manual symmetry breaking for datatypes
blanchet
parents: 38124
diff changeset
   555
        val axioms = built_in_axioms @ declarative_axioms
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   556
        val highest_arity =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   557
          fold Integer.max (map (fst o fst) (maps fst bounds)) 0
38126
8031d099379a added manual symmetry breaking for datatypes
blanchet
parents: 38124
diff changeset
   558
        val formula = fold_rev s_and axioms formula
34124
c4628a1dcf75 added support for binary nat/int representation to Nitpick
blanchet
parents: 34123
diff changeset
   559
        val _ = if bits = 0 then () else check_bits bits formula
52202
d5c80b12a1f2 no confusing special behavior in debug mode
blanchet
parents: 52031
diff changeset
   560
        val _ = if formula = KK.False then ()
38182
747f8077b09a more helpful message
blanchet
parents: 38171
diff changeset
   561
                else check_arity "" univ_card highest_arity
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   562
      in
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   563
        SOME ({comment = comment, settings = settings, univ_card = univ_card,
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   564
               tuple_assigns = [], bounds = bounds,
35280
54ab4921f826 fixed a few bugs in Nitpick and removed unreferenced variables
blanchet
parents: 35220
diff changeset
   565
               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
   566
                            else pow_of_two_int_bounds bits main_j0,
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   567
               expr_assigns = [], formula = formula},
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   568
              {free_names = free_names, sel_names = sel_names,
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   569
               nonsel_names = nonsel_names, rel_table = rel_table,
35386
45a4e19d3ebd more work on the new monotonicity stuff in Nitpick
blanchet
parents: 35385
diff changeset
   570
               unsound = unsound, scope = scope})
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   571
      end
34124
c4628a1dcf75 added support for binary nat/int representation to Nitpick
blanchet
parents: 34123
diff changeset
   572
      handle TOO_LARGE (loc, msg) =>
34936
c4f04bee79f3 some work on Nitpick's support for quotient types;
blanchet
parents: 34935
diff changeset
   573
             if loc = "Nitpick_Kodkod.check_arity" andalso
c4f04bee79f3 some work on Nitpick's support for quotient types;
blanchet
parents: 34935
diff changeset
   574
                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
   575
               problem_for_scope unsound
35190
ce653cc27a94 make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
blanchet
parents: 35185
diff changeset
   576
                   {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
   577
                    card_assigns = card_assigns, bits = bits,
55890
bd7927cca152 tuned ML names
blanchet
parents: 55889
diff changeset
   578
                    bisim_depth = bisim_depth, data_types = data_types,
35190
ce653cc27a94 make sure that Nitpick uses binary notation consistently if "binary_ints" is enabled
blanchet
parents: 35185
diff changeset
   579
                    ofs = Typtab.empty}
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   580
             else if loc = "Nitpick.pick_them_nits_in_term.\
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   581
                           \problem_for_scope" then
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   582
               NONE
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   583
             else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   584
               (Unsynchronized.change too_big_scopes (cons scope);
41992
0e4716fa330a reword Nitpick's wording concerning potential counterexamples
blanchet
parents: 41985
diff changeset
   585
                print_v (fn () =>
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   586
                    "Limit reached: " ^ msg ^ "; skipping " ^
41992
0e4716fa330a reword Nitpick's wording concerning potential counterexamples
blanchet
parents: 41985
diff changeset
   587
                    (if unsound then "potential component of " else "") ^
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   588
                    "scope");
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   589
                NONE)
35280
54ab4921f826 fixed a few bugs in Nitpick and removed unreferenced variables
blanchet
parents: 35220
diff changeset
   590
           | TOO_SMALL (_, msg) =>
41992
0e4716fa330a reword Nitpick's wording concerning potential counterexamples
blanchet
parents: 41985
diff changeset
   591
             (print_v (fn () =>
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   592
                  "Limit reached: " ^ msg ^ "; skipping " ^
41992
0e4716fa330a reword Nitpick's wording concerning potential counterexamples
blanchet
parents: 41985
diff changeset
   593
                  (if unsound then "potential component of " else "") ^
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   594
                  "scope");
34124
c4628a1dcf75 added support for binary nat/int representation to Nitpick
blanchet
parents: 34123
diff changeset
   595
              NONE)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   596
55888
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   597
    val das_wort_model = if falsify then "counterexample" else "model"
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   598
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   599
    val scopes = Unsynchronized.ref []
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   600
    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
   601
    val generated_problems = Unsynchronized.ref ([] : rich_problem list)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   602
    val checked_problems = Unsynchronized.ref (SOME [])
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   603
    val met_potential = Unsynchronized.ref 0
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   604
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   605
    fun update_checked_problems problems =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   606
      List.app (Unsynchronized.change checked_problems o Option.map o cons
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   607
                o nth problems)
35333
f61de25f71f9 distinguish between Kodkodi warnings and errors in Nitpick;
blanchet
parents: 35280
diff changeset
   608
    fun show_kodkod_warning "" = ()
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   609
      | show_kodkod_warning s = print_nt (fn () => "Kodkod warning: " ^ s)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   610
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   611
    fun print_and_check_model genuine bounds
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   612
            ({free_names, sel_names, nonsel_names, rel_table, scope, ...}
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   613
             : problem_extension) =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   614
      let
47752
0814fc93ab89 output SZS status as early as possible
blanchet
parents: 47716
diff changeset
   615
        val _ =
0814fc93ab89 output SZS status as early as possible
blanchet
parents: 47716
diff changeset
   616
          print_t (fn () =>
0814fc93ab89 output SZS status as early as possible
blanchet
parents: 47716
diff changeset
   617
               "% SZS status " ^
0814fc93ab89 output SZS status as early as possible
blanchet
parents: 47716
diff changeset
   618
               (if genuine then
0814fc93ab89 output SZS status as early as possible
blanchet
parents: 47716
diff changeset
   619
                  if falsify then "CounterSatisfiable" else "Satisfiable"
0814fc93ab89 output SZS status as early as possible
blanchet
parents: 47716
diff changeset
   620
                else
61310
9a50ea544fd3 better compliance with TPTP SZS standard
blanchet
parents: 60948
diff changeset
   621
                  "GaveUp") ^ "\n" ^
47752
0814fc93ab89 output SZS status as early as possible
blanchet
parents: 47716
diff changeset
   622
               "% SZS output start FiniteModel")
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   623
        val (reconstructed_model, codatatypes_ok) =
41993
bd6296de1432 reintroduced "show_skolems" option -- useful when too many Skolems are displayed
blanchet
parents: 41992
diff changeset
   624
          reconstruct_hol_model
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
   625
              {show_types = show_types, show_skolems = show_skolems,
41993
bd6296de1432 reintroduced "show_skolems" option -- useful when too many Skolems are displayed
blanchet
parents: 41992
diff changeset
   626
               show_consts = show_consts}
38170
d74b66ec02ce handle free variables even more gracefully;
blanchet
parents: 38169
diff changeset
   627
              scope formats atomss real_frees pseudo_frees free_names sel_names
d74b66ec02ce handle free variables even more gracefully;
blanchet
parents: 38169
diff changeset
   628
              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
   629
        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
   630
          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
   631
          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
   632
          codatatypes_ok
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   633
      in
47752
0814fc93ab89 output SZS status as early as possible
blanchet
parents: 47716
diff changeset
   634
        (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
   635
             [Pretty.blk (0,
59432
wenzelm
parents: 59429
diff changeset
   636
                  (Pretty.text ((if mode = Auto_Try then "Auto " else "") ^
43022
7d3ce43d9464 handle non-auto try case gracefully in Nitpick
blanchet
parents: 43020
diff changeset
   637
                          "Nitpick found a" ^
41992
0e4716fa330a reword Nitpick's wording concerning potential counterexamples
blanchet
parents: 41985
diff changeset
   638
                          (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
   639
                           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
   640
                           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
   641
                   (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
   642
                      [] => []
60023
f3e70d74a686 proper Pretty.brk -- redundant spaces do not survive Pretty.text (see also 42b7b76b37b8, e06eabc421e7);
wenzelm
parents: 59970
diff changeset
   643
                    | pretties => [Pretty.brk 1, Pretty.str "for", Pretty.brk 1] @ pretties) @
72298
a540283d6b58 tuned nitpick message: more like quickcheck;
wenzelm
parents: 72205
diff changeset
   644
                   [Pretty.str ":"])),
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
   645
              Pretty.indent indent_size reconstructed_model]);
47564
8074b18d8d76 more standard SZS output
blanchet
parents: 47562
diff changeset
   646
         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
   647
         if genuine then
60310
932221b62e89 removed model checks from Nitpick
blanchet
parents: 60023
diff changeset
   648
           (if has_lonely_bool_var orig_t then
41048
d5ebe94248ad added a hint when the user obviously just forgot a colon after the lemma's name
blanchet
parents: 41007
diff changeset
   649
              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
   650
            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
   651
              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
   652
            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
   653
              ();
ed2c3830d881 improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
blanchet
parents: 35665
diff changeset
   654
            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
   655
              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
   656
                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
   657
                  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
   658
                    [] |> 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
   659
                          ? 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
   660
                       |> 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
   661
                          ? 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
   662
                       |> 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
   663
                          ? cons ("finitize", "\"smart\" or \"false\"")
41858
37ce158d6266 if "total_consts" is set, report cex's as quasi-genuine
blanchet
parents: 41856
diff changeset
   664
                       |> total_consts = SOME true
37ce158d6266 if "total_consts" is set, report cex's as quasi-genuine
blanchet
parents: 41856
diff changeset
   665
                          ? 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
   666
                       |> 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
   667
                          ? 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
   668
                  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
   669
                    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
   670
                        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
   671
                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
   672
                  print ("Try again with " ^
41872
10fd9e5d58ba added missing spaces in output
blanchet
parents: 41871
diff changeset
   673
                         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
   674
                         " to confirm that the " ^ das_wort_model ^
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   675
                         " is genuine")
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
   676
                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
   677
              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
   678
                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
   679
                       \the " ^ das_wort_model ^ " in the presence of \
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   680
                       \polymorphic axioms")
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
   681
            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
   682
              ();
ed2c3830d881 improved Nitpick's precision for "card" and "setsum" + fix incorrect outcome code w.r.t. "bisim_depth = -1"
blanchet
parents: 35665
diff changeset
   683
            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
   684
         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
   685
           if not genuine then
60310
932221b62e89 removed model checks from Nitpick
blanchet
parents: 60023
diff changeset
   686
             (Unsynchronized.inc met_potential; NONE)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   687
           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
   688
             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
   689
        |> pair genuine_means_genuine
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   690
      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
   691
    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
   692
                           donno) first_time problems =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   693
      let
74844
90242c744a1a maintain option kodkod_scala within theory context, to allow local modification;
wenzelm
parents: 74380
diff changeset
   694
        val kodkod_scala = Config.get ctxt KK.kodkod_scala
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   695
        val max_potential = Int.max (0, max_potential)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   696
        val max_genuine = Int.max (0, max_genuine)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   697
        fun print_and_check genuine (j, bounds) =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   698
          print_and_check_model genuine bounds (snd (nth problems j))
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   699
        val max_solutions = max_potential + max_genuine
36384
76d5fd5a45fb cosmetics
blanchet
parents: 36380
diff changeset
   700
                            |> not incremental ? Integer.min 1
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   701
      in
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   702
        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
   703
          (found_really_genuine, 0, 0, donno)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   704
        else
74844
90242c744a1a maintain option kodkod_scala within theory context, to allow local modification;
wenzelm
parents: 74380
diff changeset
   705
          case KK.solve_any_problem kodkod_scala debug overlord deadline max_threads
41793
c7a2669ae75d tweaked Nitpick based on C++ memory model example
blanchet
parents: 41791
diff changeset
   706
                                    max_solutions (map fst problems) of
72329
6255e532aa36 obsolete --- Java is always present via component;
wenzelm
parents: 72328
diff changeset
   707
            KK.Normal ([], unsat_js, s) =>
35333
f61de25f71f9 distinguish between Kodkodi warnings and errors in Nitpick;
blanchet
parents: 35280
diff changeset
   708
            (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
   709
             (found_really_genuine, max_potential, max_genuine, donno))
35333
f61de25f71f9 distinguish between Kodkodi warnings and errors in Nitpick;
blanchet
parents: 35280
diff changeset
   710
          | KK.Normal (sat_ps, unsat_js, s) =>
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   711
            let
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   712
              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
   713
                List.partition (#unsound o snd o nth problems o fst) sat_ps
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   714
            in
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   715
              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
   716
              show_kodkod_warning s;
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   717
              if null con_ps then
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   718
                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
   719
                  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
   720
                    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
   721
                           |> 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
   722
                           |> 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
   723
                  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
   724
                    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
   725
                  val num_genuine = length genuine_codes
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   726
                  val max_genuine = max_genuine - num_genuine
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   727
                  val max_potential = max_potential
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   728
                                      - (length lib_ps - num_genuine)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   729
                in
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   730
                  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
   731
                    (found_really_genuine, 0, 0, donno)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   732
                  else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   733
                    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
   734
                      (* "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
   735
                         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
   736
                         probably can't be satisfied themselves. *)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   737
                      val co_js =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   738
                        map (fn j => j - 1) unsat_js
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   739
                        |> filter (fn j =>
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   740
                                      j >= 0 andalso
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   741
                                      scopes_equivalent
35814
234eaa508359 added one-entry cache around Kodkod invocation
blanchet
parents: 35807
diff changeset
   742
                                          (#scope (snd (nth problems j)),
234eaa508359 added one-entry cache around Kodkod invocation
blanchet
parents: 35807
diff changeset
   743
                                           #scope (snd (nth problems (j + 1)))))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   744
                      val bye_js = sort_distinct int_ord (map fst sat_ps @
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   745
                                                          unsat_js @ co_js)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   746
                      val problems =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   747
                        problems |> filter_out_indices bye_js
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   748
                                 |> 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
   749
                                    ? filter_out (#unsound o snd)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   750
                    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
   751
                      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
   752
                                         max_genuine, donno) false problems
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   753
                    end
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   754
                end
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   755
              else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   756
                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
   757
                  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
   758
                    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
   759
                           |> 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
   760
                  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
   761
                  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
   762
                    found_really_genuine orelse exists fst genuine_codes
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   763
                in
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   764
                  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
   765
                    (found_really_genuine, 0, max_genuine, donno)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   766
                  else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   767
                    let
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   768
                      val bye_js = sort_distinct int_ord
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   769
                                                 (map fst sat_ps @ unsat_js)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   770
                      val problems =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   771
                        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
   772
                                 |> 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
   773
                    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
   774
                      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
   775
                                         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
   776
                    end
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   777
                end
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   778
            end
34126
8a2c5d7aff51 polished Nitpick's binary integer support etc.;
blanchet
parents: 34124
diff changeset
   779
          | KK.TimedOut unsat_js =>
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   780
            (update_checked_problems problems unsat_js; raise Timeout.TIMEOUT Time.zeroTime)
34126
8a2c5d7aff51 polished Nitpick's binary integer support etc.;
blanchet
parents: 34124
diff changeset
   781
          | KK.Error (s, unsat_js) =>
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   782
            (update_checked_problems problems unsat_js;
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   783
             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
   784
             (found_really_genuine, max_potential, max_genuine, donno + 1))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   785
      end
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   786
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
   787
    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
   788
                              donno) =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   789
      let
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   790
        val _ =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   791
          if null scopes then
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   792
            print_nt (K "The scope specification is inconsistent")
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   793
          else if verbose then
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   794
            pprint_nt (fn () => Pretty.chunks
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   795
                [Pretty.blk (0,
59432
wenzelm
parents: 59429
diff changeset
   796
                     Pretty.text ((if n > 1 then
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   797
                               "Batch " ^ string_of_int (j + 1) ^ " of " ^
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   798
                               signed_string_of_int n ^ ": "
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   799
                             else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   800
                               "") ^
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   801
                            "Trying " ^ string_of_int (length scopes) ^
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   802
                            " scope" ^ plural_s_for_list scopes ^ ":")),
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   803
                 Pretty.indent indent_size
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   804
                     (Pretty.chunks (map2
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   805
                          (fn j => fn scope =>
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   806
                              Pretty.block (
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   807
                                  (case pretties_for_scope scope true of
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   808
                                     [] => [Pretty.str "Empty"]
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   809
                                   | pretties => pretties)))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   810
                          (length scopes downto 1) scopes))])
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   811
          else
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   812
            ()
35280
54ab4921f826 fixed a few bugs in Nitpick and removed unreferenced variables
blanchet
parents: 35220
diff changeset
   813
        fun add_problem_for_scope (scope, unsound) (problems, donno) =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   814
          (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
   815
           case problem_for_scope unsound scope of
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   816
             SOME problem =>
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   817
             (problems
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   818
              |> (null problems orelse
35814
234eaa508359 added one-entry cache around Kodkod invocation
blanchet
parents: 35807
diff changeset
   819
                  not (KK.problems_equivalent (fst problem, fst (hd problems))))
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   820
                  ? cons problem, donno)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   821
           | NONE => (problems, donno + 1))
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   822
        val (problems, donno) =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   823
          fold add_problem_for_scope
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   824
               (map_product pair scopes
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   825
                    ((if max_genuine > 0 then [false] else []) @
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   826
                     (if max_potential > 0 then [true] else [])))
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   827
               ([], donno)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   828
        val _ = Unsynchronized.change generated_problems (append problems)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   829
        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
   830
        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
   831
          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
   832
            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
   833
              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
   834
                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
   835
            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
   836
              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
   837
                 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
   838
                        sound_problems then
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   839
                print_nt (fn () =>
44395
d39aedffba08 more precise warning
blanchet
parents: 43602
diff changeset
   840
                    "Warning: The conjecture " ^
d39aedffba08 more precise warning
blanchet
parents: 43602
diff changeset
   841
                    (if falsify then "either trivially holds"
d39aedffba08 more precise warning
blanchet
parents: 43602
diff changeset
   842
                     else "is either trivially unsatisfiable") ^
d39aedffba08 more precise warning
blanchet
parents: 43602
diff changeset
   843
                    " for the given scopes or lies outside Nitpick's supported \
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   844
                    \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
   845
                    (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
   846
                               unsound_problems then
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   847
                       "; only potentially spurious " ^ das_wort_model ^
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   848
                       "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
   849
                     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
   850
                       ""))
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
   851
              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
   852
                ()
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
   853
            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
   854
          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
   855
            ()
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   856
      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
   857
        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
   858
                           donno) true (rev problems)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   859
      end
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   860
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   861
    fun scope_count (problems : rich_problem list) scope =
35814
234eaa508359 added one-entry cache around Kodkod invocation
blanchet
parents: 35807
diff changeset
   862
      length (filter (curry scopes_equivalent scope o #scope o snd) problems)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   863
    fun excipit did_so_and_so =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   864
      let
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   865
        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
   866
          if !met_potential = max_potential then filter_out (#unsound o snd)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   867
          else I
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   868
        val total = length (!scopes)
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   869
        val unsat =
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   870
          fold (fn scope =>
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   871
                   case scope_count (do_filter (!generated_problems)) scope of
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   872
                     0 => I
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   873
                   | 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
   874
                     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
   875
                                 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
   876
                     ? Integer.add 1) (!generated_scopes) 0
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   877
      in
61365
1190beb20762 made TPTP SZS status more compliant
blanchet
parents: 61315
diff changeset
   878
        (if mode = TPTP then "% SZS status GaveUp\n" else "") ^
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   879
        "Nitpick " ^ did_so_and_so ^
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   880
        (if is_some (!checked_problems) andalso total > 0 then
39361
blanchet
parents: 39359
diff changeset
   881
           " " ^ string_of_int unsat ^ " of " ^ string_of_int total ^ " scope"
blanchet
parents: 39359
diff changeset
   882
           ^ plural_s total
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   883
         else
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   884
           "")
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   885
      end
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   886
37704
c6161bee8486 adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
blanchet
parents: 37497
diff changeset
   887
    val (skipped, the_scopes) =
c6161bee8486 adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
blanchet
parents: 37497
diff changeset
   888
      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
   889
                 bitss bisim_depths mono_Ts nonmono_Ts deep_dataTs
c6161bee8486 adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
blanchet
parents: 37497
diff changeset
   890
                 finitizable_dataTs
c6161bee8486 adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
blanchet
parents: 37497
diff changeset
   891
    val _ = if skipped > 0 then
62319
6b01bff94d87 rephrased message
blanchet
parents: 61365
diff changeset
   892
              print_nt (fn () => "Skipping " ^ string_of_int skipped ^
6b01bff94d87 rephrased message
blanchet
parents: 61365
diff changeset
   893
                                 " scope" ^ plural_s skipped ^
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   894
                                 ". (Consider using \"mono\" or \
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   895
                                 \\"merge_type_vars\" to prevent this.)")
37704
c6161bee8486 adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
blanchet
parents: 37497
diff changeset
   896
            else
c6161bee8486 adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
blanchet
parents: 37497
diff changeset
   897
              ()
c6161bee8486 adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
blanchet
parents: 37497
diff changeset
   898
    val _ = scopes := the_scopes
c6161bee8486 adapt Nitpick to "prod_case" and "*" -> "sum" renaming;
blanchet
parents: 37497
diff changeset
   899
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
   900
    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
   901
                    (found_really_genuine, max_potential, max_genuine, donno) =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   902
        if donno > 0 andalso max_genuine > 0 then
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   903
          (print_nt (fn () => excipit "checked"); unknownN)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   904
        else if max_genuine = original_max_genuine then
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   905
          if max_potential = original_max_potential then
61365
1190beb20762 made TPTP SZS status more compliant
blanchet
parents: 61315
diff changeset
   906
            (print_t (K "% SZS status GaveUp");
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   907
             print_nt (fn () => "Nitpick found no " ^ das_wort_model);
55888
cac1add157e8 removed nonstandard models from Nitpick
blanchet
parents: 55539
diff changeset
   908
             if skipped > 0 then unknownN else noneN)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   909
          else
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   910
            (print_nt (fn () =>
38123
36f649db4a6c clarify Nitpick's output in case of a potential counterexample
blanchet
parents: 37928
diff changeset
   911
                 excipit ("could not find a" ^
36f649db4a6c clarify Nitpick's output in case of a potential counterexample
blanchet
parents: 37928
diff changeset
   912
                          (if max_genuine = 1 then
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   913
                             " better " ^ das_wort_model
38123
36f649db4a6c clarify Nitpick's output in case of a potential counterexample
blanchet
parents: 37928
diff changeset
   914
                           else
63693
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   915
                             "ny better " ^ das_wort_model ^ "s") ^
5b02f7757a4c removed trailing final stops in Nitpick messages
blanchet
parents: 62826
diff changeset
   916
                          "\nIt checked"));
43020
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
   917
             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
   918
        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
   919
          genuineN
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   920
        else
43020
abb5d1f907e4 added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
blanchet
parents: 42959
diff changeset
   921
          quasi_genuineN
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   922
      | 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
   923
        let val (z as (_, _, max_genuine, _)) = run_batch j n batch z in
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   924
          run_batches (j + 1) n (if max_genuine > 0 then batches else []) z
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   925
        end
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   926
48323
7b5f7ca25d17 optimized MaSh output by chunking it
blanchet
parents: 47759
diff changeset
   927
    val batches = chunk_list batch_size (!scopes)
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   928
    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
   929
      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
   930
                  (false, max_potential, max_genuine, 0)
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 62319
diff changeset
   931
      handle Timeout.TIMEOUT _ =>
47560
e30323bfc93c added SZS status wrappers in TPTP mode
blanchet
parents: 47559
diff changeset
   932
             (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
   933
              if !met_potential > 0 then potentialN else unknownN)
73386
3fb201ca8fb5 tuned --- more elementary Time operations;
wenzelm
parents: 72329
diff changeset
   934
    val _ = print_v (fn () => "Total time: " ^ string_of_time (Time.now () - time_start))
53815
e8aa538e959e encode goal digest in spying log (to detect duplicates)
blanchet
parents: 53802
diff changeset
   935
    val _ = spying spy (fn () => (state, i, "outcome: " ^ outcome_code))
58892
20aa19ecf2cc eliminated obsolete Proof.goal_message -- print outcome more directly;
wenzelm
parents: 58843
diff changeset
   936
  in (outcome_code, Queue.content (Synchronized.value outcome)) end
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   937
41051
2ed1b971fc20 give the inner timeout mechanism a chance, since it gives more precise information to the user
blanchet
parents: 41048
diff changeset
   938
(* Give the inner timeout a chance. *)
41772
27d4c768cf20 make Nitpick's timeout mechanism somewhat more reliable/friendly;
blanchet
parents: 41278
diff changeset
   939
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
   940
55539
0819931d652d simplified data structure by reducing the incidence of clumsy indices
blanchet
parents: 54816
diff changeset
   941
fun pick_nits_in_term state (params as {timeout, expect, ...}) mode i n step
0819931d652d simplified data structure by reducing the incidence of clumsy indices
blanchet
parents: 54816
diff changeset
   942
                      subst def_assm_ts nondef_assm_ts orig_t =
47670
24babc4b1925 added timeout argument to TPTP tools
blanchet
parents: 47564
diff changeset
   943
  let
58843
521cea5fa777 discontinued obsolete Output.urgent_message;
wenzelm
parents: 57996
diff changeset
   944
    val print_nt = if is_mode_nt mode then writeln else K ()
521cea5fa777 discontinued obsolete Output.urgent_message;
wenzelm
parents: 57996
diff changeset
   945
    val print_t = if mode = TPTP then writeln else K ()
47670
24babc4b1925 added timeout argument to TPTP tools
blanchet
parents: 47564
diff changeset
   946
  in
72328
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   947
    let
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   948
      val unknown_outcome = (unknownN, [])
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 73386
diff changeset
   949
      val deadline = Timeout.end_time timeout
72328
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   950
      val outcome as (outcome_code, _) =
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   951
        Timeout.apply (timeout + timeout_bonus)
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   952
            (pick_them_nits_in_term deadline state params mode i n step subst
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   953
                                    def_assm_ts nondef_assm_ts) orig_t
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   954
        handle TOO_LARGE (_, details) =>
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   955
               (print_t "% SZS status GaveUp";
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   956
                print_nt ("Limit reached: " ^ details); unknown_outcome)
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   957
             | TOO_SMALL (_, details) =>
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   958
               (print_t "% SZS status GaveUp";
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   959
                print_nt ("Limit reached: " ^ details); unknown_outcome)
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   960
             | Kodkod.SYNTAX (_, details) =>
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   961
               (print_t "% SZS status GaveUp";
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   962
                print_nt ("Malformed Kodkodi output: " ^ details);
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   963
                unknown_outcome)
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   964
             | Timeout.TIMEOUT _ =>
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   965
               (print_t "% SZS status TimedOut";
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   966
                print_nt "Nitpick ran out of time"; unknown_outcome)
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   967
    in
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   968
      if expect = "" orelse outcome_code = expect then outcome
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   969
      else error ("Unexpected outcome: " ^ quote outcome_code)
7cb0c5fbe2d9 obsolete --- KODKODI is always present via component;
wenzelm
parents: 72327
diff changeset
   970
    end
37213
efcad7594872 fix handling of "split" w.r.t. new definition + fix exception handling w.r.t. "expect" option
blanchet
parents: 37146
diff changeset
   971
  end
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   972
42486
01b03a124b81 direct use of Variable.is_fixed;
wenzelm
parents: 42415
diff changeset
   973
fun is_fixed_equation ctxt
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 63693
diff changeset
   974
                      (Const (\<^const_name>\<open>Pure.eq\<close>, _) $ Free (s, _) $ Const _) =
42486
01b03a124b81 direct use of Variable.is_fixed;
wenzelm
parents: 42415
diff changeset
   975
    Variable.is_fixed ctxt s
35335
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   976
  | is_fixed_equation _ _ = false
55889
6bfbec3dff62 tuned code
blanchet
parents: 55888
diff changeset
   977
35335
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   978
fun extract_fixed_frees ctxt (assms, t) =
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   979
  let
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   980
    val (subst, other_assms) =
42486
01b03a124b81 direct use of Variable.is_fixed;
wenzelm
parents: 42415
diff changeset
   981
      List.partition (is_fixed_equation ctxt) assms
35335
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   982
      |>> map Logic.dest_equals
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   983
  in (subst, other_assms, subst_atomic subst t) end
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   984
43022
7d3ce43d9464 handle non-auto try case gracefully in Nitpick
blanchet
parents: 43020
diff changeset
   985
fun pick_nits_in_subgoal state params mode i step =
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   986
  let
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   987
    val ctxt = Proof.context_of state
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59432
diff changeset
   988
    val t = state |> Proof.raw_goal |> #goal |> Thm.prop_of
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   989
  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
   990
    case Logic.count_prems t of
58892
20aa19ecf2cc eliminated obsolete Proof.goal_message -- print outcome more directly;
wenzelm
parents: 58843
diff changeset
   991
      0 => (writeln "No subgoal!"; (noneN, []))
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
   992
    | n =>
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   993
      let
36406
0a2d5138b77c fixes 2a5c6e7b55cb;
blanchet
parents: 36397
diff changeset
   994
        val t = Logic.goal_params t i |> fst
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59432
diff changeset
   995
        val assms = map Thm.term_of (Assumption.all_assms_of ctxt)
35335
f715cfde056a support local definitions in Nitpick
blanchet
parents: 35334
diff changeset
   996
        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
   997
      in pick_nits_in_term state params mode i n step subst [] assms t end
33192
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   998
  end
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
   999
08a39a957ed7 added Nitpick's theory and ML files to Isabelle/HOL;
blanchet
parents:
diff changeset
  1000
end;