src/Provers/order_procedure.ML
author paulson <lp15@cam.ac.uk>
Wed, 09 Mar 2022 12:43:48 +0000
changeset 75243 a2b8394ce1f1
parent 74625 e6f0c9bf966c
permissions -rw-r--r--
Tidied some messy proofs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     1
structure Order_Procedure : sig
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
     2
  datatype inta = Int_of_integer of int
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
     3
  val integer_of_int : inta -> int
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     4
  datatype 'a fm = Atom of 'a | And of 'a fm * 'a fm | Or of 'a fm * 'a fm |
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     5
    Neg of 'a fm
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
     6
  datatype trm = Const of string | App of trm * trm | Var of inta
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     7
  datatype prf_trm = PThm of string | Appt of prf_trm * trm |
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     8
    AppP of prf_trm * prf_trm | AbsP of trm * prf_trm | Bound of trm |
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
     9
    Conv of trm * prf_trm * prf_trm
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    10
  datatype order_atom = EQ of inta * inta | LEQ of inta * inta |
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    11
    LESS of inta * inta
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    12
  val lo_contr_prf : (bool * order_atom) fm -> prf_trm option
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    13
  val po_contr_prf : (bool * order_atom) fm -> prf_trm option
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    14
end = struct
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    15
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    16
datatype inta = Int_of_integer of int;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    17
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    18
fun integer_of_int (Int_of_integer k) = k;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    19
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    20
fun equal_inta k l = integer_of_int k = integer_of_int l;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    21
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    22
type 'a equal = {equal : 'a -> 'a -> bool};
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    23
val equal = #equal : 'a equal -> 'a -> 'a -> bool;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    24
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    25
val equal_int = {equal = equal_inta} : inta equal;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    26
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    27
fun less_eq_int k l = integer_of_int k <= integer_of_int l;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    28
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    29
type 'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool};
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    30
val less_eq = #less_eq : 'a ord -> 'a -> 'a -> bool;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    31
val less = #less : 'a ord -> 'a -> 'a -> bool;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    32
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    33
fun less_int k l = integer_of_int k < integer_of_int l;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    34
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    35
val ord_int = {less_eq = less_eq_int, less = less_int} : inta ord;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    36
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    37
type 'a preorder = {ord_preorder : 'a ord};
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    38
val ord_preorder = #ord_preorder : 'a preorder -> 'a ord;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    39
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    40
type 'a order = {preorder_order : 'a preorder};
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    41
val preorder_order = #preorder_order : 'a order -> 'a preorder;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    42
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    43
val preorder_int = {ord_preorder = ord_int} : inta preorder;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    44
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    45
val order_int = {preorder_order = preorder_int} : inta order;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    46
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    47
type 'a linorder = {order_linorder : 'a order};
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    48
val order_linorder = #order_linorder : 'a linorder -> 'a order;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    49
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    50
val linorder_int = {order_linorder = order_int} : inta linorder;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    51
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    52
fun eq A_ a b = equal A_ a b;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    53
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    54
fun equal_proda A_ B_ (x1, x2) (y1, y2) = eq A_ x1 y1 andalso eq B_ x2 y2;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    55
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    56
fun equal_prod A_ B_ = {equal = equal_proda A_ B_} : ('a * 'b) equal;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    57
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    58
fun less_eq_prod A_ B_ (x1, y1) (x2, y2) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    59
  less A_ x1 x2 orelse less_eq A_ x1 x2 andalso less_eq B_ y1 y2;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    60
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    61
fun less_prod A_ B_ (x1, y1) (x2, y2) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    62
  less A_ x1 x2 orelse less_eq A_ x1 x2 andalso less B_ y1 y2;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    63
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    64
fun ord_prod A_ B_ = {less_eq = less_eq_prod A_ B_, less = less_prod A_ B_} :
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    65
  ('a * 'b) ord;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    66
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    67
fun preorder_prod A_ B_ =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    68
  {ord_preorder = ord_prod (ord_preorder A_) (ord_preorder B_)} :
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    69
  ('a * 'b) preorder;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    70
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    71
fun order_prod A_ B_ =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    72
  {preorder_order = preorder_prod (preorder_order A_) (preorder_order B_)} :
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    73
  ('a * 'b) order;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    74
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    75
fun linorder_prod A_ B_ =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    76
  {order_linorder = order_prod (order_linorder A_) (order_linorder B_)} :
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    77
  ('a * 'b) linorder;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    78
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    79
datatype nat = Zero_nat | Suc of nat;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    80
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    81
datatype color = R | B;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    82
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    83
datatype ('a, 'b) rbta = Empty |
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    84
  Branch of color * ('a, 'b) rbta * 'a * 'b * ('a, 'b) rbta;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    85
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    86
datatype ('b, 'a) rbt = RBT of ('b, 'a) rbta;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    87
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    88
datatype 'a set = Set of 'a list | Coset of 'a list;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    89
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    90
datatype 'a fm = Atom of 'a | And of 'a fm * 'a fm | Or of 'a fm * 'a fm |
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    91
  Neg of 'a fm;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    92
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
    93
