src/HOL/Tools/ATP/atp_proof_redirect.ML
author blanchet
Wed, 30 Jul 2014 00:50:41 +0200
changeset 57699 a6cf197c1f1e
parent 54799 565f9af86d67
child 58480 9953ab32d9c2
permissions -rw-r--r--
also try 'metis' with 'full_types'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46320
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 45882
diff changeset
     1
(*  Title:      HOL/Tools/ATP/atp_proof_redirect.ML
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
     3
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
     4
Transformation of a proof by contradiction into a direct proof.
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
     5
*)
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
     6
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
     7
signature ATP_ATOM =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
     8
sig
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
     9
  type key
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    10
  val ord : key * key -> order
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    11
  val string_of : key -> string
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    12
end;
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    13
46320
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 45882
diff changeset
    14
signature ATP_PROOF_REDIRECT =
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    15
sig
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    16
  type atom
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    17
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    18
  structure Atom_Graph : GRAPH
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    19
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
    20
  type refute_sequent = atom list * atom
51145
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    21
  type refute_graph = unit Atom_Graph.T
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    22
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    23
  type clause = atom list
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
    24
  type direct_sequent = atom * (atom list * clause)
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    25
  type direct_graph = unit Atom_Graph.T
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    26
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
    27
  type rich_sequent = atom * (clause list * clause)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    28
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    29
  datatype direct_inference =
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    30
    Have of rich_sequent |
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    31
    Cases of (clause * direct_inference list) list
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    32
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    33
  type direct_proof = direct_inference list
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    34
51208
44f0bfe67b01 remove needless steps from refutation graph -- these confuse the proof redirection algorithm (and are needless)
blanchet
parents: 51207
diff changeset
    35
  val make_refute_graph : atom -> (atom list * atom) list -> refute_graph
51145
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    36
  val axioms_of_refute_graph : refute_graph -> atom list -> atom list
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    37
  val tainted_atoms_of_refute_graph : refute_graph -> atom list -> atom list
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
    38
  val sequents_of_refute_graph : refute_graph -> refute_sequent list
51145
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    39
  val string_of_refute_graph : refute_graph -> string
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
    40
  val redirect_sequent : atom list -> atom -> refute_sequent -> direct_sequent
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    41
  val direct_graph : direct_sequent list -> direct_graph
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
    42
  val redirect_graph : atom list -> atom list -> atom -> refute_graph -> direct_proof
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    43
  val succedent_of_cases : (clause * direct_inference list) list -> clause
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    44
  val string_of_direct_proof : direct_proof -> string
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    45
end;
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    46
46320
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 45882
diff changeset
    47
functor ATP_Proof_Redirect(Atom : ATP_ATOM): ATP_PROOF_REDIRECT =
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    48
struct
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    49
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    50
type atom = Atom.key
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    51
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    52
structure Atom_Graph = Graph(Atom)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    53
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
    54
type refute_sequent = atom list * atom
51145
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    55
type refute_graph = unit Atom_Graph.T
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    56
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    57
type clause = atom list
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
    58
type direct_sequent = atom * (atom list * clause)
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    59
type direct_graph = unit Atom_Graph.T
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    60
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
    61
type rich_sequent = atom * (clause list * clause)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    62
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    63
datatype direct_inference =
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    64
  Have of rich_sequent |
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    65
  Cases of (clause * direct_inference list) list
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    66
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    67
type direct_proof = direct_inference list
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    68
51213
blanchet
parents: 51208
diff changeset
    69
val atom_eq = is_equal o Atom.ord
blanchet
parents: 51208
diff changeset
    70
val clause_ord = dict_ord Atom.ord
54762
c3ef7b572213 made SML/NJ happy
blanchet
parents: 54760
diff changeset
    71
fun direct_sequent_ord seqp = prod_ord clause_ord clause_ord (pairself snd seqp)
c3ef7b572213 made SML/NJ happy
blanchet
parents: 54760
diff changeset
    72
fun direct_sequent_eq seqp = is_equal (direct_sequent_ord seqp)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    73
51208
44f0bfe67b01 remove needless steps from refutation graph -- these confuse the proof redirection algorithm (and are needless)
blanchet
parents: 51207
diff changeset
    74
