src/HOL/Tools/Nunchaku/nunchaku.ML
author wenzelm
Fri, 05 Mar 2021 17:02:32 +0100
changeset 73386 3fb201ca8fb5
parent 69597 ff784d5a5bfb
child 74383 107941e8fa01
permissions -rw-r--r--
tuned --- more elementary Time operations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66646
383d8e388d1b tuned headers;
wenzelm
parents: 66632
diff changeset
     1
(*  Title:      HOL/Tools/Nunchaku/nunchaku.ML
66614
1f1c5d85d232 moved Nunchaku to Main; the goal is to move Nitpick out in the next 1-2 years
blanchet
parents: 66163
diff changeset
     2
    Author:     Jasmin Blanchette, VU Amsterdam
1f1c5d85d232 moved Nunchaku to Main; the goal is to move Nitpick out in the next 1-2 years
blanchet
parents: 66163
diff changeset
     3
    Copyright   2015, 2016, 2017
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     4
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     5
The core of the Nunchaku integration in Isabelle.
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     6
*)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     7
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     8
signature NUNCHAKU =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     9
sig
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    10
  type isa_model = Nunchaku_Reconstruct.isa_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    11
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    12
  datatype mode = Auto_Try | Try | Normal
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    13
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    14
  type mode_of_operation_params =
66163
45d3d43abee7 added 'solvers' option to Nunchaku
blanchet
parents: 64469
diff changeset
    15
    {solvers: string list,
45d3d43abee7 added 'solvers' option to Nunchaku
blanchet
parents: 64469
diff changeset
    16
     falsify: bool,
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    17
     assms: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    18
     spy: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    19
     overlord: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    20
     expect: string}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    21
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    22
  type scope_of_search_params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    23
    {wfs: ((string * typ) option * bool option) list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    24
     whacks: (term option * bool) list,
66627
4145169ae609 extended and renamed Nunchaku's Kodkod bounds
blanchet
parents: 66625
diff changeset
    25
     min_bound: int,
4145169ae609 extended and renamed Nunchaku's Kodkod bounds
blanchet
parents: 66625
diff changeset
    26
     max_bound: int option,
66625
2cd22f070929 added Kodkod-specific options to Nunchaku
blanchet
parents: 66623
diff changeset
    27
     bound_increment: int,
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    28
     cards: (typ option * (int option * int option)) list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    29
     monos: (typ option * bool option) list}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    30
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    31
  type output_format_params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    32
    {verbose: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    33
     debug: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    34
     max_potential: int,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    35
     max_genuine: int,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    36
     evals: term list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    37
     atomss: (typ option * string list) list}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    38
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    39
  type optimization_params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    40
    {specialize: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    41
     multithread: bool}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    42
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    43
  type timeout_params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    44
    {timeout: Time.time,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    45
     wf_timeout: Time.time}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    46
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    47
  type params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    48
    {mode_of_operation_params: mode_of_operation_params,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    49
     scope_of_search_params: scope_of_search_params,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    50
     output_format_params: output_format_params,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    51
     optimization_params: optimization_params,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    52
     timeout_params: timeout_params}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    53
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    54
  val genuineN: string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    55
  val quasi_genuineN: string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    56
  val potentialN: string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    57
  val noneN: string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    58
  val unknownN: string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    59
  val no_nunchakuN: string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    60
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    61
  val run_chaku_on_prop: Proof.state -> params -> mode -> int -> term list -> term ->
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    62
    string * isa_model option
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    63
  val run_chaku_on_subgoal: Proof.state -> params -> mode -> int -> string * isa_model option
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    64
end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    65
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    66
structure Nunchaku : NUNCHAKU =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    67
struct
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    68
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    69
open Nunchaku_Util;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    70
open Nunchaku_Collect;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    71
open Nunchaku_Problem;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    72
open Nunchaku_Translate;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    73
open Nunchaku_Model;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    74
open Nunchaku_Reconstruct;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    75
open Nunchaku_Display;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    76
open Nunchaku_Tool;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    77
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    78
datatype mode = Auto_Try | Try | Normal;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    79
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    80
type mode_of_operation_params =
66163
45d3d43abee7 added 'solvers' option to Nunchaku
blanchet
parents: 64469
diff changeset
    81
  {solvers: string list,
45d3d43abee7 added 'solvers' option to Nunchaku
blanchet
parents: 64469
diff changeset
    82
   falsify: bool,
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    83
   assms: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    84
   spy: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    85
   overlord: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    86
   expect: string};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    87
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    88
type scope_of_search_params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    89
  {wfs: ((string * typ) option * bool option) list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    90
   whacks: (term option * bool) list,
66627
4145169ae609 extended and renamed Nunchaku's Kodkod bounds
blanchet
parents: 66625
diff changeset
    91
   min_bound: int,
4145169ae609 extended and renamed Nunchaku's Kodkod bounds
blanchet
parents: 66625
diff changeset
    92
   max_bound: int option,
66625
2cd22f070929 added Kodkod-specific options to Nunchaku
blanchet
parents: 66623
diff changeset
    93
   bound_increment: int,
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    94
   cards: (typ option * (int option * int option)) list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    95
   monos: (typ option * bool option) list};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    96
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    97
type output_format_params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    98
  {verbose: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    99
   debug: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   100
   max_potential: int,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   101
   max_genuine: int,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   102
   evals: term list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   103
   atomss: (typ option * string list) list};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   104
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   105
type optimization_params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   106
  {specialize: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   107
   multithread: bool};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   108
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   109
type timeout_params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   110
  {timeout: Time.time,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   111
   wf_timeout: Time.time};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   112
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   113
type params =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   114
  {mode_of_operation_params: mode_of_operation_params,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   115
   scope_of_search_params: scope_of_search_params,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   116
   output_format_params: output_format_params,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   117
   optimization_params: optimization_params,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   118
   timeout_params: timeout_params};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   119
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   120
val genuineN = "genuine";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   121
val quasi_genuineN = "quasi_genuine";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   122
val potentialN = "potential";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   123
val noneN = "none";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   124
val unknownN = "unknown";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   125
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   126
val no_nunchakuN = "no_nunchaku";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   127
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   128
fun str_of_mode Auto_Try = "Auto_Try"
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   129
  | str_of_mode Try = "Try"
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   130
  | str_of_mode Normal = "Normal";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   131
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   132
fun none_true assigns = forall (curry (op <>) (SOME true) o snd) assigns;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   133
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
   134
