src/HOL/Tools/Sledgehammer/sledgehammer_mash.ML
author blanchet
Mon, 19 May 2014 23:43:53 +0200
changeset 57005 33f3d2ea803d
parent 56995 61855ade6c7e
child 57006 20e5b110d19b
permissions -rw-r--r--
store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48380
d4b7c7be3116 renamed ML files
blanchet
parents: 48379
diff changeset
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_mash.ML
48248
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
     3
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
     4
Sledgehammer's machine-learning-based relevance filter (MaSh).
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
     5
*)
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
     6
48381
1b7d798460bb renamed ML structures
blanchet
parents: 48380
diff changeset
     7
signature SLEDGEHAMMER_MASH =
48248
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
     8
sig
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
     9
  type stature = ATP_Problem_Generate.stature
51004
5f2788c38127 distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents: 51003
diff changeset
    10
  type raw_fact = Sledgehammer_Fact.raw_fact
48296
e7f01b7e244e gracefully handle the case of empty theories when going up the accessibility chain
blanchet
parents: 48293
diff changeset
    11
  type fact = Sledgehammer_Fact.fact
e7f01b7e244e gracefully handle the case of empty theories when going up the accessibility chain
blanchet
parents: 48293
diff changeset
    12
  type fact_override = Sledgehammer_Fact.fact_override
55201
1ee776da8da7 renamed ML file
blanchet
parents: 54816
diff changeset
    13
  type params = Sledgehammer_Prover.params
1ee776da8da7 renamed ML file
blanchet
parents: 54816
diff changeset
    14
  type prover_result = Sledgehammer_Prover.prover_result
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
    15
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
    16
  val trace : bool Config.T
51008
e096c0dc538b more precise output of selected facts
blanchet
parents: 51007
diff changeset
    17
  val MePoN : string
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
    18
  val MaShN : string
51008
e096c0dc538b more precise output of selected facts
blanchet
parents: 51007
diff changeset
    19
  val MeShN : string
48379
2b5ad61e2ccc renamed "iter" fact filter to "MePo" (Meng--Paulson)
blanchet
parents: 48378
diff changeset
    20
  val mepoN : string
2b5ad61e2ccc renamed "iter" fact filter to "MePo" (Meng--Paulson)
blanchet
parents: 48378
diff changeset
    21
  val mashN : string
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
    22
  val meshN : string
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
    23
  val unlearnN : string
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
    24
  val learn_isarN : string
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
    25
  val learn_proverN : string
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
    26
  val relearn_isarN : string
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
    27
  val relearn_proverN : string
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
    28
  val fact_filters : string list
50826
18ace05656cf start using MaSh hints
blanchet
parents: 50825
diff changeset
    29
  val encode_str : string -> string
18ace05656cf start using MaSh hints
blanchet
parents: 50825
diff changeset
    30
  val encode_strs : string list -> string
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
    31
  val decode_str : string -> string
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
    32
  val decode_strs : string -> string list
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
    33
  val encode_unweighted_features : string list list -> string
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
    34
  val encode_features : (string list * real) list -> string
50965
7a7d1418301e use correct weights in MeSh driver
blanchet
parents: 50952
diff changeset
    35
  val extract_suggestions : string -> string * string list
50632
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
    36
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
    37
  structure MaSh:
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
    38
  sig
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
    39
    val unlearn : Proof.context -> bool -> unit
50632
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
    40
    val learn :
53757
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
    41
      Proof.context -> bool -> bool
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
    42
      -> (string * string list * string list list * string list) list -> unit
50632
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
    43
    val relearn :
53757
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
    44
      Proof.context -> bool -> bool -> (string * string list) list -> unit
50969
blanchet
parents: 50967
diff changeset
    45
    val query :
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
    46
      Proof.context -> bool -> int
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
    47
      -> (string * string list * string list list * string list) list
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
    48
         * string list * string list * (string list * real) list
53094
e33d77814a92 allow MaSh query to do some learning as well
blanchet
parents: 53090
diff changeset
    49
      -> string list
50632
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
    50
  end
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
    51
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
    52
  val mash_unlearn : Proof.context -> params -> unit
53819
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
    53
  val is_mash_enabled : unit -> bool
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
    54
  val nickname_of_thm : thm -> string
51134
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
    55
  val find_suggested_facts :
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
    56
    Proof.context -> ('b * thm) list -> string list -> ('b * thm) list
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48320
diff changeset
    57
  val mesh_facts :