fun make_refute_graph bot infers =
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    75
  let
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    76
    fun add_edge to from =
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    77
      Atom_Graph.default_node (from, ())
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    78
      #> Atom_Graph.add_edge_acyclic (from, to)
54754
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54735
diff changeset
    79
    fun add_infer (froms, to) =
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54735
diff changeset
    80
      Atom_Graph.default_node (to, ())
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54735
diff changeset
    81
      #> fold (add_edge to) froms
54735
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
    82
51208
44f0bfe67b01 remove needless steps from refutation graph -- these confuse the proof redirection algorithm (and are needless)
blanchet
parents: 51207
diff changeset
    83
    val graph = fold add_infer infers Atom_Graph.empty
44f0bfe67b01 remove needless steps from refutation graph -- these confuse the proof redirection algorithm (and are needless)
blanchet
parents: 51207
diff changeset
    84
    val reachable = Atom_Graph.all_preds graph [bot]
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
    85
  in
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
    86
    graph |> Atom_Graph.restrict (member (is_equal o Atom.ord) reachable)
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
    87
  end
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    88
51145
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    89
fun axioms_of_refute_graph refute_graph conjs =
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    90
  subtract atom_eq conjs (Atom_Graph.minimals refute_graph)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    91
54735
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
    92
fun tainted_atoms_of_refute_graph refute_graph = Atom_Graph.all_succs refute_graph
51145
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    93
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
    94