datatype trm = Const of string | App of trm * trm | Var of inta;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    94
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    95
datatype prf_trm = PThm of string | Appt of prf_trm * trm |
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    96
  AppP of prf_trm * prf_trm | AbsP of trm * prf_trm | Bound of trm |
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    97
  Conv of trm * prf_trm * prf_trm;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    98
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
    99
datatype ('a, 'b) mapping = Mapping of ('a, 'b) rbt;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   100
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   101
datatype order_atom = EQ of inta * inta | LEQ of inta * inta |
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   102
  LESS of inta * inta;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   103
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   104
fun id x = (fn xa => xa) x;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   105
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   106
fun impl_of B_ (RBT x) = x;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   107
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   108
fun foldb f (Branch (c, lt, k, v, rt)) x = foldb f rt (f k v (foldb f lt x))
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   109
  | foldb f Empty x = x;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   110
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   111
fun fold A_ x xc = foldb x (impl_of A_ xc);
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   112
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   113
fun gen_keys kts (Branch (c, l, k, v, r)) = gen_keys ((k, r) :: kts) l
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   114
  | gen_keys ((k, t) :: kts) Empty = k :: gen_keys kts t
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   115
  | gen_keys [] Empty = [];
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   116
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   117
fun keysb x = gen_keys [] x;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   118
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   119
fun keys A_ x = keysb (impl_of A_ x);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   120
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   121
fun maps f [] = []
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   122
  | maps f (x :: xs) = f x @ maps f xs;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   123
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   124
fun empty A_ = RBT Empty;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   125
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   126
fun foldl f a [] = a
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   127
  | foldl f a (x :: xs) = foldl f (f a x) xs;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   128
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   129
fun foldr f [] = id
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   130
  | foldr f (x :: xs) = f x o foldr f xs;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   131
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   132
fun balance (Branch (R, a, w, x, b)) s t (Branch (R, c, y, z, d)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   133
  Branch (R, Branch (B, a, w, x, b), s, t, Branch (B, c, y, z, d))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   134
  | balance (Branch (R, Branch (R, a, w, x, b), s, t, c)) y z Empty =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   135
    Branch (R, Branch (B, a, w, x, b), s, t, Branch (B, c, y, z, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   136
  | balance (Branch (R, Branch (R, a, w, x, b), s, t, c)) y z
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   137
    (Branch (B, va, vb, vc, vd)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   138
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   139
      (R, Branch (B, a, w, x, b), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   140
        Branch (B, c, y, z, Branch (B, va, vb, vc, vd)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   141
  | balance (Branch (R, Empty, w, x, Branch (R, b, s, t, c))) y z Empty =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   142
    Branch (R, Branch (B, Empty, w, x, b), s, t, Branch (B, c, y, z, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   143
  | balance
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   144
    (Branch (R, Branch (B, va, vb, vc, vd), w, x, Branch (R, b, s, t, c))) y z
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   145
    Empty =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   146
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   147
      (R, Branch (B, Branch (B, va, vb, vc, vd), w, x, b), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   148
        Branch (B, c, y, z, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   149
  | balance (Branch (R, Empty, w, x, Branch (R, b, s, t, c))) y z
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   150
    (Branch (B, va, vb, vc, vd)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   151
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   152
      (R, Branch (B, Empty, w, x, b), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   153
        Branch (B, c, y, z, Branch (B, va, vb, vc, vd)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   154
  | balance
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   155
    (Branch (R, Branch (B, ve, vf, vg, vh), w, x, Branch (R, b, s, t, c))) y z
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   156
    (Branch (B, va, vb, vc, vd)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   157
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   158
      (R, Branch (B, Branch (B, ve, vf, vg, vh), w, x, b), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   159
        Branch (B, c, y, z, Branch (B, va, vb, vc, vd)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   160
  | balance Empty w x (Branch (R, b, s, t, Branch (R, c, y, z, d))) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   161
    Branch (R, Branch (B, Empty, w, x, b), s, t, Branch (B, c, y, z, d))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   162
  | balance (Branch (B, va, vb, vc, vd)) w x
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   163
    (Branch (R, b, s, t, Branch (R, c, y, z, d))) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   164
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   165
      (R, Branch (B, Branch (B, va, vb, vc, vd), w, x, b), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   166
        Branch (B, c, y, z, d))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   167
  | balance Empty w x (Branch (R, Branch (R, b, s, t, c), y, z, Empty)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   168
    Branch (R, Branch (B, Empty, w, x, b), s, t, Branch (B, c, y, z, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   169
  | balance Empty w x
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   170
    (Branch (R, Branch (R, b, s, t, c), y, z, Branch (B, va, vb, vc, vd))) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   171
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   172
      (R, Branch (B, Empty, w, x, b), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   173
        Branch (B, c, y, z, Branch (B, va, vb, vc, vd)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   174
  | balance (Branch (B, va, vb, vc, vd)) w x
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   175
    (Branch (R, Branch (R, b, s, t, c), y, z, Empty)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   176
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   177
      (R, Branch (B, Branch (B, va, vb, vc, vd), w, x, b), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   178
        Branch (B, c, y, z, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   179
  | balance (Branch (B, va, vb, vc, vd)) w x
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   180
    (Branch (R, Branch (R, b, s, t, c), y, z, Branch (B, ve, vf, vg, vh))) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   181
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   182
      (R, Branch (B, Branch (B, va, vb, vc, vd), w, x, b), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   183
        Branch (B, c, y, z, Branch (B, ve, vf, vg, vh)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   184
  | balance Empty s t Empty = Branch (B, Empty, s, t, Empty)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   185
  | balance Empty s t (Branch (B, va, vb, vc, vd)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   186
    Branch (B, Empty, s, t, Branch (B, va, vb, vc, vd))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   187
  | balance Empty s t (Branch (v, Empty, vb, vc, Empty)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   188
    Branch (B, Empty, s, t, Branch (v, Empty, vb, vc, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   189
  | balance Empty s t (Branch (v, Branch (B, ve, vf, vg, vh), vb, vc, Empty)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   190
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   191
      (B, Empty, s, t, Branch (v, Branch (B, ve, vf, vg, vh), vb, vc, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   192
  | balance Empty s t (Branch (v, Empty, vb, vc, Branch (B, vf, vg, vh, vi))) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   193
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   194
      (B, Empty, s, t, Branch (v, Empty, vb, vc, Branch (B, vf, vg, vh, vi)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   195
  | balance Empty s t
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   196
    (Branch (v, Branch (B, ve, vj, vk, vl), vb, vc, Branch (B, vf, vg, vh, vi)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   197
    = Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   198
        (B, Empty, s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   199
          Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   200
            (v, Branch (B, ve, vj, vk, vl), vb, vc, Branch (B, vf, vg, vh, vi)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   201
  | balance (Branch (B, va, vb, vc, vd)) s t Empty =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   202
    Branch (B, Branch (B, va, vb, vc, vd), s, t, Empty)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   203
  | balance (Branch (B, va, vb, vc, vd)) s t (Branch (B, ve, vf, vg, vh)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   204
    Branch (B, Branch (B, va, vb, vc, vd), s, t, Branch (B, ve, vf, vg, vh))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   205
  | balance (Branch (B, va, vb, vc, vd)) s t (Branch (v, Empty, vf, vg, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   206
    = Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   207
        (B, Branch (B, va, vb, vc, vd), s, t, Branch (v, Empty, vf, vg, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   208
  | balance (Branch (B, va, vb, vc, vd)) s t
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   209
    (Branch (v, Branch (B, vi, vj, vk, vl), vf, vg, Empty)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   210
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   211
      (B, Branch (B, va, vb, vc, vd), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   212
        Branch (v, Branch (B, vi, vj, vk, vl), vf, vg, Empty))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   213
  | balance (Branch (B, va, vb, vc, vd)) s t
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   214
    (Branch (v, Empty, vf, vg, Branch (B, vj, vk, vl, vm))) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   215
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   216
      (B, Branch (B, va, vb, vc, vd), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   217
        Branch (v, Empty, vf, vg, Branch (B, vj, vk, vl, vm)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   218
  | balance (Branch (B, va, vb, vc, vd)) s t
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   219
    (Branch (v, Branch (B, vi, vn, vo, vp), vf, vg, Branch (B, vj, vk, vl, vm)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   220
    = Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   221
        (B, Branch (B, va, vb, vc, vd), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   222
          Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   223
            (v, Branch (B, vi, vn, vo, vp), vf, vg, Branch (B, vj, vk, vl, vm)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   224
  | balance (Branch (v, Empty, vb, vc, Empty)) s t Empty =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   225
    Branch (B, Branch (v, Empty, vb, vc, Empty), s, t, Empty)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   226
  | balance (Branch (v, Empty, vb, vc, Branch (B, ve, vf, vg, vh))) s t Empty =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   227
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   228
      (B, Branch (v, Empty, vb, vc, Branch (B, ve, vf, vg, vh)), s, t, Empty)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   229
  | balance (Branch (v, Branch (B, vf, vg, vh, vi), vb, vc, Empty)) s t Empty =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   230
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   231
      (B, Branch (v, Branch (B, vf, vg, vh, vi), vb, vc, Empty), s, t, Empty)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   232
  | balance
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   233
    (Branch (v, Branch (B, vf, vg, vh, vi), vb, vc, Branch (B, ve, vj, vk, vl)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   234
    s t Empty =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   235
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   236
      (B, Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   237
            (v, Branch (B, vf, vg, vh, vi), vb, vc, Branch (B, ve, vj, vk, vl)),
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   238
        s, t, Empty)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   239
  | balance (Branch (v, Empty, vf, vg, Empty)) s t (Branch (B, va, vb, vc, vd))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   240
    = Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   241
        (B, Branch (v, Empty, vf, vg, Empty), s, t, Branch (B, va, vb, vc, vd))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   242
  | balance (Branch (v, Empty, vf, vg, Branch (B, vi, vj, vk, vl))) s t
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   243
    (Branch (B, va, vb, vc, vd)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   244
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   245
      (B, Branch (v, Empty, vf, vg, Branch (B, vi, vj, vk, vl)), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   246
        Branch (B, va, vb, vc, vd))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   247
  | balance (Branch (v, Branch (B, vj, vk, vl, vm), vf, vg, Empty)) s t
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   248
    (Branch (B, va, vb, vc, vd)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   249
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   250
      (B, Branch (v, Branch (B, vj, vk, vl, vm), vf, vg, Empty), s, t,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   251
        Branch (B, va, vb, vc, vd))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   252
  | balance
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   253
    (Branch (v, Branch (B, vj, vk, vl, vm), vf, vg, Branch (B, vi, vn, vo, vp)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   254
    s t (Branch (B, va, vb, vc, vd)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   255
    Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   256
      (B, Branch
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   257
            (v, Branch (B, vj, vk, vl, vm), vf, vg, Branch (B, vi, vn, vo, vp)),
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   258
        s, t, Branch (B, va, vb, vc, vd));
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   259
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   260
fun rbt_ins A_ f k v Empty = Branch (R, Empty, k, v, Empty)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   261
  | rbt_ins A_ f k v (Branch (B, l, x, y, r)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   262
    (if less A_ k x then balance (rbt_ins A_ f k v l) x y r
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   263
      else (if less A_ x k then balance l x y (rbt_ins A_ f k v r)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   264
             else Branch (B, l, x, f k y v, r)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   265
  | rbt_ins A_ f k v (Branch (R, l, x, y, r)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   266
    (if less A_ k x then Branch (R, rbt_ins A_ f k v l, x, y, r)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   267
      else (if less A_ x k then Branch (R, l, x, y, rbt_ins A_ f k v r)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   268
             else Branch (R, l, x, f k y v, r)));
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   269
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   270
fun paint c Empty = Empty
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   271
  | paint c (Branch (uu, l, k, v, r)) = Branch (c, l, k, v, r);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   272
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   273
fun rbt_insert_with_key A_ f k v t = paint B (rbt_ins A_ f k v t);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   274
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   275
fun rbt_insert A_ = rbt_insert_with_key A_ (fn _ => fn _ => fn nv => nv);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   276
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   277
fun insert A_ xc xd xe =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   278
  RBT (rbt_insert ((ord_preorder o preorder_order o order_linorder) A_) xc xd
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   279
        (impl_of A_ xe));
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   280
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   281
fun rbt_lookup A_ Empty k = NONE
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   282
  | rbt_lookup A_ (Branch (uu, l, x, y, r)) k =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   283
    (if less A_ k x then rbt_lookup A_ l k
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   284
      else (if less A_ x k then rbt_lookup A_ r k else SOME y));
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   285
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   286
fun lookup A_ x =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   287
  rbt_lookup ((ord_preorder o preorder_order o order_linorder) A_)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   288
    (impl_of A_ x);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   289
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   290
fun member A_ [] y = false
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   291
  | member A_ (x :: xs) y = eq A_ x y orelse member A_ xs y;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   292
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   293
fun remdups A_ [] = []
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   294
  | remdups A_ (x :: xs) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   295
    (if member A_ xs x then remdups A_ xs else x :: remdups A_ xs);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   296
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   297
fun dnf_and_fm (Or (phi_1, phi_2)) psi =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   298
  Or (dnf_and_fm phi_1 psi, dnf_and_fm phi_2 psi)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   299
  | dnf_and_fm (Atom v) (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   300
    Or (dnf_and_fm (Atom v) phi_1, dnf_and_fm (Atom v) phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   301
  | dnf_and_fm (And (v, va)) (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   302
    Or (dnf_and_fm (And (v, va)) phi_1, dnf_and_fm (And (v, va)) phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   303
  | dnf_and_fm (Neg v) (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   304
    Or (dnf_and_fm (Neg v) phi_1, dnf_and_fm (Neg v) phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   305
  | dnf_and_fm (Atom v) (Atom va) = And (Atom v, Atom va)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   306
  | dnf_and_fm (Atom v) (And (va, vb)) = And (Atom v, And (va, vb))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   307
  | dnf_and_fm (Atom v) (Neg va) = And (Atom v, Neg va)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   308
  | dnf_and_fm (And (v, va)) (Atom vb) = And (And (v, va), Atom vb)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   309
  | dnf_and_fm (And (v, va)) (And (vb, vc)) = And (And (v, va), And (vb, vc))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   310
  | dnf_and_fm (And (v, va)) (Neg vb) = And (And (v, va), Neg vb)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   311
  | dnf_and_fm (Neg v) (Atom va) = And (Neg v, Atom va)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   312
  | dnf_and_fm (Neg v) (And (va, vb)) = And (Neg v, And (va, vb))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   313
  | dnf_and_fm (Neg v) (Neg va) = And (Neg v, Neg va);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   314
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   315
fun dnf_fm (And (phi_1, phi_2)) = dnf_and_fm (dnf_fm phi_1) (dnf_fm phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   316
  | dnf_fm (Or (phi_1, phi_2)) = Or (dnf_fm phi_1, dnf_fm phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   317
  | dnf_fm (Atom v) = Atom v
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   318
  | dnf_fm (Neg v) = Neg v;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   319
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   320
fun folda A_ f (Mapping t) a = fold A_ f t a;
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   321
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   322
fun keysa A_ (Mapping t) = Set (keys A_ t);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   323
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   324
fun amap_fm h (Atom a) = h a
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   325
  | amap_fm h (And (phi_1, phi_2)) = And (amap_fm h phi_1, amap_fm h phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   326
  | amap_fm h (Or (phi_1, phi_2)) = Or (amap_fm h phi_1, amap_fm h phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   327
  | amap_fm h (Neg phi) = Neg (amap_fm h phi);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   328
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   329
fun emptya A_ = Mapping (empty A_);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   330
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   331
fun lookupa A_ (Mapping t) = lookup A_ t;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   332
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   333
fun update A_ k v (Mapping t) = Mapping (insert A_ k v t);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   334
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   335
fun gen_length n (x :: xs) = gen_length (Suc n) xs
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   336
  | gen_length n [] = n;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   337
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   338
fun size_list x = gen_length Zero_nat x;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   339
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   340
fun card A_ (Set xs) = size_list (remdups A_ xs);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   341
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   342
fun conj_list (And (phi_1, phi_2)) = conj_list phi_1 @ conj_list phi_2
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   343
  | conj_list (Atom a) = [a];
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   344
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   345
fun trm_of_fm f (Atom a) = f a
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   346
  | trm_of_fm f (And (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   347
    App (App (Const "conj", trm_of_fm f phi_1), trm_of_fm f phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   348
  | trm_of_fm f (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   349
    App (App (Const "disj", trm_of_fm f phi_1), trm_of_fm f phi_2)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   350
  | trm_of_fm f (Neg phi) = App (Const "Not", trm_of_fm f phi);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   351
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   352
fun dnf_and_fm_prf (Or (phi_1, phi_2)) psi =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   353
  foldl (fn a => fn b => AppP (a, b)) (PThm "then_conv")
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   354
    [PThm "conj_disj_distribR_conv",
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   355
      foldl (fn a => fn b => AppP (a, b)) (PThm "combination_conv")
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   356
        [AppP (PThm "arg_conv", dnf_and_fm_prf phi_1 psi),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   357
          dnf_and_fm_prf phi_2 psi]]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   358
  | dnf_and_fm_prf (Atom v) (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   359
    foldl (fn a => fn b => AppP (a, b)) (PThm "then_conv")
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   360
      [PThm "conj_disj_distribL_conv",
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   361
        foldl (fn a => fn b => AppP (a, b)) (PThm "combination_conv")
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   362
          [AppP (PThm "arg_conv", dnf_and_fm_prf (Atom v) phi_1),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   363
            dnf_and_fm_prf (Atom v) phi_2]]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   364
  | dnf_and_fm_prf (And (v, va)) (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   365
    foldl (fn a => fn b => AppP (a, b)) (PThm "then_conv")
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   366
      [PThm "conj_disj_distribL_conv",
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   367
        foldl (fn a => fn b => AppP (a, b)) (PThm "combination_conv")
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   368
          [AppP (PThm "arg_conv", dnf_and_fm_prf (And (v, va)) phi_1),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   369
            dnf_and_fm_prf (And (v, va)) phi_2]]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   370
  | dnf_and_fm_prf (Neg v) (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   371
    foldl (fn a => fn b => AppP (a, b)) (PThm "then_conv")
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   372
      [PThm "conj_disj_distribL_conv",
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   373
        foldl (fn a => fn b => AppP (a, b)) (PThm "combination_conv")
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   374
          [AppP (PThm "arg_conv", dnf_and_fm_prf (Neg v) phi_1),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   375
            dnf_and_fm_prf (Neg v) phi_2]]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   376
  | dnf_and_fm_prf (Atom v) (Atom va) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   377
  | dnf_and_fm_prf (Atom v) (And (va, vb)) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   378
  | dnf_and_fm_prf (Atom v) (Neg va) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   379
  | dnf_and_fm_prf (And (v, va)) (Atom vb) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   380
  | dnf_and_fm_prf (And (v, va)) (And (vb, vc)) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   381
  | dnf_and_fm_prf (And (v, va)) (Neg vb) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   382
  | dnf_and_fm_prf (Neg v) (Atom va) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   383
  | dnf_and_fm_prf (Neg v) (And (va, vb)) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   384
  | dnf_and_fm_prf (Neg v) (Neg va) = PThm "all_conv";
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   385
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   386
fun dnf_fm_prf (And (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   387
  foldl (fn a => fn b => AppP (a, b)) (PThm "then_conv")
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   388
    [foldl (fn a => fn b => AppP (a, b)) (PThm "combination_conv")
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   389
       [AppP (PThm "arg_conv", dnf_fm_prf phi_1), dnf_fm_prf phi_2],
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   390
      dnf_and_fm_prf (dnf_fm phi_1) (dnf_fm phi_2)]
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   391
  | dnf_fm_prf (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   392
    foldl (fn a => fn b => AppP (a, b)) (PThm "combination_conv")
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   393
      [AppP (PThm "arg_conv", dnf_fm_prf phi_1), dnf_fm_prf phi_2]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   394
  | dnf_fm_prf (Atom v) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   395
  | dnf_fm_prf (Neg v) = PThm "all_conv";
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   396
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   397
fun of_alist A_ xs = foldr (fn (a, b) => update A_ a b) xs (emptya A_);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   398
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   399
fun deneg (true, LESS (x, y)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   400
  And (Atom (true, LEQ (x, y)), Atom (false, EQ (x, y)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   401
  | deneg (false, LESS (x, y)) = Atom (true, LEQ (y, x))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   402
  | deneg (false, LEQ (x, y)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   403
    And (Atom (true, LEQ (y, x)), Atom (false, EQ (y, x)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   404
  | deneg (false, EQ (v, vb)) = Atom (false, EQ (v, vb))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   405
  | deneg (v, EQ (vb, vc)) = Atom (v, EQ (vb, vc))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   406
  | deneg (true, LEQ (vb, vc)) = Atom (true, LEQ (vb, vc));
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   407
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   408
fun map_option f NONE = NONE
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   409
  | map_option f (SOME x2) = SOME (f x2);
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   410
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   411
fun from_conj_prf trm_of_atom p (And (a, b)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   412
  foldl (fn aa => fn ba => AppP (aa, ba)) (PThm "conjE")
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   413
    [Bound (trm_of_fm trm_of_atom (And (a, b))),
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   414
      AbsP (trm_of_fm trm_of_atom a,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   415
             AbsP (trm_of_fm trm_of_atom b,
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   416
                    from_conj_prf trm_of_atom (from_conj_prf trm_of_atom p b)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   417
                      a))]
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   418
  | from_conj_prf trm_of_atom p (Atom a) = p;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   419
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   420
fun contr_fm_prf trm_of_atom contr_atom_prf (Or (c, d)) =
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   421
  (case contr_fm_prf trm_of_atom contr_atom_prf c of NONE => NONE
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   422
    | SOME p1 =>
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   423
      map_option
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   424
        (fn p2 =>
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   425
          foldl (fn a => fn b => AppP (a, b)) (PThm "disjE")
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   426
            [Bound (trm_of_fm trm_of_atom (Or (c, d))),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   427
              AbsP (trm_of_fm trm_of_atom c, p1),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   428
              AbsP (trm_of_fm trm_of_atom d, p2)])
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   429
        (contr_fm_prf trm_of_atom contr_atom_prf d))
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   430
  | contr_fm_prf trm_of_atom contr_atom_prf (And (a, b)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   431
    (case contr_atom_prf (conj_list (And (a, b))) of NONE => NONE
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   432
      | SOME p => SOME (from_conj_prf trm_of_atom p (And (a, b))))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   433
  | contr_fm_prf trm_of_atom contr_atom_prf (Atom a) = contr_atom_prf [a];
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   434
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   435
fun deless (true, LESS (x, y)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   436
  And (Atom (true, LEQ (x, y)), Atom (false, EQ (x, y)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   437
  | deless (false, LESS (x, y)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   438
    Or (Atom (false, LEQ (x, y)), Atom (true, EQ (x, y)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   439
  | deless (false, EQ (v, vb)) = Atom (false, EQ (v, vb))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   440
  | deless (false, LEQ (v, vb)) = Atom (false, LEQ (v, vb))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   441
  | deless (v, EQ (vb, vc)) = Atom (v, EQ (vb, vc))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   442
  | deless (v, LEQ (vb, vc)) = Atom (v, LEQ (vb, vc));
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   443
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   444
fun fst (x1, x2) = x1;
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   445
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   446
fun snd (x1, x2) = x2;
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   447
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   448
fun deneg_prf (true, LESS (x, y)) = PThm "less_le"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   449
  | deneg_prf (false, LESS (x, y)) = PThm "nless_le"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   450
  | deneg_prf (false, LEQ (x, y)) = PThm "nle_le"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   451
  | deneg_prf (false, EQ (v, vb)) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   452
  | deneg_prf (v, EQ (vb, vc)) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   453
  | deneg_prf (true, LEQ (vb, vc)) = PThm "all_conv";
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   454
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   455
val one_nat : nat = Suc Zero_nat;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   456
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   457
fun deless_prf (true, LESS (x, y)) = PThm "less_le"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   458
  | deless_prf (false, LESS (x, y)) = PThm "nless_le"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   459
  | deless_prf (false, EQ (v, vb)) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   460
  | deless_prf (false, LEQ (v, vb)) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   461
  | deless_prf (v, EQ (vb, vc)) = PThm "all_conv"
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   462
  | deless_prf (v, LEQ (vb, vc)) = PThm "all_conv";
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   463
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   464
fun minus_nat (Suc m) (Suc n) = minus_nat m n
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   465
  | minus_nat Zero_nat n = Zero_nat
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   466
  | minus_nat m Zero_nat = m;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   467
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   468
fun relcomp1_mapping B_ (C1_, C2_) combine x y1 pxy pm pma =
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   469
  folda (linorder_prod C2_ C2_)
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   470
    (fn (y2, z) => fn pyz => fn pmb =>
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   471
      (if eq C1_ y1 y2 andalso not (eq C1_ y2 z)
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   472
        then update (linorder_prod B_ C2_) (x, z) (combine pxy pyz) pmb
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   473
        else pmb))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   474
    pm pma;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   475
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   476
fun relcomp_mapping (B1_, B2_) combine pm1 pm2 pma =
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   477
  folda (linorder_prod B2_ B2_)
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   478
    (fn (x, y) => fn pxy => fn pm =>
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   479
      (if eq B1_ x y then pm
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   480
        else relcomp1_mapping B2_ (B1_, B2_) combine x y pxy pm2 pm))
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   481
    pm1 pma;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   482
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   483
fun ntrancl_mapping (B1_, B2_) combine Zero_nat m = m
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   484
  | ntrancl_mapping (B1_, B2_) combine (Suc k) m =
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   485
    let
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   486
      val trclm = ntrancl_mapping (B1_, B2_) combine k m;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   487
    in
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   488
      relcomp_mapping (B1_, B2_) combine trclm m trclm
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   489
    end;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   490
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   491
fun trancl_mapping (B1_, B2_) combine m =
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   492
  ntrancl_mapping (B1_, B2_) combine
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   493
    (minus_nat (card (equal_prod B1_ B1_) (keysa (linorder_prod B2_ B2_) m))
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   494
      one_nat)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   495
    m;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   496
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   497
fun trm_of_order_atom (EQ (x, y)) = App (App (Const "eq", Var x), Var y)
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   498
  | trm_of_order_atom (LEQ (x, y)) = App (App (Const "le", Var x), Var y)
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   499
  | trm_of_order_atom (LESS (x, y)) = App (App (Const "lt", Var x), Var y);
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   500
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   501
fun trm_of_order_literal (true, a) = trm_of_order_atom a
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   502
  | trm_of_order_literal (false, a) = App (Const "Not", trm_of_order_atom a);
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   503
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   504
fun is_in_leq leqm l =
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   505
  (if equal_inta (fst l) (snd l) then SOME (Appt (PThm "refl", Var (fst l)))
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   506
    else lookupa (linorder_prod linorder_int linorder_int) leqm l);
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   507
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   508
fun is_in_eq leqm l =
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   509
  (case (is_in_leq leqm l, is_in_leq leqm (snd l, fst l)) of (NONE, _) => NONE
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   510
    | (SOME _, NONE) => NONE
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   511
    | (SOME p1, SOME p2) =>
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   512
      SOME (foldl (fn a => fn b => AppP (a, b)) (PThm "antisym") [p1, p2]));
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   513
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   514
fun contr1_list leqm (false, LEQ (x, y)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   515
  map_option
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   516
    (fn a =>
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   517
      AppP (AppP (PThm "contr",
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   518
                   Bound (trm_of_order_literal (false, LEQ (x, y)))),
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   519
             a))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   520
    (is_in_leq leqm (x, y))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   521
  | contr1_list leqm (false, EQ (x, y)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   522
    map_option
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   523
      (fn a =>
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   524
        AppP (AppP (PThm "contr",
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   525
                     Bound (trm_of_order_literal (false, EQ (x, y)))),
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   526
               a))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   527
      (is_in_eq leqm (x, y))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   528
  | contr1_list uu (true, va) = NONE
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   529
  | contr1_list uu (v, LESS (vb, vc)) = NONE;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   530
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   531
fun contr_list_aux leqm [] = NONE
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   532
  | contr_list_aux leqm (l :: ls) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   533
    (case contr1_list leqm l of NONE => contr_list_aux leqm ls
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   534
      | SOME a => SOME a);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   535
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   536
fun leq1_member_list (true, LEQ (x, y)) =
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   537
  [((x, y), Bound (trm_of_order_literal (true, LEQ (x, y))))]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   538
  | leq1_member_list (true, EQ (x, y)) =
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   539
    [((x, y),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   540
       AppP (PThm "eqD1", Bound (trm_of_order_literal (true, EQ (x, y))))),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   541
      ((y, x),
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   542
        AppP (PThm "eqD2", Bound (trm_of_order_literal (true, EQ (x, y)))))]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   543
  | leq1_member_list (false, va) = []
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   544
  | leq1_member_list (v, LESS (vb, vc)) = [];
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   545
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   546
fun leq1_list a = maps leq1_member_list a;
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   547
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   548
fun leq1_mapping a =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   549
  of_alist (linorder_prod linorder_int linorder_int) (leq1_list a);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   550
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   551
fun contr_list a =
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   552
  contr_list_aux
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   553
    (trancl_mapping (equal_int, linorder_int)
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   554
      (fn p1 => fn p2 =>
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   555
        foldl (fn aa => fn b => AppP (aa, b)) (PThm "trans") [p1, p2])
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   556
      (leq1_mapping a))
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   557
    a;
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   558
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   559
fun contr_prf atom_conv phi =
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   560
  contr_fm_prf trm_of_order_literal contr_list (dnf_fm (amap_fm atom_conv phi));
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   561
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   562
fun amap_f_m_prf ap (Atom a) = AppP (PThm "atom_conv", ap a)
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   563
  | amap_f_m_prf ap (And (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   564
    foldl (fn a => fn b => AppP (a, b)) (PThm "combination_conv")
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   565
      [AppP (PThm "arg_conv", amap_f_m_prf ap phi_1), amap_f_m_prf ap phi_2]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   566
  | amap_f_m_prf ap (Or (phi_1, phi_2)) =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   567
    foldl (fn a => fn b => AppP (a, b)) (PThm "combination_conv")
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   568
      [AppP (PThm "arg_conv", amap_f_m_prf ap phi_1), amap_f_m_prf ap phi_2]
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   569
  | amap_f_m_prf ap (Neg phi) = AppP (PThm "arg_conv", amap_f_m_prf ap phi);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   570
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   571
fun lo_contr_prf phi =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   572
  map_option
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   573
    ((fn a =>
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   574
       Conv (trm_of_fm trm_of_order_literal phi, amap_f_m_prf deneg_prf phi,
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   575
              a)) o
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   576
      (fn a =>
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   577
        Conv (trm_of_fm trm_of_order_literal (amap_fm deneg phi),
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   578
               dnf_fm_prf (amap_fm deneg phi), a)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   579
    (contr_prf deneg phi);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   580
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   581
fun po_contr_prf phi =
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   582
  map_option
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   583
    ((fn a =>
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   584
       Conv (trm_of_fm trm_of_order_literal phi, amap_f_m_prf deless_prf phi,
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   585
              a)) o
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   586
      (fn a =>
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   587
        Conv (trm_of_fm trm_of_order_literal (amap_fm deless phi),
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   588
               dnf_fm_prf (amap_fm deless phi), a)))
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   589
    (contr_prf deless phi);
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   590
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents:
diff changeset
   591
end; (*struct Order_Procedure*)
74625
e6f0c9bf966c order_tac: prevent potential bug, improve perf and tracing
Lukas Stevens <mail@lukas-stevens.de>
parents: 73526
diff changeset
   592