fun has_lonely_bool_var (\<^const>\<open>Pure.conjunction\<close> $ (\<^const>\<open>Trueprop\<close> $ Free _) $ _) = true
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   135
  | has_lonely_bool_var _ = false;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   136
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   137
val syntactic_sorts =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 66646
diff changeset
   138
  \<^sort>\<open>{default,zero,one,plus,minus,uminus,times,inverse,abs,sgn,ord,equal}\<close> @ \<^sort>\<open>numeral\<close>;
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   139
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   140
fun has_tfree_syntactic_sort (TFree (_, S as _ :: _)) = subset (op =) (S, syntactic_sorts)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   141
  | has_tfree_syntactic_sort _ = false;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   142
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   143
val has_syntactic_sorts = exists_type (exists_subtype has_tfree_syntactic_sort);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   144
66617
41ca77ba0f83 tuned Nunchaku's output
blanchet
parents: 66614
diff changeset
   145
val unprefix_error =
66620
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   146
  perhaps (try (unprefix "failure: "))
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   147
  #> perhaps (try (unprefix "Error: "));
66617
41ca77ba0f83 tuned Nunchaku's output
blanchet
parents: 66614
diff changeset
   148
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   149
(* Give the soft timeout a chance. *)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   150
val timeout_slack = seconds 1.0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   151
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   152
fun run_chaku_on_prop state
66163
45d3d43abee7 added 'solvers' option to Nunchaku
blanchet
parents: 64469
diff changeset
   153
    ({mode_of_operation_params = {solvers, falsify, assms, spy, overlord, expect},
66627
4145169ae609 extended and renamed Nunchaku's Kodkod bounds
blanchet
parents: 66625
diff changeset
   154
      scope_of_search_params = {wfs, whacks, min_bound, max_bound, bound_increment, cards, monos},
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   155
      output_format_params = {verbose, debug, evals, atomss, ...},
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   156
      optimization_params = {specialize, ...},
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   157
      timeout_params = {timeout, wf_timeout}})
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   158
    mode i all_assms subgoal =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   159
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   160
    val ctxt = Proof.context_of state;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   161