fun sequents_of_refute_graph refute_graph =
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
    95
  Atom_Graph.keys refute_graph
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
    96
  |> filter_out (Atom_Graph.is_minimal refute_graph)
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
    97
  |> map (`(Atom_Graph.immediate_preds refute_graph))
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    98
47915
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
    99
val string_of_context = map Atom.string_of #> space_implode ", "
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
   100
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
   101
fun string_of_sequent (gamma, c) =
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
   102
  string_of_context gamma ^ " \<turnstile> " ^ Atom.string_of c
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
   103
54735
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   104
fun string_of_refute_graph refute_graph =
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   105
  refute_graph |> sequents_of_refute_graph |> map string_of_sequent |> cat_lines
47915
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
   106
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   107
fun redirect_sequent tainted bot (gamma, c) =
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   108
  (c,
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   109
   if member atom_eq tainted c then
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   110
     gamma |> List.partition (not o member atom_eq tainted)
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   111
           |>> not (atom_eq (c, bot)) ? cons c
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   112
   else
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   113
     (gamma, [c]))
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   114
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   115
fun direct_graph seqs =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   116
  let
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   117
    fun add_edge from to =
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   118
      Atom_Graph.default_node (from, ())
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   119
      #> Atom_Graph.default_node (to, ())
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   120
      #> Atom_Graph.add_edge_acyclic (from, to)
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   121
    fun add_seq (_, (gamma, c)) = fold (fn l => fold (add_edge l) c) gamma
54735
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   122
  in
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   123
    fold add_seq seqs Atom_Graph.empty
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   124
  end
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   125
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   126
fun disj cs = fold (union atom_eq) cs [] |> sort Atom.ord
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   127
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   128
fun succedent_of_inference (Have (_, (_, c))) = c
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   129
  | succedent_of_inference (Cases cases) = succedent_of_cases cases
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   130
and succedent_of_case (c, []) = c
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   131
  | succedent_of_case (_, infs) = succedent_of_inference (List.last infs)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   132
and succedent_of_cases cases = disj (map succedent_of_case cases)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   133
54760
a1ac3eaa0d11 generate proper succedent for cases with trivial branches
blanchet
parents: 54755
diff changeset
   134
fun s_cases cases = [Cases cases]
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   135
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
   136
fun descendants direct_graph = these o try (Atom_Graph.all_succs direct_graph) o single
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   137
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   138
fun zones_of 0 _ = []
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
   139
  | zones_of n (bs :: bss) = (fold (subtract atom_eq) bss) bs :: zones_of (n - 1) (bss @ [bs])
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   140
51145
280ece22765b tuned code
blanchet
parents: 51031
diff changeset
   141
fun redirect_graph axioms tainted bot refute_graph =
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   142
  let
54735
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   143
    val seqs = map (redirect_sequent tainted bot) (sequents_of_refute_graph refute_graph)
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   144
    val direct_graph = direct_graph seqs
54735
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   145
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   146
    fun redirect c proved seqs =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   147
      if null seqs then
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   148
        []
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   149
      else if length c < 2 then
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   150
        let
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   151
          val proved = c @ proved
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   152
          val provable = filter (fn (_, (gamma, _)) => subset atom_eq (gamma, proved)) seqs
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   153
          val horn_provable = filter (fn (_, (_, [_])) => true | _ => false) provable
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   154
          val seq as (id, (gamma, c)) =
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
   155
            (case horn_provable @ provable of
51207
914436eb988b more precise error
blanchet
parents: 51145
diff changeset
   156
              [] => raise Fail "ill-formed refutation graph"
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
   157
            | next :: _ => next)
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   158
        in
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   159
          Have (id, (map single gamma, c)) ::
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   160
          redirect c proved (filter (curry (not o direct_sequent_eq) seq) seqs)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   161
        end
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   162
      else
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   163
        let
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   164
          fun subsequents seqs zone =
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   165
            filter (fn (_, (gamma, _)) => subset atom_eq (gamma, zone @ proved)) seqs
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   166
          val zones = zones_of (length c) (map (descendants direct_graph) c)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   167
          val subseqss = map (subsequents seqs) zones
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   168
          val seqs = fold (subtract direct_sequent_eq) subseqss seqs
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
   169
          val cases = map2 (fn l => fn subseqs => ([l], redirect [l] proved subseqs)) c subseqss
57699
a6cf197c1f1e also try 'metis' with 'full_types'
blanchet
parents: 54799
diff changeset
   170
          val cases' = filter_out (null o snd) cases
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
   171
        in
57699
a6cf197c1f1e also try 'metis' with 'full_types'
blanchet
parents: 54799
diff changeset
   172
          s_cases cases' @ redirect (succedent_of_cases cases) proved seqs
54714
ae01c51eadff removed inlined rewriting'' for one-branch case splits in Isar proofs, since these can yield huge unreadable formulas
blanchet
parents: 51243
diff changeset
   173
        end
54735
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   174
  in
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   175
    redirect [] axioms seqs
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   176
  end
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   177
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   178
fun indent 0 = ""
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   179
  | indent n = "  " ^ indent (n - 1)
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   180
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   181
fun string_of_clause [] = "\<bottom>"
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   182
  | string_of_clause ls = space_implode " \<or> " (map Atom.string_of ls)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   183
54755
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   184
fun string_of_rich_sequent ch (id, (cs, c)) =
2eb43ddde491 use 'arith' when appropriate in Z3 proofs
blanchet
parents: 54754
diff changeset
   185
  (if null cs then "" else commas (map string_of_clause cs) ^ " ") ^ ch ^ " " ^ string_of_clause c ^
54760
a1ac3eaa0d11 generate proper succedent for cases with trivial branches
blanchet
parents: 54755
diff changeset
   186
  " (* " ^ Atom.string_of id ^ " *)"
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   187
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   188
fun string_of_case depth (c, proof) =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   189
  indent (depth + 1) ^ "[" ^ string_of_clause c ^ "]"
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   190
  |> not (null proof) ? suffix ("\n" ^ string_of_subproof (depth + 1) proof)
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   191
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   192
and string_of_inference depth (Have seq) =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   193
    indent depth ^ string_of_rich_sequent "\<triangleright>" seq
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   194
  | string_of_inference depth (Cases cases) =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   195
    indent depth ^ "[\n" ^
54735
05c9f3d84ba3 made SML/NJ happy + whitespace tuning
blanchet
parents: 54714
diff changeset
   196
    space_implode ("\n" ^ indent depth ^ "|\n") (map (string_of_case depth) cases) ^ "\n" ^
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   197
    indent depth ^ "]"
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   198
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   199
and string_of_subproof depth = cat_lines o map (string_of_inference depth)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   200
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   201
val string_of_direct_proof = string_of_subproof 0
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   202
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   203
end;