src/HOL/Tools/ATP/atp_proof_redirect.ML
author blanchet
Mon, 14 May 2012 15:54:26 +0200
changeset 47915 5b1a737777c9
parent 46320 0b8b73b49848
child 47919 1be466c58a26
permissions -rw-r--r--
added debugging function
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
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    20
  type ref_sequent = atom list * atom
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    21
  type ref_graph = unit Atom_Graph.T
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
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    24
  type direct_sequent = atom list * clause
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
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    27
  type rich_sequent = clause list * clause
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 |
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    31
    Hence of rich_sequent |
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    32
    Cases of (clause * direct_inference list) list
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    33
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    34
  type direct_proof = direct_inference list
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    35
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    36
  val make_ref_graph : (atom list * atom) list -> ref_graph
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    37
  val axioms_of_ref_graph : ref_graph -> atom list -> atom list
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    38
  val tainted_atoms_of_ref_graph : ref_graph -> atom list -> atom list
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    39
  val sequents_of_ref_graph : ref_graph -> ref_sequent list
47915
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
    40
  val string_of_ref_graph : ref_graph -> string
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    41
  val redirect_sequent : atom list -> atom -> ref_sequent -> direct_sequent
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    42
  val direct_graph : direct_sequent list -> direct_graph
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    43
  val redirect_graph : atom list -> atom list -> ref_graph -> direct_proof
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    44
  val succedent_of_cases : (clause * direct_inference list) list -> clause
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    45
  val chain_direct_proof : direct_proof -> direct_proof
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    46
  val string_of_direct_proof : direct_proof -> string
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    47
end;
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    48
46320
0b8b73b49848 renamed two files to make room for a new file
blanchet
parents: 45882
diff changeset
    49
functor ATP_Proof_Redirect(Atom : ATP_ATOM): ATP_PROOF_REDIRECT =
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    50
struct
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    51
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    52
type atom = Atom.key
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    53
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    54
structure Atom_Graph = Graph(Atom)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    55
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    56
type ref_sequent = atom list * atom
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    57
type ref_graph = unit Atom_Graph.T
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    58
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    59
type clause = atom list
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    60
type direct_sequent = atom list * clause
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    61
type direct_graph = unit Atom_Graph.T
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    62
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    63
type rich_sequent = clause list * clause
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    64
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    65
datatype direct_inference =
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    66
  Have of rich_sequent |
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    67
  Hence of rich_sequent |
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    68
  Cases of (clause * direct_inference list) list
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    69
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    70
type direct_proof = direct_inference list
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    71
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    72
fun atom_eq p = (Atom.ord p = EQUAL)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    73
fun clause_eq (c, d) = (length c = length d andalso forall atom_eq (c ~~ d))
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    74
fun direct_sequent_eq ((gamma, c), (delta, d)) =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    75
  clause_eq (gamma, delta) andalso clause_eq (c, d)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    76
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    77
fun make_ref_graph infers =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    78
  let
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    79
    fun add_edge to from =
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    80
      Atom_Graph.default_node (from, ())
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    81
      #> Atom_Graph.default_node (to, ())
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    82
      #> Atom_Graph.add_edge_acyclic (from, to)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    83
    fun add_infer (froms, to) = fold (add_edge to) froms
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    84
  in Atom_Graph.empty |> fold add_infer infers end
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    85
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    86
fun axioms_of_ref_graph ref_graph conjs =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    87
  subtract atom_eq conjs (Atom_Graph.minimals ref_graph)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    88