73386
3fb201ca8fb5 tuned --- more elementary Time operations;
wenzelm
parents: 69597
diff changeset
   162
    val time_start = Time.now ()
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   163
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   164
    val print = writeln;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   165
    val print_n = if mode = Normal then writeln else K ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   166
    fun print_v f = if verbose then writeln (f ()) else ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   167
    fun print_d f = if debug then writeln (f ()) else ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   168
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   169
    val das_wort_Model = if falsify then "Countermodel" else "Model";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   170
    val das_wort_model = if falsify then "countermodel" else "model";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   171
66163
45d3d43abee7 added 'solvers' option to Nunchaku
blanchet
parents: 64469
diff changeset
   172
    val tool_params =
66627
4145169ae609 extended and renamed Nunchaku's Kodkod bounds
blanchet
parents: 66625
diff changeset
   173
      {solvers = solvers, overlord = overlord, min_bound = min_bound, max_bound = max_bound,
66625
2cd22f070929 added Kodkod-specific options to Nunchaku
blanchet
parents: 66623
diff changeset
   174
       bound_increment = bound_increment, debug = debug, specialize = specialize,
66163
45d3d43abee7 added 'solvers' option to Nunchaku
blanchet
parents: 64469
diff changeset
   175
       timeout = timeout};
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   176
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   177
    fun run () =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   178
      let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   179
        val outcome as (outcome_code, _) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   180
          let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   181
            val (poly_axioms, isa_problem as {sound, complete, ...}) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   182
              isa_problem_of_subgoal ctxt falsify wfs whacks cards debug wf_timeout evals
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   183
                (if assms then all_assms else []) subgoal;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   184
            val _ = print_d (fn () => "*** Isabelle problem ***\n" ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   185
              str_of_isa_problem ctxt isa_problem);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   186
            val ugly_nun_problem = nun_problem_of_isa ctxt isa_problem;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   187
            val _ = print_d (fn () => "*** Ugly Nunchaku problem ***\n" ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   188
              str_of_nun_problem ugly_nun_problem);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   189
            val (nice_nun_problem, pool) = nice_nun_problem ugly_nun_problem;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   190
            val _ = print_d (fn () => "*** Nice Nunchaku problem ***\n" ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   191
              str_of_nun_problem nice_nun_problem);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   192
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   193
            fun print_any_hints () =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   194
              if has_lonely_bool_var subgoal then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   195
                print "Hint: Maybe you forgot a colon after the lemma's name?"
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   196
              else if has_syntactic_sorts subgoal then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   197
                print "Hint: Maybe you forgot a type constraint?"
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   198
              else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   199
                ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   200
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   201
            fun get_isa_model_opt output =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   202
              let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   203
                val nice_nun_model = nun_model_of_str output;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   204
                val _ = print_d (fn () => "*** Nice Nunchaku model ***\n" ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   205
                  str_of_nun_model nice_nun_model);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   206
                val ugly_nun_model = ugly_nun_model pool nice_nun_model;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   207
                val _ = print_d (fn () => "*** Ugly Nunchaku model ***\n" ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   208
                  str_of_nun_model ugly_nun_model);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   209
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   210
                val pat_completes = pat_completes_of_isa_problem isa_problem;
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66620
diff changeset
   211
                val raw_isa_model = isa_model_of_nun ctxt pat_completes atomss ugly_nun_model;
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66620
diff changeset
   212
                val _ = print_d (fn () => "*** Raw Isabelle model ***\n" ^
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66620
diff changeset
   213
                  str_of_isa_model ctxt raw_isa_model);
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66620
diff changeset
   214
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66620
diff changeset
   215
                val cleaned_isa_model = clean_up_isa_model ctxt raw_isa_model;
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66620
diff changeset
   216
                val _ = print_d (fn () => "*** Cleaned-up Isabelle model ***\n" ^
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66620
diff changeset
   217
                  str_of_isa_model ctxt cleaned_isa_model);
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   218
              in
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66620
diff changeset
   219
                cleaned_isa_model
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   220
              end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   221
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   222
            fun isa_model_opt output =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   223
              if debug then SOME (get_isa_model_opt output) else try get_isa_model_opt output;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   224
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   225
            val model_str = isa_model_opt #> pretty_of_isa_model_opt ctxt #> Pretty.string_of;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   226
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   227
            fun unsat_means_theorem () =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   228
              null whacks andalso null cards andalso null monos;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   229
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   230
            fun unknown () =
