src/Provers/order_tac.ML
author wenzelm
Wed, 12 Mar 2025 11:39:00 +0100
changeset 82265 4b875a4c83b0
parent 82027 9c33627cea18
permissions -rw-r--r--
update for release;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     1
signature REIFY_TABLE =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     2
sig
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
     3
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
     4
type table
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
     5
val empty : table
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
     6
val get_var : term -> table -> (int * table)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
     7
val get_term : int -> table -> term option
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
     8
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     9
end
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    10
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    11
structure Reifytab: REIFY_TABLE =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    12
struct
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    13
type table = (int * (term * int) list)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    14
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    15
val empty = (0, [])
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    16
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    17
fun get_var t (max_var, tis) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    18
  (case AList.lookup Envir.aeconv tis t of
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    19
    SOME v => (v, (max_var, tis))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    20
  | NONE => (max_var, (max_var + 1, (t, max_var) :: tis))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    21
  )
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    22
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    23
fun get_term v (_, tis) = Library.find_first (fn (_, v2) => v = v2) tis
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    24
                          |> Option.map fst
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    25
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    26
end
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    27
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    28
signature LOGIC_SIGNATURE =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    29
sig
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    30
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    31
val mk_Trueprop : term -> term
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    32
val dest_Trueprop : term -> term
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    33
val Trueprop_conv : conv -> conv
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    34
val Not : term
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    35
val conj : term
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    36
val disj : term
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    37
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    38
val notI : thm (* (P \<Longrightarrow> False) \<Longrightarrow> \<not> P *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    39
val ccontr : thm (* (\<not> P \<Longrightarrow> False) \<Longrightarrow> P *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    40
val conjI : thm (* P \<Longrightarrow> Q \<Longrightarrow> P \<and> Q *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    41
val conjE : thm (* P \<and> Q \<Longrightarrow> (P \<Longrightarrow> Q \<Longrightarrow> R) \<Longrightarrow> R *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    42
val disjE : thm (* P \<or> Q \<Longrightarrow> (P \<Longrightarrow> R) \<Longrightarrow> (Q \<Longrightarrow> R) \<Longrightarrow> R *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    43
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    44
val not_not_conv : conv (* \<not> (\<not> P) \<equiv> P *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    45
val de_Morgan_conj_conv : conv (* \<not> (P \<and> Q) \<equiv> \<not> P \<or> \<not> Q *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    46
val de_Morgan_disj_conv : conv (* \<not> (P \<or> Q) \<equiv> \<not> P \<and> \<not> Q *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    47
val conj_disj_distribL_conv : conv (* P \<and> (Q \<or> R) \<equiv> (P \<and> Q) \<or> (P \<and> R) *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    48
val conj_disj_distribR_conv : conv (* (Q \<or> R) \<and> P \<equiv> (Q \<and> P) \<or> (R \<and> P) *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    49
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    50
end
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    51
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    52
signature BASE_ORDER_TAC_BASE =
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    53
sig
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    54
  
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    55
val order_trace_cfg : bool Config.T
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    56
val order_split_limit_cfg : int Config.T
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    57
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    58
datatype order_kind = Order | Linorder
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    59
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    60
type order_literal = (bool * Order_Procedure.order_atom)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    61
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    62
type order_ops = { eq : term, le : term, lt : term }
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    63
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    64
val map_order_ops : (term -> term) -> order_ops -> order_ops
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    65
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    66
type order_context = {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    67
    kind : order_kind,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    68
    ops : order_ops,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    69
    thms : (string * thm) list, conv_thms : (string * thm) list
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    70
  }
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    71
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    72
end
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    73
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    74
structure Base_Order_Tac_Base : BASE_ORDER_TAC_BASE =
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    75
struct
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    76
  
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    77
(* Control tracing output of the solver. *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    78
val order_trace_cfg = Attrib.setup_config_bool @{binding "order_trace"} (K false)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    79
(* In partial orders, literals of the form \<not> x < y will force the order solver to perform case
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    80
   distinctions, which leads to an exponential blowup of the runtime. The split limit controls
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    81
   the number of literals of this form that are passed to the solver. 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    82
 *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    83
val order_split_limit_cfg = Attrib.setup_config_int @{binding "order_split_limit"} (K 8)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    84
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    85
datatype order_kind = Order | Linorder
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    86
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    87
type order_literal = (bool * Order_Procedure.order_atom)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    88
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    89
type order_ops = { eq : term, le : term, lt : term }
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    90
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    91
fun map_order_ops f {eq, le, lt} = {eq = f eq, le = f le, lt = f lt}
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    92
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    93
type order_context = {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    94
    kind : order_kind,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    95
    ops : order_ops,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    96
    thms : (string * thm) list, conv_thms : (string * thm) list
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
    97
  }
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    98
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
    99
end
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   100
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   101
signature BASE_ORDER_TAC =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   102
sig
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   103
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   104
include BASE_ORDER_TAC_BASE
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   105
 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   106
type insert_prems_hook =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   107
  order_kind -> order_ops -> Proof.context -> (thm * (bool * term * (term * term))) list
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   108
    -> thm list
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
   109
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   110
val declare_insert_prems_hook :
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   111
  (binding * insert_prems_hook) -> local_theory -> local_theory
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
   112
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   113
val insert_prems_hook_names : Proof.context -> binding list
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   114
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   115
val tac :
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   116
  (order_literal Order_Procedure.fm -> Order_Procedure.prf_trm option)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   117
    -> order_context -> thm list
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   118
    -> Proof.context -> int -> tactic
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   119
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   120
end
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   121
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   122
functor Base_Order_Tac(
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   123
  structure Logic_Sig : LOGIC_SIGNATURE; val excluded_types : typ list) : BASE_ORDER_TAC =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   124
struct
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   125
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   126
open Base_Order_Tac_Base
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   127
open Order_Procedure
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   128
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   129
fun expect _ (SOME x) = x
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   130
  | expect f NONE = f ()
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   131
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   132
fun list_curry0 f = (fn [] => f, 0)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   133
fun list_curry1 f = (fn [x] => f x, 1)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   134
fun list_curry2 f = (fn [x, y] => f x y, 2)
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   135
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   136
fun dereify_term consts reifytab t =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   137
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   138
    fun dereify_term' (App (t1, t2)) = (dereify_term' t1) $ (dereify_term' t2)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   139
      | dereify_term' (Const s) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   140
          AList.lookup (op =) consts s
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   141
          |> expect (fn () => raise TERM ("Const " ^ s ^ " not in", map snd consts))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   142
      | dereify_term' (Var v) = Reifytab.get_term (integer_of_int v) reifytab |> the
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   143
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   144
    dereify_term' t
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   145
  end
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   146
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   147
fun dereify_order_fm (eq, le, lt) reifytab t =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   148
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   149
    val consts = [
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   150
      ("eq", eq), ("le", le), ("lt", lt),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   151
      ("Not", Logic_Sig.Not), ("disj", Logic_Sig.disj), ("conj", Logic_Sig.conj)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   152
      ]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   153
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   154
    dereify_term consts reifytab t
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   155
  end
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   156
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   157
fun strip_AppP t =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   158
  let fun strip (AppP (f, s), ss) = strip (f, s::ss)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   159
        | strip x = x
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   160
  in strip (t, []) end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   161
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   162
fun replay_conv convs cvp =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   163
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   164
    val convs = convs @
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   165
      [("all_conv", list_curry0 Conv.all_conv)] @ 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   166
      map (apsnd list_curry1) [
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   167
        ("atom_conv", I),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   168
        ("neg_atom_conv", I),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   169
        ("arg_conv", Conv.arg_conv)] @
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   170
      map (apsnd list_curry2) [
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   171
        ("combination_conv", Conv.combination_conv),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   172
        ("then_conv", curry (op then_conv))]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   173
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   174
    fun lookup_conv convs c = AList.lookup (op =) convs c
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   175
          |> expect (fn () => error ("Can't replay conversion: " ^ c))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   176
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   177
    fun rp_conv t =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   178
      (case strip_AppP t ||> map rp_conv of
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   179
        (PThm c, cvs) =>
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   180
          let val (conv, arity) = lookup_conv convs c
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   181
          in if arity = length cvs
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   182
            then conv cvs
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   183
            else error ("Expected " ^ Int.toString arity ^ " arguments for conversion " ^
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   184
                        c ^ " but got " ^ (length cvs |> Int.toString) ^ " arguments")
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   185
          end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   186
      | _ => error "Unexpected constructor in conversion proof")
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   187
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   188
    rp_conv cvp
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   189
  end
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   190
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   191
fun replay_prf_trm replay_conv dereify ctxt thmtab assmtab p =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   192
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   193
    fun replay_prf_trm' _ (PThm s) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   194
          AList.lookup (op =) thmtab s
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   195
          |> expect (fn () => error ("Cannot replay theorem: " ^ s))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   196
      | replay_prf_trm' assmtab (Appt (p, t)) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   197
          replay_prf_trm' assmtab p
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   198
          |> Drule.infer_instantiate' ctxt [SOME (Thm.cterm_of ctxt (dereify t))]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   199
      | replay_prf_trm' assmtab (AppP (p1, p2)) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   200
          apply2 (replay_prf_trm' assmtab) (p2, p1) |> op COMP
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   201
      | replay_prf_trm' assmtab (AbsP (reified_t, p)) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   202
          let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   203
            val t = dereify reified_t
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   204
            val t_thm = Logic_Sig.mk_Trueprop t |> Thm.cterm_of ctxt |> Assumption.assume ctxt
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   205
            val rp = replay_prf_trm' (Termtab.update (Thm.prop_of t_thm, t_thm) assmtab) p
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   206
          in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   207
            Thm.implies_intr (Thm.cprop_of t_thm) rp
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   208
          end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   209
      | replay_prf_trm' assmtab (Bound reified_t) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   210
          let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   211
            val t = dereify reified_t |> Logic_Sig.mk_Trueprop
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   212
          in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   213
            Termtab.lookup assmtab t
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   214
            |> expect (fn () => raise TERM ("Assumption not found:", t::Termtab.keys assmtab))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   215
          end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   216
      | replay_prf_trm' assmtab (Conv (t, cp, p)) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   217
          let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   218
            val thm = replay_prf_trm' assmtab (Bound t)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   219
            val conv = Logic_Sig.Trueprop_conv (replay_conv cp)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   220
            val conv_thm = Conv.fconv_rule conv thm
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   221
            val conv_term = Thm.prop_of conv_thm
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   222
          in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   223
            replay_prf_trm' (Termtab.update (conv_term, conv_thm) assmtab) p
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   224
          end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   225
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   226
    replay_prf_trm' assmtab p
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   227
  end
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   228
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   229
fun replay_order_prf_trm ord_ops {thms = thms, conv_thms = conv_thms, ...} ctxt reifytab assmtab =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   230
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   231
    val thmtab = thms @ [
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   232
        ("conjE", Logic_Sig.conjE), ("conjI", Logic_Sig.conjI), ("disjE", Logic_Sig.disjE)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   233
      ]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   234
    val convs = map (apsnd list_curry0) (
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   235
      map (apsnd Conv.rewr_conv) conv_thms @
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   236
      [
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   237
        ("not_not_conv", Logic_Sig.not_not_conv),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   238
        ("de_Morgan_conj_conv", Logic_Sig.de_Morgan_conj_conv),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   239
        ("de_Morgan_disj_conv", Logic_Sig.de_Morgan_disj_conv),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   240
        ("conj_disj_distribR_conv", Logic_Sig.conj_disj_distribR_conv),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   241
        ("conj_disj_distribL_conv", Logic_Sig.conj_disj_distribL_conv)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   242
      ])
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   243
    
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   244
    val dereify = dereify_order_fm ord_ops reifytab
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   245
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   246
    replay_prf_trm (replay_conv convs) dereify ctxt thmtab assmtab
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   247
  end
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   248
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   249
fun strip_Not (nt $ t) = if nt = Logic_Sig.Not then t else nt $ t
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   250
  | strip_Not t = t
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   251
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   252
fun limit_not_less lt ctxt decomp_prems =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   253
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   254
    val trace = Config.get ctxt order_trace_cfg
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   255
    val limit = Config.get ctxt order_split_limit_cfg
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   256
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   257
    fun is_not_less_term t =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   258
      case try (strip_Not o Logic_Sig.dest_Trueprop) t of
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   259
        SOME (binop $ _ $ _) => binop = lt
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   260
      | _ => false
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   261
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   262
    val not_less_prems = filter (is_not_less_term o Thm.prop_of o fst) decomp_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   263
    val _ = if trace andalso length not_less_prems > limit
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   264
              then tracing "order split limit exceeded"
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   265
              else ()
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   266
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   267
    filter_out (is_not_less_term o Thm.prop_of o fst) decomp_prems @
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   268
    take limit not_less_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   269
  end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   270
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   271
fun decomp {eq, le, lt} ctxt t =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   272
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   273
    fun decomp'' (binop $ t1 $ t2) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   274
          let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   275
            fun is_excluded t = exists (fn ty => ty = fastype_of t) excluded_types
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   276
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   277
            open Order_Procedure
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   278
            val thy = Proof_Context.theory_of ctxt
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   279
            fun try_match pat = try (Pattern.match thy (pat, binop)) (Vartab.empty, Vartab.empty)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   280
          in if is_excluded t1 then NONE
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   281
             else case (try_match eq, try_match le, try_match lt) of
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   282
                    (SOME env, _, _) => SOME ((true, EQ, (t1, t2)), env)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   283
                  | (_, SOME env, _) => SOME ((true, LEQ, (t1, t2)), env)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   284
                  | (_, _, SOME env) => SOME ((true, LESS, (t1, t2)), env)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   285
                  | _ => NONE
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   286
          end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   287
      | decomp'' _ = NONE
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   288
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   289
      fun decomp' (nt $ t) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   290
            if nt = Logic_Sig.Not
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   291
              then decomp'' t |> Option.map (fn ((b, c, p), e) => ((not b, c, p), e))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   292
              else decomp'' (nt $ t)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   293
        | decomp' t = decomp'' t
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   294
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   295
    try Logic_Sig.dest_Trueprop t |> Option.mapPartial decomp'
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   296
  end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   297
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   298
fun maximal_envs envs =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   299
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   300
    fun test_opt p (SOME x) = p x
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   301
      | test_opt _ NONE = false
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   302
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   303
    fun leq_env (tyenv1, tenv1) (tyenv2, tenv2) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   304
      Vartab.forall (fn (v, ty) =>
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   305
        Vartab.lookup tyenv2 v |> test_opt (fn ty2 => ty2 = ty)) tyenv1
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   306
      andalso
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   307
      Vartab.forall (fn (v, (ty, t)) =>
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   308
        Vartab.lookup tenv2 v |> test_opt (fn (ty2, t2) => ty2 = ty andalso t2 aconv t)) tenv1
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   309
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   310
    fun fold_env (i, env) es = fold_index (fn (i2, env2) => fn es =>
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   311
      if i = i2 then es else if leq_env env env2 then (i, i2) :: es else es) envs es
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   312
    
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   313
    val env_order = fold_index fold_env envs []
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   314
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   315
    val graph = fold_index (fn (i, env) => fn g => Int_Graph.new_node (i, env) g)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   316
                           envs Int_Graph.empty
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   317
    val graph = fold Int_Graph.add_edge env_order graph
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   318
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   319
    val strong_conns = Int_Graph.strong_conn graph
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   320
    val maximals =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   321
      filter (fn comp => length comp = length (Int_Graph.all_succs graph comp)) strong_conns
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   322
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   323
    map (Int_Graph.all_preds graph) maximals
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   324
  end
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   325
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   326
fun partition_prems octxt ctxt prems =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   327
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   328
    fun these' _ [] = []
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   329
      | these' f (x :: xs) = case f x of NONE => these' f xs | SOME y => (x, y) :: these' f xs
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   330
    
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   331
    val (decomp_prems, envs) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   332
      these' (decomp (#ops octxt) ctxt o Thm.prop_of) prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   333
      |> map_split (fn (thm, (l, env)) => ((thm, l), env))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   334
        
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   335
    val env_groups = maximal_envs envs
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   336
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   337
    map (fn is => (map (nth decomp_prems) is, nth envs (hd is))) env_groups
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   338
  end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   339
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   340
local
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   341
  fun pretty_term_list ctxt =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   342
    Pretty.list "" "" o map (Syntax.pretty_term (Config.put show_types true ctxt))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   343
  fun pretty_type_of ctxt t = Pretty.block
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   344
    [ Pretty.str "::", Pretty.brk 1
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   345
    , Pretty.quote (Syntax.pretty_typ ctxt (Term.fastype_of t)) ]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   346
in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   347
  fun pretty_order_kind (okind : order_kind) = Pretty.str (@{make_string} okind)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   348
  fun pretty_order_ops ctxt ({eq, le, lt} : order_ops) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   349
    Pretty.block [pretty_term_list ctxt [eq, le, lt], Pretty.brk 1, pretty_type_of ctxt le]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   350
end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   351
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   352
type insert_prems_hook =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   353
  order_kind -> order_ops -> Proof.context -> (thm * (bool * term * (term * term))) list
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   354
    -> thm list
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   355
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   356
structure Insert_Prems_Hook_Data = Generic_Data(
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   357
  type T = (binding * insert_prems_hook) list
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   358
  val empty = []
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   359
  val merge = Library.merge ((op =) o apply2 fst)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   360
)
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   361
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   362
fun declare_insert_prems_hook (binding, hook) lthy =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   363
  lthy |> Local_Theory.declaration {syntax = false, pervasive = false, pos = \<^here>}
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   364
    (fn phi => fn context =>
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   365
      let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   366
        val binding = Morphism.binding phi binding
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   367
      in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   368
        context
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   369
        |> Insert_Prems_Hook_Data.map (Library.insert ((op =) o apply2 fst) (binding, hook))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   370
      end)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   371
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   372
val insert_prems_hook_names = Context.Proof #> Insert_Prems_Hook_Data.get #> map fst
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   373
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   374
fun eval_insert_prems_hook kind order_ops ctxt decomp_prems (hookN, hook : insert_prems_hook) = 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   375
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   376
    fun dereify_order_op' (EQ _) = #eq order_ops
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   377
      | dereify_order_op' (LEQ _) = #le order_ops
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   378
      | dereify_order_op' (LESS _) = #lt order_ops
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   379
    fun dereify_order_op oop = (~1, ~1) |> apply2 Int_of_integer |> oop |> dereify_order_op'
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   380
    val decomp_prems =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   381
      decomp_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   382
      |> map (apsnd (fn (b, oop, (t1, t2)) => (b, dereify_order_op oop, (t1, t2))))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   383
    fun unzip (acc1, acc2) [] = (rev acc1, rev acc2)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   384
      | unzip (acc1, acc2) ((thm, NONE) :: ps) = unzip (acc1, thm :: acc2) ps
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   385
      | unzip (acc1, acc2) ((thm, SOME dp) :: ps) = unzip ((thm, dp) :: acc1, acc2) ps
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   386
    val (decomp_extra_prems, invalid_extra_prems) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   387
      hook kind order_ops ctxt decomp_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   388
      |> map (swap o ` (decomp order_ops ctxt o Thm.prop_of))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   389
      |> unzip ([], [])
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   390
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   391
    val pretty_thm_list = Pretty.list "" "" o map (Thm.pretty_thm ctxt)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   392
    fun pretty_trace () = 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   393
      [ ("order kind:", pretty_order_kind kind)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   394
      , ("order operators:", pretty_order_ops ctxt order_ops)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   395
      , ("inserted premises:", pretty_thm_list (map fst decomp_extra_prems))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   396
      , ("invalid premises:", pretty_thm_list invalid_extra_prems)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   397
      ]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   398
      |> map (fn (t, pp) => Pretty.block [Pretty.str t, Pretty.brk 1, pp])
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   399
      |> Pretty.big_list ("insert premises hook " ^ Pretty.string_of (Binding.pretty hookN) 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   400
          ^ " called with the parameters")
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   401
    val trace = Config.get ctxt order_trace_cfg
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   402
    val _ = if trace then tracing (Pretty.string_of (pretty_trace ())) else ()
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   403
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   404
    map (apsnd fst) decomp_extra_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   405
  end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   406
    
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   407
fun order_tac raw_order_proc octxt simp_prems =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   408
  Subgoal.FOCUS (fn {prems=prems, context=ctxt, ...} =>
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   409
    let
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   410
      val trace = Config.get ctxt order_trace_cfg
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   411
      
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   412
      fun order_tac' ([], _) = no_tac
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   413
        | order_tac' (decomp_prems, env) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   414
          let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   415
            val (order_ops as {eq, le, lt}) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   416
              #ops octxt |> map_order_ops (Envir.eta_contract o Envir.subst_term env)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   417
              
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   418
            val insert_prems_hooks = Insert_Prems_Hook_Data.get (Context.Proof ctxt)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   419
            val inserted_decomp_prems =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   420
              insert_prems_hooks
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   421
              |> maps (eval_insert_prems_hook (#kind octxt) order_ops ctxt decomp_prems)
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 74561
diff changeset
   422
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   423
            val decomp_prems = decomp_prems @ inserted_decomp_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   424
            val decomp_prems =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   425
              case #kind octxt of
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   426
                Order => limit_not_less lt ctxt decomp_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   427
              | _ => decomp_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   428
    
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   429
            fun reify_prem (_, (b, ctor, (x, y))) (ps, reifytab) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   430
              (Reifytab.get_var x ##>> Reifytab.get_var y) reifytab
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   431
              |>> (fn vp => (b, ctor (apply2 Int_of_integer vp)) :: ps)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   432
            val (reified_prems, reifytab) = fold_rev reify_prem decomp_prems ([], Reifytab.empty)
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
   433
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   434
            val reified_prems_conj = foldl1 (fn (x, a) => And (x, a)) (map Atom reified_prems)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   435
            val prems_conj_thm = map fst decomp_prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   436
                                 |> foldl1 (fn (x, a) => Logic_Sig.conjI OF [x, a])
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   437
                                 |> Conv.fconv_rule Thm.eta_conversion 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   438
            val prems_conj = prems_conj_thm |> Thm.prop_of
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   439
            
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   440
            val proof = raw_order_proc reified_prems_conj
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
   441
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   442
            val pretty_thm_list = Pretty.list "" "" o map (Thm.pretty_thm ctxt)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   443
            fun pretty_trace () = 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   444
              [ ("order kind:", pretty_order_kind (#kind octxt))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   445
              , ("order operators:", pretty_order_ops ctxt order_ops)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   446
              , ("premises:", pretty_thm_list prems)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   447
              , ("selected premises:", pretty_thm_list (map fst decomp_prems))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   448
              , ("reified premises:", Pretty.str (@{make_string} reified_prems))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   449
              , ("contradiction:", Pretty.str (@{make_string} (Option.isSome proof)))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   450
              ] 
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   451
              |> map (fn (t, pp) => Pretty.block [Pretty.str t, Pretty.brk 1, pp])
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   452
              |> Pretty.big_list "order solver called with the parameters"
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   453
            val _ = if trace then tracing (Pretty.string_of (pretty_trace ())) else ()
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
   454
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   455
            val assmtab = Termtab.make [(prems_conj, prems_conj_thm)]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   456
            val replay = replay_order_prf_trm (eq, le, lt) octxt ctxt reifytab assmtab
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   457
          in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   458
            case proof of
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   459
              NONE => no_tac
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   460
            | SOME p => SOLVED' (resolve_tac ctxt [replay p]) 1
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   461
          end
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 74561
diff changeset
   462
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   463
      val prems = simp_prems @ prems
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   464
                  |> filter (fn p => null (Term.add_vars (Thm.prop_of p) []))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   465
                  |> map (Conv.fconv_rule Thm.eta_conversion)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   466
   in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   467
    partition_prems octxt ctxt prems |> map order_tac' |> FIRST
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   468
   end)
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 74561
diff changeset
   469
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   470
val ad_absurdum_tac = SUBGOAL (fn (A, i) =>
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   471
  case try (Logic_Sig.dest_Trueprop o Logic.strip_assums_concl) A of
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   472
    SOME (nt $ _) =>
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   473
      if nt = Logic_Sig.Not
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   474
        then resolve0_tac [Logic_Sig.notI] i
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   475
        else resolve0_tac [Logic_Sig.ccontr] i
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   476
  | _ => resolve0_tac [Logic_Sig.ccontr] i)
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
   477
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   478
fun tac raw_order_proc octxt simp_prems ctxt =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   479
  ad_absurdum_tac THEN' order_tac raw_order_proc octxt simp_prems ctxt
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   480
  
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   481
end
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   482
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   483
functor Order_Tac(structure Base_Tac : BASE_ORDER_TAC) = struct
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   484
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   485
open Base_Tac
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   486
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   487
fun order_context_eq ({kind = kind1, ops = ops1, ...}, {kind = kind2, ops = ops2, ...}) =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   488
  let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   489
    fun ops_list ops = [#eq ops, #le ops, #lt ops]
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   490
  in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   491
    kind1 = kind2 andalso eq_list (op aconv) (apply2 ops_list (ops1, ops2))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   492
  end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   493
val order_data_eq = order_context_eq o apply2 fst
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   494
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   495
structure Data = Generic_Data(
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   496
  type T = (order_context * (order_context -> thm list -> Proof.context -> int -> tactic)) list
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   497
  val empty = []
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   498
  fun merge data = Library.merge order_data_eq data
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   499
)
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   500
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   501
fun declare (octxt as {kind = kind, raw_proc = raw_proc, ...}) lthy =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   502
  lthy |> Local_Theory.declaration {syntax = false, pervasive = false, pos = \<^here>}
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   503
    (fn phi => fn context =>
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   504
      let
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   505
        val ops = map_order_ops (Morphism.term phi) (#ops octxt)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   506
        val thms = map (fn (s, thm) => (s, Morphism.thm phi thm)) (#thms octxt)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   507
        val conv_thms = map (fn (s, thm) => (s, Morphism.thm phi thm)) (#conv_thms octxt)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   508
        val octxt' = {kind = kind, ops = ops, thms = thms, conv_thms = conv_thms}
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   509
      in
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   510
        context |> Data.map (Library.insert order_data_eq (octxt', raw_proc))
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   511
      end)
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   512
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   513
fun declare_order {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   514
    ops = ops,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   515
    thms = {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   516
      trans = trans, (* x \<le> y \<Longrightarrow> y \<le> z \<Longrightarrow> x \<le> z *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   517
      refl = refl, (* x \<le> x *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   518
      eqD1 = eqD1, (* x = y \<Longrightarrow> x \<le> y *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   519
      eqD2 = eqD2, (* x = y \<Longrightarrow> y \<le> x *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   520
      antisym = antisym, (* x \<le> y \<Longrightarrow> y \<le> x \<Longrightarrow> x = y *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   521
      contr = contr (* \<not> P \<Longrightarrow> P \<Longrightarrow> R *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   522
    },
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   523
    conv_thms = {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   524
      less_le = less_le, (* x < y \<equiv> x \<le> y \<and> x \<noteq> y *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   525
      nless_le = nless_le (* \<not> a < b \<equiv> \<not> a \<le> b \<or> a = b *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   526
    }
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   527
  } =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   528
  declare {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   529
    kind = Order,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   530
    ops = ops,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   531
    thms = [("trans", trans), ("refl", refl), ("eqD1", eqD1), ("eqD2", eqD2),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   532
            ("antisym", antisym), ("contr", contr)],
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   533
    conv_thms = [("less_le", less_le), ("nless_le", nless_le)],
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   534
    raw_proc = Base_Tac.tac Order_Procedure.po_contr_prf
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   535
   }                
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   536
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   537
fun declare_linorder {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   538
    ops = ops,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   539
    thms = {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   540
      trans = trans, (* x \<le> y \<Longrightarrow> y \<le> z \<Longrightarrow> x \<le> z *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   541
      refl = refl, (* x \<le> x *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   542
      eqD1 = eqD1, (* x = y \<Longrightarrow> x \<le> y *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   543
      eqD2 = eqD2, (* x = y \<Longrightarrow> y \<le> x *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   544
      antisym = antisym, (* x \<le> y \<Longrightarrow> y \<le> x \<Longrightarrow> x = y *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   545
      contr = contr (* \<not> P \<Longrightarrow> P \<Longrightarrow> R *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   546
    },
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   547
    conv_thms = {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   548
      less_le = less_le, (* x < y \<equiv> x \<le> y \<and> x \<noteq> y *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   549
      nless_le = nless_le, (* \<not> x < y \<equiv> y \<le> x *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   550
      nle_le = nle_le (* \<not> a \<le> b \<equiv> b \<le> a \<and> b \<noteq> a *)
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   551
    }
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   552
  } =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   553
  declare {
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   554
    kind = Linorder,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   555
    ops = ops,
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   556
    thms = [("trans", trans), ("refl", refl), ("eqD1", eqD1), ("eqD2", eqD2),
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   557
            ("antisym", antisym), ("contr", contr)],
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   558
    conv_thms = [("less_le", less_le), ("nless_le", nless_le), ("nle_le", nle_le)],
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   559
    raw_proc = Base_Tac.tac Order_Procedure.lo_contr_prf
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   560
   }
82026
57b4e44f5bc4 add hook to insert premises in the order solver
Lukas Stevens <mail@lukas-stevens.de>
parents: 78095
diff changeset
   561
82027
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   562
(* Try to solve the goal by calling the order solver with each of the declared orders. *)      
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   563
fun tac simp_prems ctxt =
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   564
  let fun app_tac (octxt, tac0) = CHANGED o tac0 octxt simp_prems ctxt
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   565
  in FIRST' (map app_tac (Data.get (Context.Proof ctxt))) end
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   566
9c33627cea18 more canonical formatting
Lukas Stevens <mail@lukas-stevens.de>
parents: 82026
diff changeset
   567
end