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