fun tainted_atoms_of_ref_graph ref_graph = Atom_Graph.all_succs ref_graph
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    89
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    90
fun sequents_of_ref_graph ref_graph =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    91
  map (`(Atom_Graph.immediate_preds ref_graph))
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
    92
      (filter_out (Atom_Graph.is_minimal ref_graph) (Atom_Graph.keys ref_graph))
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
    93
47915
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
    94
val string_of_context = map Atom.string_of #> space_implode ", "
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
    95
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
    96
fun string_of_sequent (gamma, c) =
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
    97
  string_of_context gamma ^ " \<turnstile> " ^ Atom.string_of c
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
    98
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
    99
val string_of_ref_graph =
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
   100
  sequents_of_ref_graph #> map string_of_sequent #> implode
5b1a737777c9 added debugging function
blanchet
parents: 46320
diff changeset
   101
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   102
fun redirect_sequent tainted bot (gamma, c) =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   103
  if member atom_eq tainted c then
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   104
    gamma |> List.partition (not o member atom_eq tainted)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   105
          |>> not (atom_eq (c, bot)) ? cons c
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   106
  else
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   107
    (gamma, [c])
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   108
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   109
fun direct_graph seqs =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   110
  let
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   111
    fun add_edge from to =
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   112
      Atom_Graph.default_node (from, ())
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   113
      #> Atom_Graph.default_node (to, ())
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   114
      #> Atom_Graph.add_edge_acyclic (from, to)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   115
    fun add_seq (gamma, c) = fold (fn l => fold (add_edge l) c) gamma
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   116
  in Atom_Graph.empty |> fold add_seq seqs end
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   117
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   118
fun disj cs = fold (union atom_eq) cs [] |> sort Atom.ord
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   119
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   120
fun succedent_of_inference (Have (_, c)) = c
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   121
  | succedent_of_inference (Hence (_, c)) = c
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   122
  | succedent_of_inference (Cases cases) = succedent_of_cases cases
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   123
and succedent_of_case (c, []) = c
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   124
  | succedent_of_case (_, infs) = succedent_of_inference (List.last infs)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   125
and succedent_of_cases cases = disj (map succedent_of_case cases)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   126
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   127
fun dest_Have (Have z) = z
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   128
  | dest_Have _ = raise Fail "non-Have"
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   129
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   130
fun enrich_Have nontrivs trivs (cs, c) =
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   131
  (cs |> map (fn c => if member clause_eq nontrivs c then disj (c :: trivs)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   132
                      else c),
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   133
   disj (c :: trivs))
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   134
  |> Have
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   135
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   136
fun s_cases cases =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   137
  case cases |> List.partition (null o snd) of
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   138
    (trivs, nontrivs as [(nontriv0, proof)]) =>
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   139
    if forall (can dest_Have) proof then
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   140
      let val seqs = proof |> map dest_Have in
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   141
        seqs |> map (enrich_Have (nontriv0 :: map snd seqs) (map fst trivs))
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   142
      end
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   143
    else
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   144
      [Cases nontrivs]
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   145
  | (_, nontrivs) => [Cases nontrivs]
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   146
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   147
fun descendants direct_graph =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   148
  these o try (Atom_Graph.all_succs direct_graph) o single
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   149
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   150
fun zones_of 0 _ = []
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   151
  | zones_of n (bs :: bss) =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   152
    (fold (subtract atom_eq) bss) bs :: zones_of (n - 1) (bss @ [bs])
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   153
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   154
fun redirect_graph axioms tainted ref_graph =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   155
  let
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   156
    val [bot] = Atom_Graph.maximals ref_graph
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   157
    val seqs =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   158
      map (redirect_sequent tainted bot) (sequents_of_ref_graph ref_graph)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   159
    val direct_graph = direct_graph seqs
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   160
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   161
    fun redirect c proved seqs =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   162
      if null seqs then
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   163
        []
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   164
      else if length c < 2 then
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   165
        let
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   166
          val proved = c @ proved
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   167
          val provable =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   168
            filter (fn (gamma, _) => subset atom_eq (gamma, proved)) seqs
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   169
          val horn_provable = filter (fn (_, [_]) => true | _ => false) provable
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   170
          val seq as (gamma, c) = hd (horn_provable @ provable)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   171
        in
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   172
          Have (map single gamma, c) ::
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   173
          redirect c proved (filter (curry (not o direct_sequent_eq) seq) seqs)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   174
        end
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   175
      else
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   176
        let
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   177
          fun subsequents seqs zone =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   178
            filter (fn (gamma, _) => subset atom_eq (gamma, zone @ proved)) seqs
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   179
          val zones = zones_of (length c) (map (descendants direct_graph) c)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   180
          val subseqss = map (subsequents seqs) zones
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   181
          val seqs = fold (subtract direct_sequent_eq) subseqss seqs
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   182
          val cases =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   183
            map2 (fn l => fn subseqs => ([l], redirect [l] proved subseqs))
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   184
                 c subseqss
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   185
        in s_cases cases @ redirect (succedent_of_cases cases) proved seqs end
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   186
  in redirect [] axioms seqs end
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   187
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   188
val chain_direct_proof =
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   189
  let
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   190
    fun chain_inf cl0 (seq as Have (cs, c)) =
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   191
        if member clause_eq cs cl0 then
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   192
          Hence (filter_out (curry clause_eq cl0) cs, c)
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   193
        else
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   194
          seq
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   195
      | chain_inf _ (Cases cases) = Cases (map chain_case cases)
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   196
    and chain_case (c, is) = (c, chain_proof (SOME c) is)
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   197
    and chain_proof _ [] = []
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   198
      | chain_proof (SOME prev) (i :: is) =
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   199
        chain_inf prev i :: chain_proof (SOME (succedent_of_inference i)) is
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   200
      | chain_proof _ (i :: is) =
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   201
        i :: chain_proof (SOME (succedent_of_inference i)) is
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   202
  in chain_proof NONE end
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   203
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   204
fun indent 0 = ""
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   205
  | indent n = "  " ^ indent (n - 1)
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   206
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   207
fun string_of_clause [] = "\<bottom>"
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   208
  | string_of_clause ls = space_implode " \<or> " (map Atom.string_of ls)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   209
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   210
fun string_of_rich_sequent ch ([], c) = ch ^ " " ^ string_of_clause c
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   211
  | string_of_rich_sequent ch (cs, c) =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   212
    commas (map string_of_clause cs) ^ " " ^ ch ^ " " ^ string_of_clause c
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   213
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   214
fun string_of_case depth (c, proof) =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   215
  indent (depth + 1) ^ "[" ^ string_of_clause c ^ "]"
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   216
  |> not (null proof) ? suffix ("\n" ^ string_of_subproof (depth + 1) proof)
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   217
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   218
and string_of_inference depth (Have seq) =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   219
    indent depth ^ string_of_rich_sequent "\<triangleright>" seq
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   220
  | string_of_inference depth (Hence seq) =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   221
    indent depth ^ string_of_rich_sequent "\<guillemotright>" seq
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   222
  | string_of_inference depth (Cases cases) =
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   223
    indent depth ^ "[\n" ^
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   224
    space_implode ("\n" ^ indent depth ^ "|\n")
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   225
                  (map (string_of_case depth) cases) ^ "\n" ^
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   226
    indent depth ^ "]"
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   227
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   228
and string_of_subproof depth = cat_lines o map (string_of_inference depth)
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   229
45882
5d8a7fe36ce5 use new redirection algorithm in Sledgehammer
blanchet
parents: 45877
diff changeset
   230
val string_of_direct_proof = string_of_subproof 0
45877
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   231
b18f62e40429 added new proof redirection code
blanchet
parents:
diff changeset
   232
end;