50814
4247cbd78aaf export MeSh data as well
blanchet
parents: 50755
diff changeset
    58
    ('a * 'a -> bool) -> int -> (real * (('a * real) list * 'a list)) list
4247cbd78aaf export MeSh data as well
blanchet
parents: 50755
diff changeset
    59
    -> 'a list
51135
e32114b25551 tuned code
blanchet
parents: 51134
diff changeset
    60
  val crude_thm_ord : thm * thm -> order
51182
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
    61
  val thm_less : thm * thm -> bool
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
    62
  val goal_of_thm : theory -> thm -> thm
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48320
diff changeset
    63
  val run_prover_for_mash :
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54140
diff changeset
    64
    Proof.context -> params -> string -> string -> fact list -> thm -> prover_result
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
    65
  val features_of :
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
    66
    Proof.context -> theory -> int -> int Symtab.table -> stature -> bool -> term list ->
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
    67
    (string list * real) list
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
    68
  val trim_dependencies : string list -> string list option
50735
6b232d76cbc9 refined class handling, to prevent cycles in fact graph
blanchet
parents: 50732
diff changeset
    69
  val isar_dependencies_of :
50754
74a6adcb96ac also generate queries for goals with too many Isar dependencies
blanchet
parents: 50751
diff changeset
    70
    string Symtab.table * string Symtab.table -> thm -> string list
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
    71
  val prover_dependencies_of :
51004
5f2788c38127 distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents: 51003
diff changeset
    72
    Proof.context -> params -> string -> int -> raw_fact list
50735
6b232d76cbc9 refined class handling, to prevent cycles in fact graph
blanchet
parents: 50732
diff changeset
    73
    -> string Symtab.table * string Symtab.table -> thm
50754
74a6adcb96ac also generate queries for goals with too many Isar dependencies
blanchet
parents: 50751
diff changeset
    74
    -> bool * string list
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
    75
  val attach_parents_to_facts :
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
    76
    ('a * thm) list -> ('a * thm) list -> (string list * ('a * thm)) list
53140
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
    77
  val num_extra_feature_facts : int
53141
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
    78
  val extra_feature_factor : real
53140
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
    79
  val weight_facts_smoothly : 'a list -> ('a * real) list
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
    80
  val weight_facts_steeply : 'a list -> ('a * real) list
50412
e83ab94e3e6e use proper entry point for MaSh in test driver
blanchet
parents: 50401
diff changeset
    81
  val find_mash_suggestions :
51134
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
    82
    Proof.context -> int -> string list -> ('b * thm) list -> ('b * thm) list
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
    83
    -> ('b * thm) list -> ('b * thm) list * ('b * thm) list
53127
60801776d8af weight MaSh constants by frequency
blanchet
parents: 53121
diff changeset
    84
  val add_const_counts : term -> int Symtab.table -> int Symtab.table
48406
b002cc16aa99 honor suggested MaSh weights
blanchet
parents: 48404
diff changeset
    85
  val mash_suggested_facts :
54503
blanchet
parents: 54432
diff changeset
    86
    Proof.context -> params -> int -> term list -> term -> raw_fact list -> fact list * fact list
blanchet
parents: 54432
diff changeset
    87
  val mash_learn_proof : Proof.context -> params -> term -> ('a * thm) list -> thm list -> unit
48395
85a7fb65507a learning should honor the fact override and the chained facts
blanchet
parents: 48394
diff changeset
    88
  val mash_learn :
85a7fb65507a learning should honor the fact override and the chained facts
blanchet
parents: 48394
diff changeset
    89
    Proof.context -> params -> fact_override -> thm list -> bool -> unit
53819
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
    90
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
    91
  val mash_can_suggest_facts : Proof.context -> bool -> bool
50412
e83ab94e3e6e use proper entry point for MaSh in test driver
blanchet
parents: 50401
diff changeset
    92
  val generous_max_facts : int -> int
50814
4247cbd78aaf export MeSh data as well
blanchet
parents: 50755
diff changeset
    93
  val mepo_weight : real
4247cbd78aaf export MeSh data as well
blanchet
parents: 50755
diff changeset
    94
  val mash_weight : real
48288
255c6e1fd505 rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents: 48251
diff changeset
    95
  val relevant_facts :
48292
7fcee834c7f5 more code rationalization in relevance filter
blanchet
parents: 48289
diff changeset
    96
    Proof.context -> params -> string -> int -> fact_override -> term list
51010
afd0213a3dab tuned data structure
blanchet
parents: 51008
diff changeset
    97
    -> term -> raw_fact list -> (string * fact list) list
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
    98
  val kill_learners : Proof.context -> params -> unit
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
    99
  val running_learners : unit -> unit
48248
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
   100
end;
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
   101
48381
1b7d798460bb renamed ML structures
blanchet
parents: 48380
diff changeset
   102
structure Sledgehammer_MaSh : SLEDGEHAMMER_MASH =
48248
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
   103
struct
48249
2bd242c56c90 dummy implementation
blanchet
parents: 48248
diff changeset
   104
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   105
open ATP_Util
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   106
open ATP_Problem_Generate
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   107
open Sledgehammer_Util
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   108
open Sledgehammer_Fact
55201
1ee776da8da7 renamed ML file
blanchet
parents: 54816
diff changeset
   109
open Sledgehammer_Prover
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 55201
diff changeset
   110
open Sledgehammer_Prover_Minimize
48381
1b7d798460bb renamed ML structures
blanchet
parents: 48380
diff changeset
   111
open Sledgehammer_MePo
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   112
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   113
val trace = Attrib.setup_config_bool @{binding sledgehammer_mash_trace} (K false)
51032
69da236d7838 added option to use SNoW as machine learning algo
blanchet
parents: 51029
diff changeset
   114
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
   115
fun trace_msg ctxt msg = if Config.get ctxt trace then tracing (msg ()) else ()
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
   116
51008
e096c0dc538b more precise output of selected facts
blanchet
parents: 51007
diff changeset
   117
val MePoN = "MePo"
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
   118
val MaShN = "MaSh"
51008
e096c0dc538b more precise output of selected facts
blanchet
parents: 51007
diff changeset
   119
val MeShN = "MeSh"
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
   120
48379
2b5ad61e2ccc renamed "iter" fact filter to "MePo" (Meng--Paulson)
blanchet
parents: 48378
diff changeset
   121
val mepoN = "mepo"
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
   122
val mashN = "mash"
48379
2b5ad61e2ccc renamed "iter" fact filter to "MePo" (Meng--Paulson)
blanchet
parents: 48378
diff changeset
   123
val meshN = "mesh"
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
   124
48379
2b5ad61e2ccc renamed "iter" fact filter to "MePo" (Meng--Paulson)
blanchet
parents: 48378
diff changeset
   125
val fact_filters = [meshN, mepoN, mashN]
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
   126
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   127
val unlearnN = "unlearn"
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   128
val learn_isarN = "learn_isar"
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
   129
val learn_proverN = "learn_prover"
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   130
val relearn_isarN = "relearn_isar"
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
   131
val relearn_proverN = "relearn_prover"
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   132
48394
82fc8c956cdc fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
blanchet
parents: 48392
diff changeset
   133
fun mash_model_dir () =
50340
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
   134
  Path.explode "$ISABELLE_HOME_USER/mash" |> tap Isabelle_System.mkdir
48394
82fc8c956cdc fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
blanchet
parents: 48392
diff changeset
   135
val mash_state_dir = mash_model_dir
50310
b00eeb8e352e proper quoting of paths in MaSh
blanchet
parents: 50229
diff changeset
   136
fun mash_state_file () = Path.append (mash_state_dir ()) (Path.explode "state")
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   137
48330
192444b53e86 speed up MaSh queries
blanchet
parents: 48329
diff changeset
   138
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   139
(*** Low-level communication with MaSh ***)
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   140
53117
2381bdf47ba5 use new MaSh command-line arguments
blanchet
parents: 53116
diff changeset
   141
val save_models_arg = "--saveModels"
2381bdf47ba5 use new MaSh command-line arguments
blanchet
parents: 53116
diff changeset
   142
val shutdown_server_arg = "--shutdownServer"
2381bdf47ba5 use new MaSh command-line arguments
blanchet
parents: 53116
diff changeset
   143
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   144
fun wipe_out_file file = (try (File.rm o Path.explode) file; ())
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   145
50335
b17b05c8d4a4 proper quoting of paths in MaSh shell script, take 2 (cf. b00eeb8e352e)
blanchet
parents: 50319
diff changeset
   146
fun write_file banner (xs, f) path =
b17b05c8d4a4 proper quoting of paths in MaSh shell script, take 2 (cf. b00eeb8e352e)
blanchet
parents: 50319
diff changeset
   147
  (case banner of SOME s => File.write path s | NONE => ();
53094
e33d77814a92 allow MaSh query to do some learning as well
blanchet
parents: 53090
diff changeset
   148
   xs |> chunk_list 500 |> List.app (File.append path o implode o map f))
50319
dddcaeb92e11 robust writing of MaSh state -- better drop learning data than cause other problems in Sledgehammer
blanchet
parents: 50311
diff changeset
   149
  handle IO.Io _ => ()
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   150
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
   151
fun run_mash_tool ctxt overlord extra_args background write_cmds read_suggs =
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   152
  let
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   153
    val (temp_dir, serial) =
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   154
      if overlord then (getenv "ISABELLE_HOME_USER", "")
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   155
      else (getenv "ISABELLE_TMP", serial_string ())
53129
f92b24047fc7 improved support for MaSh server
blanchet
parents: 53128
diff changeset
   156
    val log_file = temp_dir ^ "/mash_log" ^ serial
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   157
    val err_file = temp_dir ^ "/mash_err" ^ serial
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   158
    val sugg_file = temp_dir ^ "/mash_suggs" ^ serial
50335
b17b05c8d4a4 proper quoting of paths in MaSh shell script, take 2 (cf. b00eeb8e352e)
blanchet
parents: 50319
diff changeset
   159
    val sugg_path = Path.explode sugg_file
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   160
    val cmd_file = temp_dir ^ "/mash_commands" ^ serial
50335
b17b05c8d4a4 proper quoting of paths in MaSh shell script, take 2 (cf. b00eeb8e352e)
blanchet
parents: 50319
diff changeset
   161
    val cmd_path = Path.explode cmd_file
51001
461fdbbdb912 adapted to new MaSh interface
blanchet
parents: 50985
diff changeset
   162
    val model_dir = File.shell_path (mash_model_dir ())
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   163
    val command =
53556
347f743e8336 invoke Python with "no bytecode" option to avoid litering Isabelle source directory with ".pyc" files (which can be problematic for a number of reasons)
blanchet
parents: 53201
diff changeset
   164
      "cd \"$ISABELLE_SLEDGEHAMMER_MASH\"/src; \
53790
298774dbdde0 provide a way to override MaSh's port from configuration file
blanchet
parents: 53757
diff changeset
   165
      \PYTHONDONTWRITEBYTECODE=y ./mash.py\
298774dbdde0 provide a way to override MaSh's port from configuration file
blanchet
parents: 53757
diff changeset
   166
      \ --quiet\
298774dbdde0 provide a way to override MaSh's port from configuration file
blanchet
parents: 53757
diff changeset
   167
      \ --port=$MASH_PORT\
53556
347f743e8336 invoke Python with "no bytecode" option to avoid litering Isabelle source directory with ".pyc" files (which can be problematic for a number of reasons)
blanchet
parents: 53201
diff changeset
   168
      \ --outputDir " ^ model_dir ^
347f743e8336 invoke Python with "no bytecode" option to avoid litering Isabelle source directory with ".pyc" files (which can be problematic for a number of reasons)
blanchet
parents: 53201
diff changeset
   169
      " --modelFile=" ^ model_dir ^ "/model.pickle\
347f743e8336 invoke Python with "no bytecode" option to avoid litering Isabelle source directory with ".pyc" files (which can be problematic for a number of reasons)
blanchet
parents: 53201
diff changeset
   170
      \ --dictsFile=" ^ model_dir ^ "/dict.pickle\
53790
298774dbdde0 provide a way to override MaSh's port from configuration file
blanchet
parents: 53757
diff changeset
   171
      \ --log " ^ log_file ^
298774dbdde0 provide a way to override MaSh's port from configuration file
blanchet
parents: 53757
diff changeset
   172
      " --inputFile " ^ cmd_file ^
298774dbdde0 provide a way to override MaSh's port from configuration file
blanchet
parents: 53757
diff changeset
   173
      " --predictions " ^ sugg_file ^
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   174
      (if extra_args = [] then "" else " " ^ space_implode " " extra_args) ^ " >& " ^ err_file ^
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
   175
      (if background then " &" else "")
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   176
    fun run_on () =
50750
518f0b5ef3d9 tap after, not before command invocation
blanchet
parents: 50735
diff changeset
   177
      (Isabelle_System.bash command
54100
6fefbaeccb63 more prominent MaSh errors
blanchet
parents: 54096
diff changeset
   178
       |> tap (fn _ =>
55286
blanchet
parents: 55202
diff changeset
   179
            (case try File.read (Path.explode err_file) |> the_default "" of
54100
6fefbaeccb63 more prominent MaSh errors
blanchet
parents: 54096
diff changeset
   180
              "" => trace_msg ctxt (K "Done")
55286
blanchet
parents: 55202
diff changeset
   181
            | s => warning ("MaSh error: " ^ elide_string 1000 s)));
50335
b17b05c8d4a4 proper quoting of paths in MaSh shell script, take 2 (cf. b00eeb8e352e)
blanchet
parents: 50319
diff changeset
   182
       read_suggs (fn () => try File.read_lines sugg_path |> these))
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   183
    fun clean_up () =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   184
      if overlord then () else List.app wipe_out_file [err_file, sugg_file, cmd_file]
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   185
  in
50335
b17b05c8d4a4 proper quoting of paths in MaSh shell script, take 2 (cf. b00eeb8e352e)
blanchet
parents: 50319
diff changeset
   186
    write_file (SOME "") ([], K "") sugg_path;
b17b05c8d4a4 proper quoting of paths in MaSh shell script, take 2 (cf. b00eeb8e352e)
blanchet
parents: 50319
diff changeset
   187
    write_file (SOME "") write_cmds cmd_path;
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   188
    trace_msg ctxt (fn () => "Running " ^ command);
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   189
    with_cleanup clean_up run_on ()
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   190
  end
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   191
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
   192
fun meta_char c =
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   193
  if Char.isAlphaNum c orelse c = #"_" orelse c = #"." orelse c = #"(" orelse
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   194
     c = #")" orelse c = #"," then
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   195
    String.str c
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   196
  else
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   197
    (* fixed width, in case more digits follow *)
48395
85a7fb65507a learning should honor the fact override and the chained facts
blanchet
parents: 48394
diff changeset
   198
    "%" ^ stringN_of_int 3 (Char.ord c)
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   199
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
   200
fun unmeta_chars accum [] = String.implode (rev accum)
48395
85a7fb65507a learning should honor the fact override and the chained facts
blanchet
parents: 48394
diff changeset
   201
  | unmeta_chars accum (#"%" :: d1 :: d2 :: d3 :: cs) =
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
   202
    (case Int.fromString (String.implode [d1, d2, d3]) of
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   203
      SOME n => unmeta_chars (Char.chr n :: accum) cs
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   204
    | NONE => "" (* error *))
48395
85a7fb65507a learning should honor the fact override and the chained facts
blanchet
parents: 48394
diff changeset
   205
  | unmeta_chars _ (#"%" :: _) = "" (* error *)
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
   206
  | unmeta_chars accum (c :: cs) = unmeta_chars (c :: accum) cs
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
   207
50826
18ace05656cf start using MaSh hints
blanchet
parents: 50825
diff changeset
   208
val encode_str = String.translate meta_char
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   209
val decode_str = String.explode #> unmeta_chars []
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   210
50826
18ace05656cf start using MaSh hints
blanchet
parents: 50825
diff changeset
   211
val encode_strs = map encode_str #> space_implode " "
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   212
val decode_strs = space_explode " " #> filter_out (curry (op =) "") #> map decode_str
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   213
53558
f9682fdfd47b minor fixes
blanchet
parents: 53556
diff changeset
   214
(* Avoid scientific notation *)
f9682fdfd47b minor fixes
blanchet
parents: 53556
diff changeset
   215
fun safe_str_of_real r =
f9682fdfd47b minor fixes
blanchet
parents: 53556
diff changeset
   216
  if r < 0.00001 then "0.00001"
f9682fdfd47b minor fixes
blanchet
parents: 53556
diff changeset
   217
  else if r >= 1000000.0 then "1000000"
f9682fdfd47b minor fixes
blanchet
parents: 53556
diff changeset
   218
  else Markup.print_real r
f9682fdfd47b minor fixes
blanchet
parents: 53556
diff changeset
   219
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   220
val encode_unweighted_feature = map encode_str #> space_implode "|"
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   221
val decode_unweighted_feature = space_explode "|" #> map decode_str
50356
41f8f1f2e15d added feature weights in MaSh
blanchet
parents: 50355
diff changeset
   222
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   223
fun encode_feature (names, weight) =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   224
  encode_unweighted_feature names ^ (if Real.== (weight, 1.0) then "" else "=" ^ safe_str_of_real weight)
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   225
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   226
val encode_unweighted_features = map encode_unweighted_feature #> space_implode " "
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   227
val decode_unweighted_features = space_explode " " #> map decode_unweighted_feature
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   228
50356
41f8f1f2e15d added feature weights in MaSh
blanchet
parents: 50355
diff changeset
   229
val encode_features = map encode_feature #> space_implode " "
41f8f1f2e15d added feature weights in MaSh
blanchet
parents: 50355
diff changeset
   230
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   231
fun str_of_learn (name, parents, feats, deps) =
50826
18ace05656cf start using MaSh hints
blanchet
parents: 50825
diff changeset
   232
  "! " ^ encode_str name ^ ": " ^ encode_strs parents ^ "; " ^
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   233
  encode_unweighted_features feats ^ "; " ^ encode_strs deps ^ "\n"
48669
cdcdb0547f29 remember ATP flops to avoid repeating them too quickly
blanchet
parents: 48668
diff changeset
   234
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   235
fun str_of_relearn (name, deps) = "p " ^ encode_str name ^ ": " ^ encode_strs deps ^ "\n"
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   236
53099
5c7780d21d24 adapted to new MaSh syntax
blanchet
parents: 53098
diff changeset
   237
fun str_of_query max_suggs (learns, hints, parents, feats) =
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   238
  implode (map str_of_learn learns) ^
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   239
  "? " ^ string_of_int max_suggs ^ " # " ^ encode_strs parents ^ "; " ^ encode_features feats ^
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   240
  (if null hints then "" else "; " ^ encode_strs hints) ^ "\n"
48406
b002cc16aa99 honor suggested MaSh weights
blanchet
parents: 48404
diff changeset
   241
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   242
(* The suggested weights do not make much sense. *)
48406
b002cc16aa99 honor suggested MaSh weights
blanchet
parents: 48404
diff changeset
   243
fun extract_suggestion sugg =
55286
blanchet
parents: 55202
diff changeset
   244
  (case space_explode "=" sugg of
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   245
    [name, _ (* weight *)] => SOME (decode_str name)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   246
  | [name] => SOME (decode_str name)
55286
blanchet
parents: 55202
diff changeset
   247
  | _ => NONE)
48406
b002cc16aa99 honor suggested MaSh weights
blanchet
parents: 48404
diff changeset
   248
50633
87961472b404 tuned ML function name
blanchet
parents: 50632
diff changeset
   249
fun extract_suggestions line =
55286
blanchet
parents: 55202
diff changeset
   250
  (case space_explode ":" line of
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   251
    [goal, suggs] => (decode_str goal, map_filter extract_suggestion (space_explode " " suggs))
55286
blanchet
parents: 55202
diff changeset
   252
  | _ => ("", []))
48311
3c4e10606567 implemented MaSh QUERY operation
blanchet
parents: 48309
diff changeset
   253
50632
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
   254
structure MaSh =
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
   255
struct
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
   256
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   257
fun shutdown ctxt overlord =
53153
1e9735cd27aa better tracing + honor blocking better
blanchet
parents: 53152
diff changeset
   258
  (trace_msg ctxt (K "MaSh shutdown");
53756
be91786f2419 MaSh tweaks to facilitate debugging
blanchet
parents: 53564
diff changeset
   259
   run_mash_tool ctxt overlord [shutdown_server_arg] false ([], K "") (K ()))
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
   260
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
   261
fun save ctxt overlord =
53153
1e9735cd27aa better tracing + honor blocking better
blanchet
parents: 53152
diff changeset
   262
  (trace_msg ctxt (K "MaSh save");
1e9735cd27aa better tracing + honor blocking better
blanchet
parents: 53152
diff changeset
   263
   run_mash_tool ctxt overlord [save_models_arg] true ([], K "") (K ()))
53142
966a251efd16 have kill_all also kill MaSh server + be paranoid about reloading after clear_state, to allow for easier experimentation
blanchet
parents: 53141
diff changeset
   264
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   265
fun unlearn ctxt overlord =
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   266
  let val path = mash_model_dir () in
50632
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
   267
    trace_msg ctxt (K "MaSh unlearn");
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   268
    shutdown ctxt overlord;
50319
dddcaeb92e11 robust writing of MaSh state -- better drop learning data than cause other problems in Sledgehammer
blanchet
parents: 50311
diff changeset
   269
    try (File.fold_dir (fn file => fn _ =>
dddcaeb92e11 robust writing of MaSh state -- better drop learning data than cause other problems in Sledgehammer
blanchet
parents: 50311
diff changeset
   270
                           try File.rm (Path.append path (Path.basic file)))
dddcaeb92e11 robust writing of MaSh state -- better drop learning data than cause other problems in Sledgehammer
blanchet
parents: 50311
diff changeset
   271
                       path) NONE;
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   272
    ()
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   273
  end
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   274
53757
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
   275
fun learn _ _ _ [] = ()
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   276
  | learn ctxt overlord save (learns : (string * string list * string list list * string list) list) (*##*)
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   277
   =
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54143
diff changeset
   278
    let val names = elide_string 1000 (space_implode " " (map #1 learns)) in
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54143
diff changeset
   279
      (trace_msg ctxt (fn () => "MaSh learn" ^ (if names = "" then "" else " " ^ names));
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54143
diff changeset
   280
       run_mash_tool ctxt overlord ([] |> save ? cons save_models_arg) false
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54143
diff changeset
   281
                     (learns, str_of_learn) (K ()))
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54143
diff changeset
   282
    end
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   283
53757
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
   284
fun relearn _ _ _ [] = ()
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
   285
  | relearn ctxt overlord save relearns =
50632
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
   286
    (trace_msg ctxt (fn () => "MaSh relearn " ^
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
   287
         elide_string 1000 (space_implode " " (map #1 relearns)));
53757
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
   288
     run_mash_tool ctxt overlord ([] |> save ? cons save_models_arg) false
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
   289
                   (relearns, str_of_relearn) (K ()))
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   290
53117
2381bdf47ba5 use new MaSh command-line arguments
blanchet
parents: 53116
diff changeset
   291
fun query ctxt overlord max_suggs (query as (_, _, _, feats)) =
50969
blanchet
parents: 50967
diff changeset
   292
  (trace_msg ctxt (fn () => "MaSh query " ^ encode_features feats);
55286
blanchet
parents: 55202
diff changeset
   293
   run_mash_tool ctxt overlord [] false ([query], str_of_query max_suggs) (fn suggs =>
blanchet
parents: 55202
diff changeset
   294
     (case suggs () of
blanchet
parents: 55202
diff changeset
   295
       [] => []
blanchet
parents: 55202
diff changeset
   296
     | suggs => snd (extract_suggestions (List.last suggs))))
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   297
   handle List.Empty => [])
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   298
50632
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
   299
end;
12c097ff3241 slightly more elegant naming convention (to keep low-level and high-level APIs separated)
blanchet
parents: 50631
diff changeset
   300
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   301
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   302
(*** Middle-level communication with MaSh ***)
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   303
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   304
datatype proof_kind = Isar_Proof | Automatic_Proof | Isar_Proof_wegen_Prover_Flop
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   305
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   306
fun str_of_proof_kind Isar_Proof = "i"
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
   307
  | str_of_proof_kind Automatic_Proof = "a"
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
   308
  | str_of_proof_kind Isar_Proof_wegen_Prover_Flop = "x"
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   309
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   310
fun proof_kind_of_str "a" = Automatic_Proof
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
   311
  | proof_kind_of_str "x" = Isar_Proof_wegen_Prover_Flop
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   312
  | proof_kind_of_str _ (* "i" *) = Isar_Proof
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   313
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   314
fun try_graph ctxt when def f =
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   315
  f ()
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   316
  handle
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   317
    Graph.CYCLES (cycle :: _) =>
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   318
    (trace_msg ctxt (fn () => "Cycle involving " ^ commas cycle ^ " when " ^ when); def)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   319
  | Graph.DUP name =>
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   320
    (trace_msg ctxt (fn () => "Duplicate fact " ^ quote name ^ " when " ^ when); def)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   321
  | Graph.UNDEF name =>
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   322
    (trace_msg ctxt (fn () => "Unknown fact " ^ quote name ^ " when " ^ when); def)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   323
  | exn =>
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   324
    if Exn.is_interrupt exn then
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   325
      reraise exn
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   326
    else
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   327
      (trace_msg ctxt (fn () => "Internal error when " ^ when ^ ":\n" ^ Runtime.exn_message exn);
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   328
       def)
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   329
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   330
fun graph_info G =
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   331
  string_of_int (length (Graph.keys G)) ^ " node(s), " ^
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   332
  string_of_int (fold (Integer.add o length o snd) (Graph.dest G) 0) ^
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   333
  " edge(s), " ^
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   334
  string_of_int (length (Graph.minimals G)) ^ " minimal, " ^
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   335
  string_of_int (length (Graph.maximals G)) ^ " maximal"
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   336
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   337
type mash_state =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   338
  {access_G : (proof_kind * string list list * string list) Graph.T,
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   339
   num_known_facts : int,
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   340
   dirty : string list option}
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   341
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   342
val empty_state = {access_G = Graph.empty, num_known_facts = 0, dirty = SOME []} : mash_state
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   343
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   344
local
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   345
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   346
val version = "*** MaSh version 20140516 ***"
50357
187ae76a1757 more robustness in the face of MaSh format changes -- don't overwrite new versions with old versions
blanchet
parents: 50356
diff changeset
   347
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   348
exception FILE_VERSION_TOO_NEW of unit
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   349
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   350
fun extract_node line =
55286
blanchet
parents: 55202
diff changeset
   351
  (case space_explode ":" line of
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   352
    [head, tail] =>
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   353
    (case (space_explode " " head, map (unprefix " ") (space_explode ";" tail)) of
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   354
      ([kind, name], [parents, feats, deps]) =>
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   355
      SOME (proof_kind_of_str kind, decode_str name, decode_strs parents,
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   356
        decode_unweighted_features feats, decode_strs deps)
55286
blanchet
parents: 55202
diff changeset
   357
    | _ => NONE)
blanchet
parents: 55202
diff changeset
   358
  | _ => NONE)
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   359
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
   360
fun load_state _ _ (state as (true, _)) = state
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
   361
  | load_state ctxt overlord _ =
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   362
    let val path = mash_state_file () in
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   363
      (true,
55286
blanchet
parents: 55202
diff changeset
   364
       (case try File.read_lines path of
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   365
         SOME (version' :: node_lines) =>
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   366
         let
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   367
           fun add_edge_to name parent =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   368
             Graph.default_node (parent, (Isar_Proof, [], []))
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   369
             #> Graph.add_edge (parent, name)
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   370
           fun add_node line =
55286
blanchet
parents: 55202
diff changeset
   371
             (case extract_node line of
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   372
               NONE => I (* should not happen *)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   373
             | SOME (kind, name, parents, feats, deps) =>
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   374
               Graph.default_node (name, (kind, feats, deps))
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   375
               #> Graph.map_node name (K (kind, feats, deps))
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   376
               #> fold (add_edge_to name) parents)
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   377
           val (access_G, num_known_facts) =
55286
blanchet
parents: 55202
diff changeset
   378
             (case string_ord (version', version) of
50357
187ae76a1757 more robustness in the face of MaSh format changes -- don't overwrite new versions with old versions
blanchet
parents: 50356
diff changeset
   379
               EQUAL =>
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   380
               (try_graph ctxt "loading state" Graph.empty (fn () =>
55286
blanchet
parents: 55202
diff changeset
   381
                  fold add_node node_lines Graph.empty),
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   382
                length node_lines)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   383
             | LESS => (MaSh.unlearn ctxt overlord; (Graph.empty, 0)) (* cannot parse old file *)
55286
blanchet
parents: 55202
diff changeset
   384
             | GREATER => raise FILE_VERSION_TOO_NEW ())
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   385
         in
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   386
           trace_msg ctxt (fn () => "Loaded fact graph (" ^ graph_info access_G ^ ")");
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   387
           {access_G = access_G, num_known_facts = num_known_facts, dirty = SOME []}
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   388
         end
55286
blanchet
parents: 55202
diff changeset
   389
       | _ => empty_state))
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   390
    end
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   391
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   392
fun str_of_entry (kind, name, parents, feats, deps) =
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   393
  str_of_proof_kind kind ^ " " ^ encode_str name ^ ": " ^ encode_strs parents ^ "; " ^
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   394
  encode_unweighted_features feats ^ "; " ^ encode_strs deps ^ "\n"
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   395
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
   396
fun save_state _ (state as {dirty = SOME [], ...}) = state
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
   397
  | save_state ctxt {access_G, num_known_facts, dirty} =
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   398
    let
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   399
      fun append_entry (name, ((kind, feats, deps), (parents, _))) =
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   400
        cons (kind, name, Graph.Keys.dest parents, feats, deps)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   401
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   402
      val (banner, entries) =
55286
blanchet
parents: 55202
diff changeset
   403
        (case dirty of
blanchet
parents: 55202
diff changeset
   404
          SOME names => (NONE, fold (append_entry o Graph.get_entry access_G) names [])
blanchet
parents: 55202
diff changeset
   405
        | NONE => (SOME (version ^ "\n"), Graph.fold append_entry access_G []))
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   406
    in
50335
b17b05c8d4a4 proper quoting of paths in MaSh shell script, take 2 (cf. b00eeb8e352e)
blanchet
parents: 50319
diff changeset
   407
      write_file banner (entries, str_of_entry) (mash_state_file ());
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   408
      trace_msg ctxt (fn () =>
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   409
        "Saved fact graph (" ^ graph_info access_G ^
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   410
        (case dirty of
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   411
          SOME dirty => "; " ^ string_of_int (length dirty) ^ " dirty fact(s)"
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   412
        | _ => "") ^  ")");
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   413
      {access_G = access_G, num_known_facts = num_known_facts, dirty = SOME []}
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   414
    end
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   415
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   416
val global_state =
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   417
  Synchronized.var "Sledgehammer_MaSh.global_state" (false, empty_state)
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   418
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   419
in
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   420
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   421
fun map_state ctxt overlord f =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   422
  Synchronized.change global_state (load_state ctxt overlord ##> (f #> save_state ctxt))
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   423
  handle FILE_VERSION_TOO_NEW () => ()
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   424
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   425
fun peek_state ctxt overlord f =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   426
  Synchronized.change_result global_state (perhaps (try (load_state ctxt overlord)) #> `snd #>> f)
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   427
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   428
fun clear_state ctxt overlord =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   429
  (* "unlearn" also removes the state file *)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   430
  Synchronized.change global_state (fn _ => (MaSh.unlearn ctxt overlord; (false, empty_state)))
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   431
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   432
end
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   433
53558
f9682fdfd47b minor fixes
blanchet
parents: 53556
diff changeset
   434
fun mash_unlearn ctxt ({overlord, ...} : params) =
53559
3858246c7c8f when pouring in extra features into the goal, only consider facts from the current theory -- the bottom 10 facts of the last import might be completely unrelated
blanchet
parents: 53558
diff changeset
   435
  (clear_state ctxt overlord; Output.urgent_message "Reset MaSh.")
50570
blanchet
parents: 50557
diff changeset
   436
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   437
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   438
(*** Isabelle helpers ***)
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
   439
53819
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
   440
fun is_mash_enabled () = (getenv "MASH" = "yes")
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
   441
50722
b422a48adc2d speed up generation of local theorem nicknames
blanchet
parents: 50718
diff changeset
   442
val local_prefix = "local" ^ Long_Name.separator
48378
9e96486d53ad handle local facts smoothly in MaSh
blanchet
parents: 48377
diff changeset
   443
50722
b422a48adc2d speed up generation of local theorem nicknames
blanchet
parents: 50718
diff changeset
   444
fun elided_backquote_thm threshold th =
b422a48adc2d speed up generation of local theorem nicknames
blanchet
parents: 50718
diff changeset
   445
  elide_string threshold
b422a48adc2d speed up generation of local theorem nicknames
blanchet
parents: 50718
diff changeset
   446
    (backquote_thm (Proof_Context.init_global (Thm.theory_of_thm th)) th)
48378
9e96486d53ad handle local facts smoothly in MaSh
blanchet
parents: 48377
diff changeset
   447
51181
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   448
val thy_name_of_thm = Context.theory_name o Thm.theory_of_thm
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   449
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   450
fun nickname_of_thm th =
48394
82fc8c956cdc fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
blanchet
parents: 48392
diff changeset
   451
  if Thm.has_name_hint th then
82fc8c956cdc fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
blanchet
parents: 48392
diff changeset
   452
    let val hint = Thm.get_name_hint th in
50722
b422a48adc2d speed up generation of local theorem nicknames
blanchet
parents: 50718
diff changeset
   453
      (* There must be a better way to detect local facts. *)
55286
blanchet
parents: 55202
diff changeset
   454
      (case try (unprefix local_prefix) hint of
48394
82fc8c956cdc fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
blanchet
parents: 48392
diff changeset
   455
        SOME suf =>
55286
blanchet
parents: 55202
diff changeset
   456
        thy_name_of_thm th ^ Long_Name.separator ^ suf ^ Long_Name.separator ^
blanchet
parents: 55202
diff changeset
   457
        elided_backquote_thm 50 th
blanchet
parents: 55202
diff changeset
   458
      | NONE => hint)
48394
82fc8c956cdc fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
blanchet
parents: 48392
diff changeset
   459
    end
82fc8c956cdc fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
blanchet
parents: 48392
diff changeset
   460
  else
50722
b422a48adc2d speed up generation of local theorem nicknames
blanchet
parents: 50718
diff changeset
   461
    elided_backquote_thm 200 th
48378
9e96486d53ad handle local facts smoothly in MaSh
blanchet
parents: 48377
diff changeset
   462
51134
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
   463
fun find_suggested_facts ctxt facts =
48330
192444b53e86 speed up MaSh queries
blanchet
parents: 48329
diff changeset
   464
  let
51134
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
   465
    fun add (fact as (_, th)) = Symtab.default (nickname_of_thm th, fact)
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
   466
    val tab = fold add facts Symtab.empty
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
   467
    fun lookup nick =
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
   468
      Symtab.lookup tab nick
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
   469
      |> tap (fn NONE => trace_msg ctxt (fn () => "Cannot find " ^ quote nick)
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
   470
               | _ => ())
d03ded5dcf65 more MaSh tracing
blanchet
parents: 51133
diff changeset
   471
  in map_filter lookup end
48311
3c4e10606567 implemented MaSh QUERY operation
blanchet
parents: 48309
diff changeset
   472
50383
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   473
fun scaled_avg [] = 0
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   474
  | scaled_avg xs =
48407
47fe0ca12fc2 faster maximal node computation
blanchet
parents: 48406
diff changeset
   475
    Real.ceil (100000000.0 * fold (curry (op +)) xs 0.0) div length xs
48328
ca0b7d19dd62 attempt at meshing according to more meaningful factors
blanchet
parents: 48327
diff changeset
   476
50383
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   477
fun avg [] = 0.0
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   478
  | avg xs = fold (curry (op +)) xs 0.0 / Real.fromInt (length xs)
48313
0faafdffa662 mesh facts by taking into consideration whether a fact is known to MeSh
blanchet
parents: 48312
diff changeset
   479
50383
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   480
fun normalize_scores _ [] = []
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   481
  | normalize_scores max_facts xs =
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   482
    let val avg = avg (map snd (take max_facts xs)) in
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   483
      map (apsnd (curry Real.* (1.0 / avg))) xs
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   484
    end
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   485
50814
4247cbd78aaf export MeSh data as well
blanchet
parents: 50755
diff changeset
   486
fun mesh_facts _ max_facts [(_, (sels, unks))] =
48406
b002cc16aa99 honor suggested MaSh weights
blanchet
parents: 48404
diff changeset
   487
    map fst (take max_facts sels) @ take (max_facts - length sels) unks
50861
fa4253914e98 honor unknown chained in MaSh and a few other tweaks
blanchet
parents: 50860
diff changeset
   488
  | mesh_facts fact_eq max_facts mess =
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
   489
    let
51029
211a9240b1e3 killed deadcode
blanchet
parents: 51025
diff changeset
   490
      val mess = mess |> map (apsnd (apfst (normalize_scores max_facts)))
211a9240b1e3 killed deadcode
blanchet
parents: 51025
diff changeset
   491
      fun score_in fact (global_weight, (sels, unks)) =
50383
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   492
        let
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   493
          val score_at = try (nth sels) #> Option.map (fn (_, score) => global_weight * score)
50383
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   494
        in
55286
blanchet
parents: 55202
diff changeset
   495
          (case find_index (curry fact_eq fact o fst) sels of
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   496
            ~1 => if member fact_eq unks fact then NONE else SOME 0.0
55286
blanchet
parents: 55202
diff changeset
   497
          | rank => score_at rank)
50383
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   498
        end
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
   499
      fun weight_of fact = mess |> map_filter (score_in fact) |> scaled_avg
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   500
      val facts = fold (union fact_eq o map fst o take max_facts o fst o snd) mess []
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
   501
    in
48406
b002cc16aa99 honor suggested MaSh weights
blanchet
parents: 48404
diff changeset
   502
      facts |> map (`weight_of) |> sort (int_ord o swap o pairself fst)
48328
ca0b7d19dd62 attempt at meshing according to more meaningful factors
blanchet
parents: 48327
diff changeset
   503
            |> map snd |> take max_facts
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
   504
    end
48312
b40722a81ac9 implemented meshing of Iter and MaSh results
blanchet
parents: 48311
diff changeset
   505
54693
dd5874e4553f more reasonable default weight
blanchet
parents: 54503
diff changeset
   506
val default_weight = 1.0
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   507
fun free_feature_of s = (["f" ^ s], 40.0 (* FUDGE *))
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   508
fun thy_feature_of s = (["y" ^ s], 8.0 (* FUDGE *))
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   509
fun type_feature_of s = (["t" ^ s], 4.0 (* FUDGE *))
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   510
fun var_feature_of s = ([s], 1.0 (* FUDGE *))
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   511
fun class_feature_of s = (["s" ^ s], 1.0 (* FUDGE *))
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   512
val local_feature = (["local"], 16.0 (* FUDGE *))
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   513
51135
e32114b25551 tuned code
blanchet
parents: 51134
diff changeset
   514
fun crude_theory_ord p =
50722
b422a48adc2d speed up generation of local theorem nicknames
blanchet
parents: 50718
diff changeset
   515
  if Theory.subthy p then
b422a48adc2d speed up generation of local theorem nicknames
blanchet
parents: 50718
diff changeset
   516
    if Theory.eq_thy p then EQUAL else LESS
48324
3ee5b5589402 speed up tautology/metaness check
blanchet
parents: 48323
diff changeset
   517
  else if Theory.subthy (swap p) then
3ee5b5589402 speed up tautology/metaness check
blanchet
parents: 48323
diff changeset
   518
    GREATER
55286
blanchet
parents: 55202
diff changeset
   519
  else
blanchet
parents: 55202
diff changeset
   520
    (case int_ord (pairself (length o Theory.ancestors_of) p) of
blanchet
parents: 55202
diff changeset
   521
      EQUAL => string_ord (pairself Context.theory_name p)
blanchet
parents: 55202
diff changeset
   522
    | order => order)
48324
3ee5b5589402 speed up tautology/metaness check
blanchet
parents: 48323
diff changeset
   523
51135
e32114b25551 tuned code
blanchet
parents: 51134
diff changeset
   524
fun crude_thm_ord p =
55286
blanchet
parents: 55202
diff changeset
   525
  (case crude_theory_ord (pairself theory_of_thm p) of
50359
da395f0e7dea tweaked order of theorems to avoid forward dependencies (MaSh)
blanchet
parents: 50357
diff changeset
   526
    EQUAL =>
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   527
    let val q = pairself nickname_of_thm p in
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   528
      (* Hack to put "xxx_def" before "xxxI" and "xxxE" *)
55286
blanchet
parents: 55202
diff changeset
   529
      (case bool_ord (pairself (String.isSuffix "_def") (swap q)) of
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   530
        EQUAL => string_ord q
55286
blanchet
parents: 55202
diff changeset
   531
      | ord => ord)
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   532
    end
55286
blanchet
parents: 55202
diff changeset
   533
  | ord => ord)
48324
3ee5b5589402 speed up tautology/metaness check
blanchet
parents: 48323
diff changeset
   534
51136
fdcc06013f2d avoid crude/wrong theorem comparision
blanchet
parents: 51135
diff changeset
   535
val thm_less_eq = Theory.subthy o pairself theory_of_thm
fdcc06013f2d avoid crude/wrong theorem comparision
blanchet
parents: 51135
diff changeset
   536
fun thm_less p = thm_less_eq p andalso not (thm_less_eq (swap p))
fdcc06013f2d avoid crude/wrong theorem comparision
blanchet
parents: 51135
diff changeset
   537
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   538
val freezeT = Type.legacy_freeze_type
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   539
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   540
fun freeze (t $ u) = freeze t $ freeze u
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   541
  | freeze (Abs (s, T, t)) = Abs (s, freezeT T, freeze t)
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   542
  | freeze (Var ((s, _), T)) = Free (s, freezeT T)
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   543
  | freeze (Const (s, T)) = Const (s, freezeT T)
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   544
  | freeze (Free (s, T)) = Free (s, freezeT T)
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   545
  | freeze t = t
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   546
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   547
fun goal_of_thm thy = prop_of #> freeze #> cterm_of thy #> Goal.init
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   548
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54140
diff changeset
   549
fun run_prover_for_mash ctxt params prover goal_name facts goal =
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   550
  let
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   551
    val problem =
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54140
diff changeset
   552
      {comment = "Goal: " ^ goal_name, state = Proof.init ctxt, goal = goal, subgoal = 1,
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54140
diff changeset
   553
       subgoal_count = 1, factss = [("", facts)]}
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   554
  in
54503
blanchet
parents: 54432
diff changeset
   555
    get_minimizing_prover ctxt MaSh (K ()) prover params (K (K (K ""))) problem
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   556
  end
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   557
48326
ef800e91d072 removed debugging output
blanchet
parents: 48325
diff changeset
   558
val bad_types = [@{type_name prop}, @{type_name bool}, @{type_name fun}]
ef800e91d072 removed debugging output
blanchet
parents: 48325
diff changeset
   559
53086
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   560
val pat_tvar_prefix = "_"
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   561
val pat_var_prefix = "_"
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   562
53089
a58b3b8631c6 keep long names to stay on the safe side
blanchet
parents: 53086
diff changeset
   563
(* try "Long_Name.base_name" for shorter names *)
56254
a2dd9200854d more antiquotations;
wenzelm
parents: 55642
diff changeset
   564
fun massage_long_name s = if s = @{class type} then "T" else s
53083
019ecbb18e3f generate patterns for variables as well in MaSh (cf. HOL(y)Hammer)
blanchet
parents: 53082
diff changeset
   565
53086
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   566
val crude_str_of_sort =
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   567
  space_implode ":" o map massage_long_name o subtract (op =) @{sort type}
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   568
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   569
fun crude_str_of_typ (Type (s, [])) = massage_long_name s
53083
019ecbb18e3f generate patterns for variables as well in MaSh (cf. HOL(y)Hammer)
blanchet
parents: 53082
diff changeset
   570
  | crude_str_of_typ (Type (s, Ts)) =
53128
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   571
    massage_long_name s ^ implode (map crude_str_of_typ Ts)
53083
019ecbb18e3f generate patterns for variables as well in MaSh (cf. HOL(y)Hammer)
blanchet
parents: 53082
diff changeset
   572
  | crude_str_of_typ (TFree (_, S)) = crude_str_of_sort S
019ecbb18e3f generate patterns for variables as well in MaSh (cf. HOL(y)Hammer)
blanchet
parents: 53082
diff changeset
   573
  | crude_str_of_typ (TVar (_, S)) = crude_str_of_sort S
019ecbb18e3f generate patterns for variables as well in MaSh (cf. HOL(y)Hammer)
blanchet
parents: 53082
diff changeset
   574
53128
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   575
fun maybe_singleton_str _ "" = []
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   576
  | maybe_singleton_str pref s = [pref ^ s]
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   577
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   578
val max_pat_breadth = 10 (* FUDGE *)
50585
306c7b807e13 contain exponential explosion of term patterns
blanchet
parents: 50584
diff changeset
   579
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   580
fun keep m xs =
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   581
  let val n = length xs in
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   582
    if n <= m then xs else take (m div 2) xs @ drop (n - (m + 1) div 2) xs
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   583
  end
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   584
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   585
fun sort_of_type alg T =
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   586
  let
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   587
    val graph = Sorts.classes_of alg
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   588
    fun cls_of S [] = S
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   589
      | cls_of S (cl :: cls) =
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   590
        if Sorts.of_sort alg (T, [cl]) then
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   591
          cls_of (insert (op =) cl S) cls
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   592
        else
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   593
          let val cls' = Sorts.minimize_sort alg (Sorts.super_classes alg cl) in
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   594
            cls_of S (union (op =) cls' cls)
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   595
          end
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   596
  in
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   597
    cls_of [] (Graph.maximals graph)
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   598
  end
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   599
54698
fed04f257898 disable generalization in MaSh until it is shown to help
blanchet
parents: 54695
diff changeset
   600
val generalize_goal = false
fed04f257898 disable generalization in MaSh until it is shown to help
blanchet
parents: 54695
diff changeset
   601
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   602
fun term_features_of ctxt thy_name num_facts const_tab term_max_depth type_max_depth in_goal ts =
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   603
  let
50392
190053ee24ed expand type classes into their ancestors for MaSh
blanchet
parents: 50391
diff changeset
   604
    val thy = Proof_Context.theory_of ctxt
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   605
    val alg = Sign.classes_of thy
53082
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   606
50393
d8aa26c78327 record free variables as a MaSh feature
blanchet
parents: 50392
diff changeset
   607
    val fixes = map snd (Variable.dest_fixes ctxt)
50392
190053ee24ed expand type classes into their ancestors for MaSh
blanchet
parents: 50391
diff changeset
   608
    val classes = Sign.classes_of thy
53082
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   609
48304
50e64af9c829 more work on MaSh
blanchet
parents: 48303
diff changeset
   610
    fun add_classes @{sort type} = I
50392
190053ee24ed expand type classes into their ancestors for MaSh
blanchet
parents: 50391
diff changeset
   611
      | add_classes S =
190053ee24ed expand type classes into their ancestors for MaSh
blanchet
parents: 50391
diff changeset
   612
        fold (`(Sorts.super_classes classes)
190053ee24ed expand type classes into their ancestors for MaSh
blanchet
parents: 50391
diff changeset
   613
              #> swap #> op ::
53086
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   614
              #> subtract (op =) @{sort type} #> map massage_long_name
50392
190053ee24ed expand type classes into their ancestors for MaSh
blanchet
parents: 50391
diff changeset
   615
              #> map class_feature_of
53159
a5805fe4e91c repaired num_extra_feature_facts + tuning
blanchet
parents: 53156
diff changeset
   616
              #> union (eq_fst (op =))) S
53082
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   617
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   618
    fun pattify_type 0 _ = []
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   619
      | pattify_type _ (Type (s, [])) =
53086
15fe0ca088b3 MaSh tweaking: shorter names + killed (broken) SNoW
blanchet
parents: 53085
diff changeset
   620
        if member (op =) bad_types s then [] else [massage_long_name s]
53082
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   621
      | pattify_type depth (Type (s, U :: Ts)) =
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   622
        let
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   623
          val T = Type (s, Ts)
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   624
          val ps = keep max_pat_breadth (pattify_type depth T)
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   625
          val qs = keep max_pat_breadth ("" :: pattify_type (depth - 1) U)
53130
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   626
        in map_product (fn p => fn "" => p | q => p ^ "(" ^ q ^ ")") ps qs end
53128
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   627
      | pattify_type _ (TFree (_, S)) =
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   628
        maybe_singleton_str pat_tvar_prefix (crude_str_of_sort S)
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   629
      | pattify_type _ (TVar (_, S)) =
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   630
        maybe_singleton_str pat_tvar_prefix (crude_str_of_sort S)
53082
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   631
    fun add_type_pat depth T =
53159
a5805fe4e91c repaired num_extra_feature_facts + tuning
blanchet
parents: 53156
diff changeset
   632
      union (eq_fst (op =)) (map type_feature_of (pattify_type depth T))
53082
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   633
    fun add_type_pats 0 _ = I
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   634
      | add_type_pats depth t =
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   635
        add_type_pat depth t #> add_type_pats (depth - 1) t
53083
019ecbb18e3f generate patterns for variables as well in MaSh (cf. HOL(y)Hammer)
blanchet
parents: 53082
diff changeset
   636
    fun add_type T =
019ecbb18e3f generate patterns for variables as well in MaSh (cf. HOL(y)Hammer)
blanchet
parents: 53082
diff changeset
   637
      add_type_pats type_max_depth T
53156
f79f4693868b minor MaSh fix
blanchet
parents: 53155
diff changeset
   638
      #> fold_atyps_sorts (add_classes o snd) T
53084
877f5c28016f add subtypes as well as features in MaSh
blanchet
parents: 53083
diff changeset
   639
    fun add_subtypes (T as Type (_, Ts)) = add_type T #> fold add_subtypes Ts
877f5c28016f add subtypes as well as features in MaSh
blanchet
parents: 53083
diff changeset
   640
      | add_subtypes T = add_type T
53082
369e39511555 generate deep type patterns in MaSh
blanchet
parents: 52697
diff changeset
   641
53130
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   642
    fun weight_of_const s =
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   643
      16.0 +
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   644
      (if num_facts = 0 then
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   645
         0.0
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   646
       else
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   647
         let val count = Symtab.lookup const_tab s |> the_default 1 in
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   648
           Real.fromInt num_facts / Real.fromInt count (* FUDGE *)
53130
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   649
         end)
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   650
    fun pattify_term _ 0 _ = ([] : (string list * real) list)
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   651
      | pattify_term _ _ (Const (x as (s, _))) =
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   652
        if is_widely_irrelevant_const s then
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   653
          []
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   654
        else
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   655
          let
54698
fed04f257898 disable generalization in MaSh until it is shown to help
blanchet
parents: 54695
diff changeset
   656
            val strs_of_sort =
fed04f257898 disable generalization in MaSh until it is shown to help
blanchet
parents: 54695
diff changeset
   657
              (if generalize_goal andalso in_goal then Sorts.complete_sort alg
fed04f257898 disable generalization in MaSh until it is shown to help
blanchet
parents: 54695
diff changeset
   658
               else single o hd)
fed04f257898 disable generalization in MaSh until it is shown to help
blanchet
parents: 54695
diff changeset
   659
              #> map massage_long_name
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   660
            fun strs_of_type_arg (T as Type (s, _)) =
54698
fed04f257898 disable generalization in MaSh until it is shown to help
blanchet
parents: 54695
diff changeset
   661
                massage_long_name s ::
fed04f257898 disable generalization in MaSh until it is shown to help
blanchet
parents: 54695
diff changeset
   662
                (if generalize_goal andalso in_goal then strs_of_sort (sort_of_type alg T) else [])
54799
blanchet
parents: 54698
diff changeset
   663
              | strs_of_type_arg (TFree (_, S)) = strs_of_sort S
blanchet
parents: 54698
diff changeset
   664
              | strs_of_type_arg (TVar (_, S)) = strs_of_sort S
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   665
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   666
            val typargss =
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   667
              these (try (Sign.const_typargs thy) x)
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   668
              |> map strs_of_type_arg
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   669
              |> n_fold_cartesian_product
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   670
              |> keep max_pat_breadth
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   671
            val s' = massage_long_name s
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   672
            val w = weight_of_const s
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   673
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   674
            fun str_of_type_args [] = ""
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   675
              | str_of_type_args ss = "(" ^ space_implode "," ss ^ ")"
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   676
          in
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   677
            [(map (curry (op ^) s' o str_of_type_args) typargss, w)]
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   678
          end
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   679
      | pattify_term _ _ (Free (s, T)) =
53128
ea1b62ed5a54 get rid of some silly MaSh features
blanchet
parents: 53127
diff changeset
   680
        maybe_singleton_str pat_var_prefix (crude_str_of_typ T)
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   681
        |> map var_feature_of
53090
1426c97311f2 treat frees as both consts and vars, for more hits
blanchet
parents: 53089
diff changeset
   682
        |> (if member (op =) fixes s then
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   683
              cons (free_feature_of (massage_long_name (thy_name ^ Long_Name.separator ^ s)))
53090
1426c97311f2 treat frees as both consts and vars, for more hits
blanchet
parents: 53089
diff changeset
   684
            else
1426c97311f2 treat frees as both consts and vars, for more hits
blanchet
parents: 53089
diff changeset
   685
              I)
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   686
      | pattify_term _ _ (Var (_, T)) =
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   687
        maybe_singleton_str pat_var_prefix (crude_str_of_typ T)
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   688
        |> map var_feature_of
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   689
      | pattify_term Ts _ (Bound j) =
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   690
        maybe_singleton_str pat_var_prefix (crude_str_of_typ (nth Ts j))
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   691
        |> map var_feature_of
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   692
      | pattify_term Ts depth (t $ u) =
50339
d8dae91f3107 MaSh improvements: deeper patterns + more respect for chained facts
blanchet
parents: 50338
diff changeset
   693
        let
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   694
          val ps = keep max_pat_breadth (pattify_term Ts depth t)
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   695
          val qs = keep max_pat_breadth (([], default_weight) :: pattify_term Ts (depth - 1) u)
53130
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   696
        in
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   697
          map_product (fn ppw as (p :: _, pw) =>
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   698
              fn ([], _) => ppw
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   699
               | (q :: _, qw) => ([p ^ "(" ^ q ^ ")"], pw + qw)) ps qs
53130
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   700
        end
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   701
      | pattify_term _ _ _ = []
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   702
    fun add_term_pat Ts = union (eq_fst (op =)) oo pattify_term Ts
53130
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   703
    fun add_term_pats _ 0 _ = I
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   704
      | add_term_pats Ts depth t =
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   705
        add_term_pat Ts depth t #> add_term_pats Ts (depth - 1) t
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   706
    fun add_term Ts = add_term_pats Ts term_max_depth
53085
15483854c83e handle Bounds as well in MaSh features
blanchet
parents: 53084
diff changeset
   707
    fun add_subterms Ts t =
55286
blanchet
parents: 55202
diff changeset
   708
      (case strip_comb t of
54089
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   709
        (Const (s, T), args) =>
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   710
        (not (is_widely_irrelevant_const s) ? add_term Ts t)
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   711
        #> add_subtypes T
b13f6731f873 use same relevance filter for ATP and SMT solvers -- attempting to filter out certain ground instances of polymorphic symbols like + and 0 has unexpected side-effects that lead to incompletenesses (relevant facts not being selected)
blanchet
parents: 54085
diff changeset
   712
        #> fold (add_subterms Ts) args
50857
80768e28c9ee better handlig of built-ins -- at the top-level, not in subterms
blanchet
parents: 50841
diff changeset
   713
      | (head, args) =>
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   714
        (case head of
53130
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   715
           Free (_, T) => add_term Ts t #> add_subtypes T
53084
877f5c28016f add subtypes as well as features in MaSh
blanchet
parents: 53083
diff changeset
   716
         | Var (_, T) => add_subtypes T
53085
15483854c83e handle Bounds as well in MaSh features
blanchet
parents: 53084
diff changeset
   717
         | Abs (_, T, body) => add_subtypes T #> add_subterms (T :: Ts) body
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   718
         | _ => I)
55286
blanchet
parents: 55202
diff changeset
   719
        #> fold (add_subterms Ts) args)
53085
15483854c83e handle Bounds as well in MaSh features
blanchet
parents: 53084
diff changeset
   720
  in [] |> fold (add_subterms []) ts end
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   721
53085
15483854c83e handle Bounds as well in MaSh features
blanchet
parents: 53084
diff changeset
   722
val term_max_depth = 2
53155
2c585fdbe197 eliminated some needless MaSh features
blanchet
parents: 53154
diff changeset
   723
val type_max_depth = 1
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   724
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   725
(* TODO: Generate type classes for types? *)
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   726
fun features_of ctxt thy num_facts const_tab (scope, _) in_goal ts =
50393
d8aa26c78327 record free variables as a MaSh feature
blanchet
parents: 50392
diff changeset
   727
  let val thy_name = Context.theory_name thy in
d8aa26c78327 record free variables as a MaSh feature
blanchet
parents: 50392
diff changeset
   728
    thy_feature_of thy_name ::
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   729
    term_features_of ctxt thy_name num_facts const_tab term_max_depth type_max_depth in_goal ts
50393
d8aa26c78327 record free variables as a MaSh feature
blanchet
parents: 50392
diff changeset
   730
    |> scope <> Global ? cons local_feature
d8aa26c78327 record free variables as a MaSh feature
blanchet
parents: 50392
diff changeset
   731
  end
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   732
50434
960a3429615c more MaSh tweaking -- in particular, export the same facts in "MaSh_Export" as are later tried in "MaSh_Eval"
blanchet
parents: 50412
diff changeset
   733
(* Too many dependencies is a sign that a decision procedure is at work. There
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   734
   is not much to learn from such proofs. *)
50434
960a3429615c more MaSh tweaking -- in particular, export the same facts in "MaSh_Export" as are later tried in "MaSh_Eval"
blanchet
parents: 50412
diff changeset
   735
val max_dependencies = 20
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
   736
54125
420b876ff1e2 if slicing is disabled, don't enforce last slice's "max_facts", but rather the maximum "max_facts"
blanchet
parents: 54123
diff changeset
   737
val prover_default_max_facts = 25
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   738
48438
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   739
(* "type_definition_xxx" facts are characterized by their use of "CollectI". *)
50755
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   740
val typedef_dep = nickname_of_thm @{thm CollectI}
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   741
(* Mysterious parts of the class machinery create lots of proofs that refer
52071
0e70511cbba9 made "completish" mode a bit more complete
blanchet
parents: 52048
diff changeset
   742
   exclusively to "someI_ex" (and to some internal constructions). *)
50755
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   743
val class_some_dep = nickname_of_thm @{thm someI_ex}
48438
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   744
50828
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   745
val fundef_ths =
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   746
  @{thms fundef_ex1_existence fundef_ex1_uniqueness fundef_ex1_iff
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   747
         fundef_default_value}
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   748
  |> map nickname_of_thm
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   749
48438
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   750
(* "Rep_xxx_inject", "Abs_xxx_inverse", etc., are derived using these facts. *)
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   751
val typedef_ths =
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   752
  @{thms type_definition.Abs_inverse type_definition.Rep_inverse
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   753
         type_definition.Rep type_definition.Rep_inject
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   754
         type_definition.Abs_inject type_definition.Rep_cases
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   755
         type_definition.Abs_cases type_definition.Rep_induct
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   756
         type_definition.Abs_induct type_definition.Rep_range
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   757
         type_definition.Abs_image}
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   758
  |> map nickname_of_thm
48438
3e45c98fe127 distinguish between recursive and nonrecursive definitions + clean up typedef dependencies in MaSh
blanchet
parents: 48436
diff changeset
   759
48441
2d2f009ca8eb remove MaSh junk associated with size functions
blanchet
parents: 48440
diff changeset
   760
fun is_size_def [dep] th =
55642
63beb38e9258 adapted to renaming of datatype 'cases' and 'recs' to 'case' and 'rec'
blanchet
parents: 55286
diff changeset
   761
    (case first_field ".rec" dep of
48441
2d2f009ca8eb remove MaSh junk associated with size functions
blanchet
parents: 48440
diff changeset
   762
       SOME (pref, _) =>
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   763
       (case first_field ".size" (nickname_of_thm th) of
48441
2d2f009ca8eb remove MaSh junk associated with size functions
blanchet
parents: 48440
diff changeset
   764
          SOME (pref', _) => pref = pref'
2d2f009ca8eb remove MaSh junk associated with size functions
blanchet
parents: 48440
diff changeset
   765
        | NONE => false)
2d2f009ca8eb remove MaSh junk associated with size functions
blanchet
parents: 48440
diff changeset
   766
     | NONE => false)
2d2f009ca8eb remove MaSh junk associated with size functions
blanchet
parents: 48440
diff changeset
   767
  | is_size_def _ _ = false
2d2f009ca8eb remove MaSh junk associated with size functions
blanchet
parents: 48440
diff changeset
   768
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   769
fun no_dependencies_for_status status =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   770
  status = Non_Rec_Def orelse status = Rec_Def
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   771
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
   772
fun trim_dependencies deps =
50755
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   773
  if length deps > max_dependencies then NONE else SOME deps
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   774
50755
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   775
fun isar_dependencies_of name_tabs th =
51020
242cd1632b0b removed spurious trimming
blanchet
parents: 51010
diff changeset
   776
  let val deps = thms_in_proof (SOME name_tabs) th in
50828
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   777
    if deps = [typedef_dep] orelse
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   778
       deps = [class_some_dep] orelse
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   779
       exists (member (op =) fundef_ths) deps orelse
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   780
       exists (member (op =) typedef_ths) deps orelse
91e6836bb68b don't learn from the proof of "psimps" etc.
blanchet
parents: 50827
diff changeset
   781
       is_size_def deps th then
50755
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   782
      []
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   783
    else
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   784
      deps
4c781d65c0d6 get rid of spurious "Isar" proofs
blanchet
parents: 50754
diff changeset
   785
  end
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
   786
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
   787
fun prover_dependencies_of ctxt (params as {verbose, max_facts, ...}) prover
50735
6b232d76cbc9 refined class handling, to prevent cycles in fact graph
blanchet
parents: 50732
diff changeset
   788
                           auto_level facts name_tabs th =
55286
blanchet
parents: 55202
diff changeset
   789
  (case isar_dependencies_of name_tabs th of
50754
74a6adcb96ac also generate queries for goals with too many Isar dependencies
blanchet
parents: 50751
diff changeset
   790
    [] => (false, [])
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   791
  | isar_deps =>
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   792
    let
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   793
      val thy = Proof_Context.theory_of ctxt
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   794
      val goal = goal_of_thm thy th
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54140
diff changeset
   795
      val name = nickname_of_thm th
52196
2281f33e8da6 redid rac7830871177 to avoid duplicate fixed variable (e.g. lemma "P (a::nat)" proof - have "!!a::int. Q a" sledgehammer [e])
blanchet
parents: 52125
diff changeset
   796
      val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal goal 1 ctxt
51136
fdcc06013f2d avoid crude/wrong theorem comparision
blanchet
parents: 51135
diff changeset
   797
      val facts = facts |> filter (fn (_, th') => thm_less (th', th))
51004
5f2788c38127 distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents: 51003
diff changeset
   798
      fun nickify ((_, stature), th) = ((nickname_of_thm th, stature), th)
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   799
      fun is_dep dep (_, th) = nickname_of_thm th = dep
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   800
      fun add_isar_dep facts dep accum =
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   801
        if exists (is_dep dep) accum then
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   802
          accum
55286
blanchet
parents: 55202
diff changeset
   803
        else
blanchet
parents: 55202
diff changeset
   804
          (case find_first (is_dep dep) facts of
blanchet
parents: 55202
diff changeset
   805
            SOME ((_, status), th) => accum @ [(("", status), th)]
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   806
          | NONE => accum (* should not happen *))
54123
271a8377656f remove overloading of "max_facts" -- it already controls the number of facts passed to ATPs for 'learn_prover'
blanchet
parents: 54115
diff changeset
   807
      val mepo_facts =
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
   808
        facts
54095
d80743f28fec simplify fudge factor code
blanchet
parents: 54091
diff changeset
   809
        |> mepo_suggested_facts ctxt params (max_facts |> the_default prover_default_max_facts) NONE
d80743f28fec simplify fudge factor code
blanchet
parents: 54091
diff changeset
   810
             hyp_ts concl_t
54123
271a8377656f remove overloading of "max_facts" -- it already controls the number of facts passed to ATPs for 'learn_prover'
blanchet
parents: 54115
diff changeset
   811
      val facts =
271a8377656f remove overloading of "max_facts" -- it already controls the number of facts passed to ATPs for 'learn_prover'
blanchet
parents: 54115
diff changeset
   812
        mepo_facts
50754
74a6adcb96ac also generate queries for goals with too many Isar dependencies
blanchet
parents: 50751
diff changeset
   813
        |> fold (add_isar_dep facts) isar_deps
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
   814
        |> map nickify
54123
271a8377656f remove overloading of "max_facts" -- it already controls the number of facts passed to ATPs for 'learn_prover'
blanchet
parents: 54115
diff changeset
   815
      val num_isar_deps = length isar_deps
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   816
    in
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
   817
      if verbose andalso auto_level = 0 then
54141
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54140
diff changeset
   818
        "MaSh: " ^ quote prover ^ " on " ^ quote name ^ " with " ^ string_of_int num_isar_deps ^
f57f8e7a879f generate a comment storing the goal nickname in "learn_prover"
blanchet
parents: 54140
diff changeset
   819
        " + " ^ string_of_int (length facts - num_isar_deps) ^ " facts."
54123
271a8377656f remove overloading of "max_facts" -- it already controls the number of facts passed to ATPs for 'learn_prover'
blanchet
parents: 54115
diff changeset
   820
        |> Output.urgent_message
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   821
      else
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   822
        ();
55286
blanchet
parents: 55202
diff changeset
   823
      (case run_prover_for_mash ctxt params prover name facts goal of
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   824
        {outcome = NONE, used_facts, ...} =>
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
   825
        (if verbose andalso auto_level = 0 then
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   826
           let val num_facts = length used_facts in
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   827
             "Found proof with " ^ string_of_int num_facts ^ " fact" ^
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   828
             plural_s num_facts ^ "."
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   829
             |> Output.urgent_message
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   830
           end
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   831
         else
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
   832
           ();
50754
74a6adcb96ac also generate queries for goals with too many Isar dependencies
blanchet
parents: 50751
diff changeset
   833
         (true, map fst used_facts))
55286
blanchet
parents: 55202
diff changeset
   834
      | _ => (false, isar_deps))
blanchet
parents: 55202
diff changeset
   835
    end)
48251
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   836
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   837
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   838
(*** High-level communication with MaSh ***)
6cdcfbddc077 moved most of MaSh exporter code to Sledgehammer
blanchet
parents: 48249
diff changeset
   839
51182
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   840
(* In the following functions, chunks are risers w.r.t. "thm_less_eq". *)
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   841
51181
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   842
fun chunks_and_parents_for chunks th =
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   843
  let
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   844
    fun insert_parent new parents =
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   845
      let val parents = parents |> filter_out (fn p => thm_less_eq (p, new)) in
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   846
        parents |> forall (fn p => not (thm_less_eq (new, p))) parents
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   847
                   ? cons new
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   848
      end
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   849
    fun rechunk seen (rest as th' :: ths) =
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   850
      if thm_less_eq (th', th) then (rev seen, rest)
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   851
      else rechunk (th' :: seen) ths
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   852
    fun do_chunk [] accum = accum
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   853
      | do_chunk (chunk as hd_chunk :: _) (chunks, parents) =
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   854
        if thm_less_eq (hd_chunk, th) then
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   855
          (chunk :: chunks, insert_parent hd_chunk parents)
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   856
        else if thm_less_eq (List.last chunk, th) then
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   857
          let val (front, back as hd_back :: _) = rechunk [] chunk in
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   858
            (front :: back :: chunks, insert_parent hd_back parents)
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   859
          end
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   860
        else
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   861
          (chunk :: chunks, parents)
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   862
  in
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   863
    fold_rev do_chunk chunks ([], [])
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   864
    |>> cons []
51182
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   865
    ||> map nickname_of_thm
51181
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   866
  end
d0fa18638478 implement (more) accurate computation of parents
blanchet
parents: 51180
diff changeset
   867
51182
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   868
fun attach_parents_to_facts _ [] = []
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   869
  | attach_parents_to_facts old_facts (facts as (_, th) :: _) =
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   870
    let
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   871
      fun do_facts _ [] = []
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   872
        | do_facts (_, parents) [fact] = [(parents, fact)]
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   873
        | do_facts (chunks, parents)
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   874
                   ((fact as (_, th)) :: (facts as (_, th') :: _)) =
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   875
          let
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   876
            val chunks = app_hd (cons th) chunks
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   877
            val chunks_and_parents' =
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   878
              if thm_less_eq (th, th') andalso
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   879
                 thy_name_of_thm th = thy_name_of_thm th' then
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   880
                (chunks, [nickname_of_thm th])
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   881
              else
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   882
                chunks_and_parents_for chunks th'
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   883
          in (parents, fact) :: do_facts chunks_and_parents' facts end
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   884
    in
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   885
      old_facts @ facts
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   886
      |> do_facts (chunks_and_parents_for [[]] th)
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   887
      |> drop (length old_facts)
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
   888
    end
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
   889
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   890
fun maximal_wrt_graph G keys =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   891
  let
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   892
    val tab = Symtab.empty |> fold (fn name => Symtab.default (name, ())) keys
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   893
    fun insert_new seen name =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   894
      not (Symtab.defined seen name) ? insert (op =) name
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   895
    fun num_keys keys = Graph.Keys.fold (K (Integer.add 1)) keys 0
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   896
    fun find_maxes _ (maxs, []) = map snd maxs
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   897
      | find_maxes seen (maxs, new :: news) =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   898
        find_maxes
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   899
            (seen |> num_keys (Graph.imm_succs G new) > 1
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   900
                     ? Symtab.default (new, ()))
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   901
            (if Symtab.defined tab new then
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   902
               let
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   903
                 val newp = Graph.all_preds G [new]
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   904
                 fun is_ancestor x yp = member (op =) yp x
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   905
                 val maxs =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   906
                   maxs |> filter (fn (_, max) => not (is_ancestor max newp))
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   907
               in
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   908
                 if exists (is_ancestor new o fst) maxs then
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   909
                   (maxs, news)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   910
                 else
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   911
                   ((newp, new)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   912
                    :: filter_out (fn (_, max) => is_ancestor max newp) maxs,
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   913
                    news)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   914
               end
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   915
             else
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   916
               (maxs, Graph.Keys.fold (insert_new seen)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   917
                                      (Graph.imm_preds G new) news))
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   918
  in find_maxes Symtab.empty ([], Graph.maximals G) end
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   919
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   920
fun maximal_wrt_access_graph access_G =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   921
  map (nickname_of_thm o snd)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   922
  #> maximal_wrt_graph access_G
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   923
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   924
fun is_fact_in_graph access_G = can (Graph.get_node access_G) o nickname_of_thm
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   925
53197
6c5e7143e1f6 tuned fudge factor in light of evaluation
blanchet
parents: 53159
diff changeset
   926
val chained_feature_factor = 0.5 (* FUDGE *)
6c5e7143e1f6 tuned fudge factor in light of evaluation
blanchet
parents: 53159
diff changeset
   927
val extra_feature_factor = 0.1 (* FUDGE *)
53201
2a2dc18f3e10 reverted 6c5e7143e1f6; took a better look at evaluation data this time
blanchet
parents: 53197
diff changeset
   928
val num_extra_feature_facts = 10 (* FUDGE *)
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   929
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   930
(* FUDGE *)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   931
fun weight_of_proximity_fact rank =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   932
  Math.pow (1.3, 15.5 - 0.2 * Real.fromInt rank) + 15.0
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   933
53140
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
   934
fun weight_facts_smoothly facts =
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   935
  facts ~~ map weight_of_proximity_fact (0 upto length facts - 1)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   936
53140
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
   937
(* FUDGE *)
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
   938
fun steep_weight_of_fact rank =
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
   939
  Math.pow (0.62, log2 (Real.fromInt (rank + 1)))
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
   940
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
   941
fun weight_facts_steeply facts =
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
   942
  facts ~~ map steep_weight_of_fact (0 upto length facts - 1)
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
   943
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   944
val max_proximity_facts = 100
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   945
54060
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   946
fun find_mash_suggestions ctxt max_facts suggs facts chained raw_unknown =
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   947
  let
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   948
    val inter_fact = inter (eq_snd Thm.eq_thm_prop)
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   949
    val raw_mash = find_suggested_facts ctxt facts suggs
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   950
    val proximate = take max_proximity_facts facts
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   951
    val unknown_chained = inter_fact raw_unknown chained
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   952
    val unknown_proximate = inter_fact raw_unknown proximate
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   953
    val mess =
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   954
      [(0.9 (* FUDGE *), (map (rpair 1.0) unknown_chained, [])),
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   955
       (0.4 (* FUDGE *), (weight_facts_smoothly unknown_proximate, [])),
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   956
       (0.1 (* FUDGE *), (weight_facts_steeply raw_mash, raw_unknown))]
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   957
    val unknown =
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   958
      raw_unknown
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   959
      |> fold (subtract (eq_snd Thm.eq_thm_prop))
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   960
              [unknown_chained, unknown_proximate]
5f96d29fb7c2 removed pointless special case
blanchet
parents: 54012
diff changeset
   961
  in (mesh_facts (eq_snd Thm.eq_thm_prop) max_facts mess, unknown) end
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   962
53127
60801776d8af weight MaSh constants by frequency
blanchet
parents: 53121
diff changeset
   963
fun add_const_counts t =
53130
6741ba8d5c6d improve weight computation for complex terms
blanchet
parents: 53129
diff changeset
   964
  fold (fn s => Symtab.map_default (s, 0) (Integer.add 1))
53127
60801776d8af weight MaSh constants by frequency
blanchet
parents: 53121
diff changeset
   965
       (Term.add_const_names t [])
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   966
54503
blanchet
parents: 54432
diff changeset
   967
fun mash_suggested_facts ctxt ({debug, overlord, ...} : params) max_facts hyp_ts concl_t facts =
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   968
  let
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   969
    val thy = Proof_Context.theory_of ctxt
53559
3858246c7c8f when pouring in extra features into the goal, only consider facts from the current theory -- the bottom 10 facts of the last import might be completely unrelated
blanchet
parents: 53558
diff changeset
   970
    val thy_name = Context.theory_name thy
53141
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
   971
    val facts = facts |> sort (crude_thm_ord o pairself snd o swap)
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   972
    val chained = facts |> filter (fn ((_, (scope, _)), _) => scope = Chained)
53141
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
   973
    val num_facts = length facts
53127
60801776d8af weight MaSh constants by frequency
blanchet
parents: 53121
diff changeset
   974
    val const_tab = fold (add_const_counts o prop_of o snd) facts Symtab.empty
54085
b6b41e1d5689 optimized built-in const check
blanchet
parents: 54064
diff changeset
   975
53559
3858246c7c8f when pouring in extra features into the goal, only consider facts from the current theory -- the bottom 10 facts of the last import might be completely unrelated
blanchet
parents: 53558
diff changeset
   976
    fun fact_has_right_theory (_, th) =
3858246c7c8f when pouring in extra features into the goal, only consider facts from the current theory -- the bottom 10 facts of the last import might be completely unrelated
blanchet
parents: 53558
diff changeset
   977
      thy_name = Context.theory_name (theory_of_thm th)
56995
61855ade6c7e hide more consts to beautify documentation
blanchet
parents: 56303
diff changeset
   978
53141
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
   979
    fun chained_or_extra_features_of factor (((_, stature), th), weight) =
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
   980
      [prop_of th]
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   981
      |> features_of ctxt (theory_of_thm th) num_facts const_tab stature false
53141
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
   982
      |> map (apsnd (fn r => weight * factor * r))
54085
b6b41e1d5689 optimized built-in const check
blanchet
parents: 54064
diff changeset
   983
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   984
    val (access_G, suggs) =
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   985
      peek_state ctxt overlord (fn {access_G, ...} =>
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   986
          if Graph.is_empty access_G then
54064
183cfce3f827 more tracing
blanchet
parents: 54063
diff changeset
   987
            (trace_msg ctxt (K "Nothing has been learned yet"); (access_G, []))
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   988
          else
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   989
            let
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
   990
              val parents = maximal_wrt_access_graph access_G facts
53141
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
   991
              val goal_feats =
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
   992
                features_of ctxt thy num_facts const_tab (Local, General) true (concl_t :: hyp_ts)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   993
              val chained_feats = chained
53141
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
   994
                |> map (rpair 1.0)
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
   995
                |> map (chained_or_extra_features_of chained_feature_factor)
53159
a5805fe4e91c repaired num_extra_feature_facts + tuning
blanchet
parents: 53156
diff changeset
   996
                |> rpair [] |-> fold (union (eq_fst (op =)))
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
   997
              val extra_feats = facts
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
   998
                |> take (Int.max (0, num_extra_feature_facts - length chained))
53559
3858246c7c8f when pouring in extra features into the goal, only consider facts from the current theory -- the bottom 10 facts of the last import might be completely unrelated
blanchet
parents: 53558
diff changeset
   999
                |> filter fact_has_right_theory
53141
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
  1000
                |> weight_facts_steeply
d27e99a6a679 take chained and proximate facts into consideration when computing MaSh features
blanchet
parents: 53140
diff changeset
  1001
                |> map (chained_or_extra_features_of extra_feature_factor)
53159
a5805fe4e91c repaired num_extra_feature_facts + tuning
blanchet
parents: 53156
diff changeset
  1002
                |> rpair [] |-> fold (union (eq_fst (op =)))
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1003
              val feats =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1004
                fold (union (eq_fst (op =))) [chained_feats, extra_feats] goal_feats
53559
3858246c7c8f when pouring in extra features into the goal, only consider facts from the current theory -- the bottom 10 facts of the last import might be completely unrelated
blanchet
parents: 53558
diff changeset
  1005
                |> debug ? sort (Real.compare o swap o pairself snd)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1006
              val hints = chained
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1007
                |> filter (is_fact_in_graph access_G o snd)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1008
                |> map (nickname_of_thm o snd)
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1009
            in
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1010
              (access_G, MaSh.query ctxt overlord max_facts ([], hints, parents, feats))
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1011
            end)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1012
    val unknown = filter_out (is_fact_in_graph access_G o snd) facts
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1013
  in
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1014
    find_mash_suggestions ctxt max_facts suggs facts chained unknown
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1015
    |> pairself (map fact_of_raw_fact)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1016
  end
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1017
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1018
fun learn_wrt_access_graph ctxt (name, parents, feats, deps) (learns, graph) =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1019
  let
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1020
    fun maybe_learn_from from (accum as (parents, graph)) =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1021
      try_graph ctxt "updating graph" accum (fn () =>
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1022
        (from :: parents, Graph.add_edge_acyclic (from, name) graph))
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1023
    val graph = graph |> Graph.default_node (name, (Isar_Proof, feats, deps))
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1024
    val (parents, graph) = ([], graph) |> fold maybe_learn_from parents
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1025
    val (deps, _) = ([], graph) |> fold maybe_learn_from deps
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1026
  in ((name, parents, feats, deps) :: learns, graph) end
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1027
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1028
fun relearn_wrt_access_graph ctxt (name, deps) (relearns, graph) =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1029
  let
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1030
    fun maybe_relearn_from from (accum as (parents, graph)) =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1031
      try_graph ctxt "updating graph" accum (fn () =>
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1032
        (from :: parents, Graph.add_edge_acyclic (from, name) graph))
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1033
    val graph = graph |> Graph.map_node name (fn (_, feats, _) => (Automatic_Proof, feats, deps))
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1034
    val (deps, _) = ([], graph) |> fold maybe_relearn_from deps
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1035
  in ((name, deps) :: relearns, graph) end
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1036
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1037
fun flop_wrt_access_graph name =
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1038
  Graph.map_node name (fn (_, feats, deps) => (Isar_Proof_wegen_Prover_Flop, feats, deps))
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1039
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1040
val learn_timeout_slack = 2.0
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1041
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1042
fun launch_thread timeout task =
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1043
  let
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1044
    val hard_timeout = time_mult learn_timeout_slack timeout
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1045
    val birth_time = Time.now ()
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1046
    val death_time = Time.+ (birth_time, hard_timeout)
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1047
    val desc = ("Machine learner for Sledgehammer", "")
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1048
  in Async_Manager.thread MaShN birth_time death_time desc task end
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1049
54503
blanchet
parents: 54432
diff changeset
  1050
fun mash_learn_proof ctxt ({overlord, timeout, ...} : params) t facts used_ths =
53819
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1051
  if is_mash_enabled () then
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1052
    launch_thread timeout (fn () =>
53819
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1053
        let
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1054
          val thy = Proof_Context.theory_of ctxt
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
  1055
          val feats = features_of ctxt thy 0 Symtab.empty (Local, General) false [t] |> map fst
53819
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1056
        in
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1057
          peek_state ctxt overlord (fn {access_G, ...} =>
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1058
              let
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1059
                val parents = maximal_wrt_access_graph access_G facts
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1060
                val deps =
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1061
                  used_ths |> filter (is_fact_in_graph access_G)
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1062
                           |> map nickname_of_thm
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1063
              in
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54143
diff changeset
  1064
                MaSh.learn ctxt overlord true [("", parents, feats, deps)]
53819
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1065
              end);
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1066
          (true, "")
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1067
        end)
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1068
  else
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1069
    ()
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1070
52697
6fb98a20c349 explicit padding on command boundary for "auto" generated sendback -- do not replace the corresponding goal command, but append to it;
wenzelm
parents: 52196
diff changeset
  1071
fun sendback sub =
6fb98a20c349 explicit padding on command boundary for "auto" generated sendback -- do not replace the corresponding goal command, but append to it;
wenzelm
parents: 52196
diff changeset
  1072
  Active.sendback_markup [Markup.padding_command] (sledgehammerN ^ " " ^ sub)
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1073
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1074
val commit_timeout = seconds 30.0
48332
271a4a6af734 optimize parent computation in MaSh + remove temporary files
blanchet
parents: 48330
diff changeset
  1075
50485
3c6ac2da2f45 merge aliased theorems in MaSh dependencies, modulo symmetry of equality
blanchet
parents: 50484
diff changeset
  1076
(* The timeout is understood in a very relaxed fashion. *)
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1077
fun mash_learn_facts ctxt (params as {debug, verbose, overlord, ...}) prover save auto_level
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1078
    run_prover learn_timeout facts =
48304
50e64af9c829 more work on MaSh
blanchet
parents: 48303
diff changeset
  1079
  let
48318
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1080
    val timer = Timer.startRealTimer ()
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1081
    fun next_commit_time () = Time.+ (Timer.checkRealTimer timer, commit_timeout)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1082
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
  1083
    val {access_G, ...} = peek_state ctxt overlord I
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1084
    val is_in_access_G = is_fact_in_graph access_G o snd
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1085
    val no_new_facts = forall is_in_access_G facts
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
  1086
  in
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1087
    if no_new_facts andalso not run_prover then
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1088
      if auto_level < 2 then
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1089
        "No new " ^ (if run_prover then "automatic" else "Isar") ^ " proofs to learn." ^
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
  1090
        (if auto_level = 0 andalso not run_prover then
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1091
           "\n\nHint: Try " ^ sendback learn_proverN ^ " to learn from an automatic prover."
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1092
         else
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1093
           "")
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1094
      else
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1095
        ""
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
  1096
    else
48304
50e64af9c829 more work on MaSh
blanchet
parents: 48303
diff changeset
  1097
      let
50735
6b232d76cbc9 refined class handling, to prevent cycles in fact graph
blanchet
parents: 50732
diff changeset
  1098
        val name_tabs = build_name_tables nickname_of_thm facts
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1099
48439
67a6bcbd3587 removed MaSh junk arising from primrec definitions
blanchet
parents: 48438
diff changeset
  1100
        fun deps_of status th =
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1101
          if no_dependencies_for_status status then
48439
67a6bcbd3587 removed MaSh junk arising from primrec definitions
blanchet
parents: 48438
diff changeset
  1102
            SOME []
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
  1103
          else if run_prover then
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1104
            prover_dependencies_of ctxt params prover auto_level facts name_tabs th
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1105
            |> (fn (false, _) => NONE | (true, deps) => trim_dependencies deps)
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1106
          else
50735
6b232d76cbc9 refined class handling, to prevent cycles in fact graph
blanchet
parents: 50732
diff changeset
  1107
            isar_dependencies_of name_tabs th
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1108
            |> trim_dependencies
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1109
48669
cdcdb0547f29 remember ATP flops to avoid repeating them too quickly
blanchet
parents: 48668
diff changeset
  1110
        fun do_commit [] [] [] state = state
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1111
          | do_commit learns relearns flops {access_G, num_known_facts, dirty} =
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1112
            let
50610
d9c4fbbb0c11 name tuning
blanchet
parents: 50608
diff changeset
  1113
              val was_empty = Graph.is_empty access_G
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1114
              val (learns, access_G) = ([], access_G) |> fold (learn_wrt_access_graph ctxt) learns
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1115
              val (relearns, access_G) =
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1116
                ([], access_G) |> fold (relearn_wrt_access_graph ctxt) relearns
50610
d9c4fbbb0c11 name tuning
blanchet
parents: 50608
diff changeset
  1117
              val access_G = access_G |> fold flop_wrt_access_graph flops
53095
667717a5ad80 learn MaSh facts on the fly
blanchet
parents: 53094
diff changeset
  1118
              val num_known_facts = num_known_facts + length learns
48699
a89b83204c24 optimized saving
blanchet
parents: 48669
diff changeset
  1119
              val dirty =
55286
blanchet
parents: 55202
diff changeset
  1120
                (case (was_empty, dirty, relearns) of
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1121
                  (false, SOME names, []) => SOME (map #1 learns @ names)
55286
blanchet
parents: 55202
diff changeset
  1122
                | _ => NONE)
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1123
            in
53757
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
  1124
              MaSh.learn ctxt overlord (save andalso null relearns) (rev learns);
8d1a059ebcdb reduce the number of emitted MaSh commands (among others to facilitate debugging)
blanchet
parents: 53756
diff changeset
  1125
              MaSh.relearn ctxt overlord save relearns;
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1126
              {access_G = access_G, num_known_facts = num_known_facts, dirty = dirty}
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1127
            end
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1128
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1129
        fun commit last learns relearns flops =
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1130
          (if debug andalso auto_level = 0 then
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1131
             Output.urgent_message "Committing..."
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1132
           else
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1133
             ();
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
  1134
           map_state ctxt overlord (do_commit (rev learns) relearns flops);
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1135
           if not last andalso auto_level = 0 then
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1136
             let val num_proofs = length learns + length relearns in
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1137
               "Learned " ^ string_of_int num_proofs ^ " " ^
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
  1138
               (if run_prover then "automatic" else "Isar") ^ " proof" ^
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1139
               plural_s num_proofs ^ " in the last " ^
52031
9a9238342963 tuning -- renamed '_from_' to '_of_' in Sledgehammer
blanchet
parents: 51998
diff changeset
  1140
               string_of_time commit_timeout ^ "."
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1141
               |> Output.urgent_message
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1142
             end
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1143
           else
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1144
             ())
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1145
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1146
        fun learn_new_fact _ (accum as (_, (_, _, true))) = accum
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1147
          | learn_new_fact (parents, ((_, stature as (_, status)), th))
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1148
              (learns, (n, next_commit, _)) =
48318
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1149
            let
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
  1150
              val name = nickname_of_thm th
48332
271a4a6af734 optimize parent computation in MaSh + remove temporary files
blanchet
parents: 48330
diff changeset
  1151
              val feats =
54695
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
  1152
                features_of ctxt (theory_of_thm th) 0 Symtab.empty stature false [prop_of th]
a9efdf970720 generate problems with type classes
blanchet
parents: 54693
diff changeset
  1153
                |> map fst
48439
67a6bcbd3587 removed MaSh junk arising from primrec definitions
blanchet
parents: 48438
diff changeset
  1154
              val deps = deps_of status th |> these
48394
82fc8c956cdc fixed various issues with MaSh's file handling + tune output + generate local facts again + handle nameless facts gracefully
blanchet
parents: 48392
diff changeset
  1155
              val n = n |> not (null deps) ? Integer.add 1
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1156
              val learns = (name, parents, feats, deps) :: learns
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1157
              val (learns, next_commit) =
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1158
                if Time.> (Timer.checkRealTimer timer, next_commit) then
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1159
                  (commit false learns [] []; ([], next_commit_time ()))
48392
ca998fa08cd9 added "learn_from_atp" command to MaSh, for patient users
blanchet
parents: 48390
diff changeset
  1160
                else
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1161
                  (learns, next_commit)
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1162
              val timed_out = Time.> (Timer.checkRealTimer timer, learn_timeout)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1163
            in
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1164
              (learns, (n, next_commit, timed_out))
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1165
            end
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1166
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1167
        val n =
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1168
          if no_new_facts then
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1169
            0
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1170
          else
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1171
            let
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1172
              val new_facts = facts
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1173
                |> sort (crude_thm_ord o pairself snd)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1174
                |> attach_parents_to_facts []
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1175
                |> filter_out (is_in_access_G o snd)
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1176
              val (learns, (n, _, _)) =
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1177
                ([], (0, next_commit_time (), false))
51182
962190eab40d provide two modes for MaSh driver: linearized or real visibility
blanchet
parents: 51181
diff changeset
  1178
                |> fold learn_new_fact new_facts
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1179
            in
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1180
              commit true learns [] []; n
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1181
            end
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1182
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1183
        fun relearn_old_fact _ (accum as (_, (_, _, true))) = accum
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1184
          | relearn_old_fact ((_, (_, status)), th) ((relearns, flops), (n, next_commit, _)) =
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1185
            let
50624
4d0997abce79 improved thm order hack, in case the default names are overridden
blanchet
parents: 50623
diff changeset
  1186
              val name = nickname_of_thm th
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1187
              val (n, relearns, flops) =
55286
blanchet
parents: 55202
diff changeset
  1188
                (case deps_of status th of
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1189
                  SOME deps => (n + 1, (name, deps) :: relearns, flops)
55286
blanchet
parents: 55202
diff changeset
  1190
                | NONE => (n, relearns, name :: flops))
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1191
              val (relearns, flops, next_commit) =
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1192
                if Time.> (Timer.checkRealTimer timer, next_commit) then
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1193
                  (commit false [] relearns flops; ([], [], next_commit_time ()))
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1194
                else
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1195
                  (relearns, flops, next_commit)
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1196
              val timed_out = Time.> (Timer.checkRealTimer timer, learn_timeout)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1197
            in
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1198
              ((relearns, flops), (n, next_commit, timed_out))
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1199
            end
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1200
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1201
        val n =
51177
e8c9755fd14e tuned code: factored out parent computation
blanchet
parents: 51176
diff changeset
  1202
          if not run_prover then
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1203
            n
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1204
          else
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1205
            let
48668
5d63c23b4042 remember which MaSh proofs were found using ATPs
blanchet
parents: 48667
diff changeset
  1206
              val max_isar = 1000 * max_dependencies
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1207
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1208
              val kind_of_proof =
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1209
                nickname_of_thm #> try (#1 o Graph.get_node access_G) #> the_default Isar_Proof
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1210
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1211
              fun priority_of th =
48668
5d63c23b4042 remember which MaSh proofs were found using ATPs
blanchet
parents: 48667
diff changeset
  1212
                random_range 0 max_isar
48669
cdcdb0547f29 remember ATP flops to avoid repeating them too quickly
blanchet
parents: 48668
diff changeset
  1213
                + (case kind_of_proof th of
cdcdb0547f29 remember ATP flops to avoid repeating them too quickly
blanchet
parents: 48668
diff changeset
  1214
                     Isar_Proof => 0
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
  1215
                   | Automatic_Proof => 2 * max_isar
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
  1216
                   | Isar_Proof_wegen_Prover_Flop => max_isar)
54131
18b23d787062 choose facts to reprove more randomly, to avoid getting stuck with impossible problems at first
blanchet
parents: 54125
diff changeset
  1217
                - 100 * length (isar_dependencies_of name_tabs th)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1218
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1219
              val old_facts = facts
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1220
                |> filter is_in_access_G
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1221
                |> map (`(priority_of o snd))
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1222
                |> sort (int_ord o pairself fst)
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1223
                |> map snd
50631
b69079c14665 tuned ML function names
blanchet
parents: 50624
diff changeset
  1224
              val ((relearns, flops), (n, _, _)) =
48669
cdcdb0547f29 remember ATP flops to avoid repeating them too quickly
blanchet
parents: 48668
diff changeset
  1225
                (([], []), (n, next_commit_time (), false))
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1226
                |> fold relearn_old_fact old_facts
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1227
            in
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1228
              commit true [] relearns flops; n
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1229
            end
48318
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1230
      in
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1231
        if verbose orelse auto_level < 2 then
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1232
          "Learned " ^ string_of_int n ^ " nontrivial " ^
54140
564b8adb0952 clarified message
blanchet
parents: 54131
diff changeset
  1233
          (if run_prover then "automatic and " else "") ^ "Isar proof" ^ plural_s n ^
52031
9a9238342963 tuning -- renamed '_from_' to '_of_' in Sledgehammer
blanchet
parents: 51998
diff changeset
  1234
          (if verbose then " in " ^ string_of_time (Timer.checkRealTimer timer)
9a9238342963 tuning -- renamed '_from_' to '_of_' in Sledgehammer
blanchet
parents: 51998
diff changeset
  1235
           else "") ^ "."
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
  1236
        else
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
  1237
          ""
48318
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1238
      end
48308
89674e5a4d35 make tracing an option
blanchet
parents: 48306
diff changeset
  1239
  end
48304
50e64af9c829 more work on MaSh
blanchet
parents: 48303
diff changeset
  1240
54123
271a8377656f remove overloading of "max_facts" -- it already controls the number of facts passed to ATPs for 'learn_prover'
blanchet
parents: 54115
diff changeset
  1241
fun mash_learn ctxt (params as {provers, timeout, ...}) fact_override chained run_prover =
48316
252f45c04042 drastic overhaul of MaSh data structures + fixed a few performance issues
blanchet
parents: 48315
diff changeset
  1242
  let
48396
dd82d190c2af name tuning
blanchet
parents: 48395
diff changeset
  1243
    val css = Sledgehammer_Fact.clasimpset_rule_table_of ctxt
48395
85a7fb65507a learning should honor the fact override and the chained facts
blanchet
parents: 48394
diff changeset
  1244
    val ctxt = ctxt |> Config.put instantiate_inducts false
85a7fb65507a learning should honor the fact override and the chained facts
blanchet
parents: 48394
diff changeset
  1245
    val facts =
48396
dd82d190c2af name tuning
blanchet
parents: 48395
diff changeset
  1246
      nearly_all_facts ctxt false fact_override Symtab.empty css chained []
dd82d190c2af name tuning
blanchet
parents: 48395
diff changeset
  1247
                       @{prop True}
54115
2b7e063c7abc improved duplicate detection in "build_name_tables" by ensuring that the earliest occurrence of a duplicate (if it exists) gets picked as the canonical instance
blanchet
parents: 54100
diff changeset
  1248
      |> sort (crude_thm_ord o pairself snd o swap)
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1249
    val num_facts = length facts
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1250
    val prover = hd provers
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
  1251
    fun learn auto_level run_prover =
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1252
      mash_learn_facts ctxt params prover true auto_level run_prover one_year facts
48404
0a261b4aa093 relearn ATP proofs
blanchet
parents: 48403
diff changeset
  1253
      |> Output.urgent_message
48316
252f45c04042 drastic overhaul of MaSh data structures + fixed a few performance issues
blanchet
parents: 48315
diff changeset
  1254
  in
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
  1255
    if run_prover then
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1256
      ("MaShing through " ^ string_of_int num_facts ^ " fact" ^ plural_s num_facts ^
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1257
       " for automatic proofs (" ^ quote prover ^ " timeout: " ^ string_of_time timeout ^
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1258
       ").\n\nCollecting Isar proofs first..."
50340
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1259
       |> Output.urgent_message;
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1260
       learn 1 false;
50484
8ec31bdb9d36 adopt the neutral "prover" terminology for MaSh rather than the ambiguous/wrong ATP terminology (which sometimes excludes SMT solvers)
blanchet
parents: 50450
diff changeset
  1261
       "Now collecting automatic proofs. This may take several hours. You can \
50340
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1262
       \safely stop the learning process at any point."
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1263
       |> Output.urgent_message;
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1264
       learn 0 true)
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1265
    else
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1266
      ("MaShing through " ^ string_of_int num_facts ^ " fact" ^
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1267
       plural_s num_facts ^ " for Isar proofs..."
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1268
       |> Output.urgent_message;
72519bf5f135 simplify MaSh term patterns + add missing global facts if there aren't too many
blanchet
parents: 50339
diff changeset
  1269
       learn 0 false)
48316
252f45c04042 drastic overhaul of MaSh data structures + fixed a few performance issues
blanchet
parents: 48315
diff changeset
  1270
  end
48249
2bd242c56c90 dummy implementation
blanchet
parents: 48248
diff changeset
  1271
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
  1272
fun mash_can_suggest_facts ctxt overlord =
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
  1273
  not (Graph.is_empty (#access_G (peek_state ctxt overlord I)))
50311
c9d7ccd090e1 tuned order of functions
blanchet
parents: 50310
diff changeset
  1274
50383
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
  1275
(* Generate more suggestions than requested, because some might be thrown out
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
  1276
   later for various reasons. *)
50965
7a7d1418301e use correct weights in MeSh driver
blanchet
parents: 50952
diff changeset
  1277
fun generous_max_facts max_facts = max_facts + Int.min (50, max_facts)
50383
4274b25ff4e7 take proximity into account for MaSh + fix a debilitating bug in feature generation
blanchet
parents: 50382
diff changeset
  1278
50814
4247cbd78aaf export MeSh data as well
blanchet
parents: 50755
diff changeset
  1279
val mepo_weight = 0.5
4247cbd78aaf export MeSh data as well
blanchet
parents: 50755
diff changeset
  1280
val mash_weight = 0.5
4247cbd78aaf export MeSh data as well
blanchet
parents: 50755
diff changeset
  1281
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1282
val max_facts_to_learn_before_query = 100
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1283
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1284
(* The threshold should be large enough so that MaSh does not get activated for Auto Sledgehammer
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1285
   and Try. *)
48318
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1286
val min_secs_for_learning = 15
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1287
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1288
fun relevant_facts ctxt (params as {overlord, blocking, learn, fact_filter, timeout, ...}) prover
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1289
    max_facts ({add, only, ...} : fact_override) hyp_ts concl_t facts =
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
  1290
  if not (subset (op =) (the_list fact_filter, fact_filters)) then
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
  1291
    error ("Unknown fact filter: " ^ quote (the fact_filter) ^ ".")
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
  1292
  else if only then
51004
5f2788c38127 distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents: 51003
diff changeset
  1293
    let val facts = facts |> map fact_of_raw_fact in
51010
afd0213a3dab tuned data structure
blanchet
parents: 51008
diff changeset
  1294
      [("", facts)]
51004
5f2788c38127 distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents: 51003
diff changeset
  1295
    end
48321
c552d7f1720b learn from minimized ATP proofs
blanchet
parents: 48320
diff changeset
  1296
  else if max_facts <= 0 orelse null facts then
51010
afd0213a3dab tuned data structure
blanchet
parents: 51008
diff changeset
  1297
    [("", [])]
48288
255c6e1fd505 rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents: 48251
diff changeset
  1298
  else
255c6e1fd505 rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents: 48251
diff changeset
  1299
    let
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1300
      fun maybe_launch_thread () =
54816
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1301
        if not blocking andalso not (Async_Manager.has_running_threads MaShN) andalso
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1302
           Time.toSeconds timeout >= min_secs_for_learning then
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1303
          let val timeout = time_mult learn_timeout_slack timeout in
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1304
            launch_thread timeout
10d48c2a3e32 made timeouts in Sledgehammer not be 'option's -- simplified lots of code
blanchet
parents: 54799
diff changeset
  1305
              (fn () => (true, mash_learn_facts ctxt params prover true 2 false timeout facts))
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
  1306
          end
48318
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1307
        else
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1308
          ()
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1309
      fun maybe_learn () =
53819
e55d641d0a70 honor MaSh's zero-overhead policy -- no learning if the tool is disabled
blanchet
parents: 53790
diff changeset
  1310
        if is_mash_enabled () andalso learn then
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1311
          let
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1312
            val {access_G, num_known_facts, ...} = peek_state ctxt overlord I
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1313
            val is_in_access_G = is_fact_in_graph access_G o snd
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1314
          in
54012
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1315
            if length facts - num_known_facts
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1316
               <= max_facts_to_learn_before_query then
55286
blanchet
parents: 55202
diff changeset
  1317
              (case length (filter_out is_in_access_G facts) of
54012
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1318
                0 => false
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1319
              | num_facts_to_learn =>
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1320
                if num_facts_to_learn <= max_facts_to_learn_before_query then
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1321
                  (mash_learn_facts ctxt params prover false 2 false timeout facts
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1322
                   |> (fn "" => () | s => Output.urgent_message (MaShN ^ ": " ^ s));
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1323
                   true)
7a8263843acb removed spurious save if nothing needs to bee learned
blanchet
parents: 53819
diff changeset
  1324
                else
55286
blanchet
parents: 55202
diff changeset
  1325
                  (maybe_launch_thread (); false))
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1326
            else
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1327
              (maybe_launch_thread (); false)
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1328
          end
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1329
        else
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1330
          false
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1331
      val (save, effective_fact_filter) =
55286
blanchet
parents: 55202
diff changeset
  1332
        (case fact_filter of
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1333
          SOME ff => (ff <> mepoN andalso maybe_learn (), ff)
48318
325c8fd0d762 more consolidation of MaSh code
blanchet
parents: 48316
diff changeset
  1334
        | NONE =>
51024
98fb341d32e3 distinguish MeSh and smart -- with smart, allow combinations of MaSh, MeSh, and MePo in different slices -- and use MaSh also with SMT solvers, based on evaluation
blanchet
parents: 51020
diff changeset
  1335
          if is_mash_enabled () then
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1336
            (maybe_learn (),
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
  1337
             if mash_can_suggest_facts ctxt overlord then meshN else mepoN)
48407
47fe0ca12fc2 faster maximal node computation
blanchet
parents: 48406
diff changeset
  1338
          else
55286
blanchet
parents: 55202
diff changeset
  1339
            (false, mepoN))
54143
18def1c73c79 make sure add: doesn't add duplicates, and works for [no_atp] facts
blanchet
parents: 54141
diff changeset
  1340
18def1c73c79 make sure add: doesn't add duplicates, and works for [no_atp] facts
blanchet
parents: 54141
diff changeset
  1341
      val unique_facts = drop_duplicate_facts facts
48288
255c6e1fd505 rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents: 48251
diff changeset
  1342
      val add_ths = Attrib.eval_thms ctxt add
54143
18def1c73c79 make sure add: doesn't add duplicates, and works for [no_atp] facts
blanchet
parents: 54141
diff changeset
  1343
51004
5f2788c38127 distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents: 51003
diff changeset
  1344
      fun in_add (_, th) = member Thm.eq_thm_prop add_ths th
51003
198cb05fb35b report (MeSh, MePo, MaSh) triple, to be able to use different filters in different slices
blanchet
parents: 51001
diff changeset
  1345
      fun add_and_take accepts =
198cb05fb35b report (MeSh, MePo, MaSh) triple, to be able to use different filters in different slices
blanchet
parents: 51001
diff changeset
  1346
        (case add_ths of
198cb05fb35b report (MeSh, MePo, MaSh) triple, to be able to use different filters in different slices
blanchet
parents: 51001
diff changeset
  1347
           [] => accepts
54143
18def1c73c79 make sure add: doesn't add duplicates, and works for [no_atp] facts
blanchet
parents: 54141
diff changeset
  1348
         | _ => (unique_facts |> filter in_add |> map fact_of_raw_fact) @
51004
5f2788c38127 distinguish raw and non-raw facts, using raw for 10 000s of facts and non-raw after selection of some hundreds
blanchet
parents: 51003
diff changeset
  1349
                (accepts |> filter_out in_add))
48293
914ca0827804 renamed Sledgehammer options
blanchet
parents: 48292
diff changeset
  1350
        |> take max_facts
48406
b002cc16aa99 honor suggested MaSh weights
blanchet
parents: 48404
diff changeset
  1351
      fun mepo () =
54143
18def1c73c79 make sure add: doesn't add duplicates, and works for [no_atp] facts
blanchet
parents: 54141
diff changeset
  1352
        (mepo_suggested_facts ctxt params max_facts NONE hyp_ts concl_t unique_facts
54091
4df62d7eae34 parallelize MeSh
blanchet
parents: 54089
diff changeset
  1353
         |> weight_facts_steeply, [])
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
  1354
      fun mash () =
54503
blanchet
parents: 54432
diff changeset
  1355
        mash_suggested_facts ctxt params (generous_max_facts max_facts) hyp_ts concl_t facts
53140
a1235e90da5f pour extra features from proximate facts into goal, in exporter
blanchet
parents: 53137
diff changeset
  1356
        |>> weight_facts_steeply
48314
ee33ba3c0e05 added option to control which fact filter is used
blanchet
parents: 48313
diff changeset
  1357
      val mess =
51003
198cb05fb35b report (MeSh, MePo, MaSh) triple, to be able to use different filters in different slices
blanchet
parents: 51001
diff changeset
  1358
        (* the order is important for the "case" expression below *)
54091
4df62d7eae34 parallelize MeSh
blanchet
parents: 54089
diff changeset
  1359
        [] |> effective_fact_filter <> mepoN ? cons (mash_weight, mash)
4df62d7eae34 parallelize MeSh
blanchet
parents: 54089
diff changeset
  1360
           |> effective_fact_filter <> mashN ? cons (mepo_weight, mepo)
4df62d7eae34 parallelize MeSh
blanchet
parents: 54089
diff changeset
  1361
           |> Par_List.map (apsnd (fn f => f ()))
4df62d7eae34 parallelize MeSh
blanchet
parents: 54089
diff changeset
  1362
      val mesh = mesh_facts (eq_snd Thm.eq_thm_prop) max_facts mess |> add_and_take
48288
255c6e1fd505 rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents: 48251
diff changeset
  1363
    in
53152
cbd3c7c48d2c learn new facts on query if there aren't too many of them in MaSh
blanchet
parents: 53150
diff changeset
  1364
      if save then MaSh.save ctxt overlord else ();
55286
blanchet
parents: 55202
diff changeset
  1365
      (case (fact_filter, mess) of
51024
98fb341d32e3 distinguish MeSh and smart -- with smart, allow combinations of MaSh, MeSh, and MePo in different slices -- and use MaSh also with SMT solvers, based on evaluation
blanchet
parents: 51020
diff changeset
  1366
        (NONE, [(_, (mepo, _)), (_, (mash, _))]) =>
51010
afd0213a3dab tuned data structure
blanchet
parents: 51008
diff changeset
  1367
        [(meshN, mesh), (mepoN, mepo |> map fst |> add_and_take),
afd0213a3dab tuned data structure
blanchet
parents: 51008
diff changeset
  1368
         (mashN, mash |> map fst |> add_and_take)]
55286
blanchet
parents: 55202
diff changeset
  1369
      | _ => [(effective_fact_filter, mesh)])
48288
255c6e1fd505 rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents: 48251
diff changeset
  1370
    end
255c6e1fd505 rationalize relevance filter, slowing moving code from Iter to MaSh
blanchet
parents: 48251
diff changeset
  1371
53148
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
  1372
fun kill_learners ctxt ({overlord, ...} : params) =
c898409d8630 fixed subtle bug with "take" + thread overlord through
blanchet
parents: 53142
diff changeset
  1373
  (Async_Manager.kill_threads MaShN "learner"; MaSh.shutdown ctxt overlord)
57005
33f3d2ea803d store all MaSh data on the Isabelle side, in preparation for replacing 'mash.py' with ML solution
blanchet
parents: 56995
diff changeset
  1374
48319
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
  1375
fun running_learners () = Async_Manager.running_threads MaShN "learner"
340187063d84 use async manager to manage MaSh learners to make sure they get killed cleanly
blanchet
parents: 48318
diff changeset
  1376
48248
b6eb45a52c28 split relevance filter code into three files
blanchet
parents:
diff changeset
  1377
end;