66617
41ca77ba0f83 tuned Nunchaku's output
blanchet
parents: 66614
diff changeset
   231
              (print_n ("No " ^ das_wort_model ^ " found"); (unknownN, NONE));
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   232
66620
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   233
            fun unsat_or_unknown solver complete =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   234
              if complete then
66620
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   235
                (print_n ("No " ^ das_wort_model ^ " exists (according to " ^ solver ^ ")" ^
64407
5c5b9d945625 proper Nunchaku setup to use CVC4 and Kodkod
blanchet
parents: 64389
diff changeset
   236
                   (if falsify andalso unsat_means_theorem () then "\nThe goal is a theorem"
5c5b9d945625 proper Nunchaku setup to use CVC4 and Kodkod
blanchet
parents: 64389
diff changeset
   237
                    else ""));
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   238
                 (noneN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   239
              else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   240
                unknown ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   241
66620
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   242
            fun sat_or_maybe_sat solver sound output =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   243
              let val header = if sound then das_wort_Model else "Potential " ^ das_wort_model in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   244
                (case (null poly_axioms, none_true wfs) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   245
                  (true, true) =>
66620
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   246
                  (print (header ^ " (according to " ^ solver ^ "):\n" ^
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   247
                     model_str output); print_any_hints ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   248
                   (genuineN, isa_model_opt output))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   249
                | (no_poly, no_wf) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   250
                  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   251
                    val ignorings = []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   252
                      |> not no_poly ? cons "polymorphic axioms"
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   253
                      |> not no_wf ? cons "unchecked well-foundedness";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   254
                  in
66620
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   255
                    (print (header ^ " (according to " ^ solver ^
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   256
                       ", ignoring " ^ space_implode " and " ignorings ^ "):\n" ^
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   257
                       model_str output ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   258
                       (if no_poly then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   259
                          ""
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   260
                        else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   261
                          "\nIgnored axioms:\n" ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   262
                          cat_lines (map (prefix "  " o Syntax.string_of_term ctxt) poly_axioms)));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   263
                     print_any_hints ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   264
                     (quasi_genuineN, isa_model_opt output))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   265
                  end)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   266
              end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   267
          in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   268
            (case solve_nun_problem tool_params nice_nun_problem of
66620
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   269
              Unsat solver => unsat_or_unknown solver complete
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   270
            | Sat (solver, output, _) => sat_or_maybe_sat solver sound output
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   271
            | Unknown NONE => unknown ()
66620
984c179a00d3 more precise output for Nunchaku
blanchet
parents: 66617
diff changeset
   272
            | Unknown (SOME (solver, output, _)) => sat_or_maybe_sat solver false output
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   273
            | Timeout => (print_n "Time out"; (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   274
            | Nunchaku_Var_Not_Set =>
64469
488d4e627238 added Nunchaku component and tuned Nunchaku integration accordingly
blanchet
parents: 64407
diff changeset
   275
              (print_n ("Variable $" ^ nunchaku_home_env_var ^ " not set"); (unknownN, NONE))
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   276
            | Nunchaku_Cannot_Execute =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   277
              (print_n "External tool \"nunchaku\" cannot execute"; (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   278
            | Nunchaku_Not_Found =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   279
              (print_n "External tool \"nunchaku\" not found"; (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   280
            | CVC4_Cannot_Execute =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   281
              (print_n "External tool \"cvc4\" cannot execute"; (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   282
            | CVC4_Not_Found => (print_n "External tool \"cvc4\" not found"; (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   283
            | Unknown_Error (code, msg) =>
66632
6950d3da13f8 rephrased error
blanchet
parents: 66627
diff changeset
   284
              (print_n ("Error: " ^ unprefix_error msg ^
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   285
                 (if code = 0 then "" else " (code " ^ string_of_int code ^ ")"));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   286
               (unknownN, NONE)))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   287
          end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   288
          handle
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   289
            CYCLIC_DEPS () =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   290
            (print_n "Cyclic dependencies (or bug in Nunchaku)"; (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   291
          | TOO_DEEP_DEPS () =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   292
            (print_n "Too deep dependencies (or bug in Nunchaku)"; (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   293
          | TOO_META t =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   294
            (print_n ("Formula too meta for Nunchaku:\n" ^ Syntax.string_of_term ctxt t);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   295
             (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   296
          | UNEXPECTED_POLYMORPHISM t =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   297
            (print_n ("Unexpected polymorphism in term\n" ^ Syntax.string_of_term ctxt t);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   298
             (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   299
          | UNEXPECTED_VAR t =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   300
            (print_n ("Unexpected schematic variables in term\n" ^ Syntax.string_of_term ctxt t);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   301
             (unknownN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   302
          | UNSUPPORTED_FUNC t =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   303
            (print_n ("Unsupported low-level constant in problem: " ^ Syntax.string_of_term ctxt t);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   304
             (unknownN, NONE));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   305
      in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   306
        if expect = "" orelse outcome_code = expect then outcome
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   307
        else error ("Unexpected outcome: " ^ quote outcome_code)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   308
      end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   309
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   310
    val _ = spying spy (fn () => (state, i, "starting " ^ str_of_mode mode ^ " mode"));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   311
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   312
    val outcome as (outcome_code, _) =
73386
3fb201ca8fb5 tuned --- more elementary Time operations;
wenzelm
parents: 69597
diff changeset
   313
      Timeout.apply (timeout + timeout_slack) run ()
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   314
      handle Timeout.TIMEOUT _ => (print_n "Time out"; (unknownN, NONE));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   315
73386
3fb201ca8fb5 tuned --- more elementary Time operations;
wenzelm
parents: 69597
diff changeset
   316
    val _ = print_v (fn () => "Total time: " ^ string_of_time (Time.now () - time_start));
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   317
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   318
    val _ = spying spy (fn () => (state, i, "outcome: " ^ outcome_code));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   319
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   320
    if expect = "" orelse outcome_code = expect then outcome
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   321
    else error ("Unexpected outcome: " ^ quote outcome_code)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   322
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   323
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   324
fun run_chaku_on_subgoal state params mode i =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   325
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   326
    val ctxt = Proof.context_of state;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   327
    val goal = Thm.prop_of (#goal (Proof.raw_goal state));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   328
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   329
    if Logic.count_prems goal = 0 then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   330
      (writeln "No subgoal!"; (noneN, NONE))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   331
    else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   332
      let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   333
        val subgoal = fst (Logic.goal_params goal i);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   334
        val all_assms = map Thm.term_of (Assumption.all_assms_of ctxt);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   335
      in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   336
        run_chaku_on_prop state params mode i all_assms subgoal
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   337
      end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   338
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   339
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   340
end;