| author | wenzelm | 
| Mon, 04 Sep 2023 17:25:16 +0200 | |
| changeset 78646 | fff610f1a6f4 | 
| parent 74625 | e6f0c9bf966c | 
| permissions | -rw-r--r-- | 
| 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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
changeset | 11 | LESS of inta * inta | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
changeset | 422 | | SOME p1 => | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
changeset | 423 | map_option | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
changeset | 424 | (fn p2 => | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
changeset | 444 | fun fst (x1, x2) = x1; | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
changeset | 445 | |
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
changeset | 446 | fun snd (x1, x2) = x2; | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
changeset | 492 | ntrancl_mapping (B1_, B2_) combine | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
changeset | 500 | |
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
changeset | 510 | | (SOME _, NONE) => NONE | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
changeset | 511 | | (SOME p1, SOME p2) => | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
changeset | 517 | AppP (AppP (PThm "contr", | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
changeset | 524 | AppP (AppP (PThm "contr", | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
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: 
73526diff
changeset | 539 | [((x, y), | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
changeset | 541 | ((y, x), | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
changeset | 552 | contr_list_aux | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
changeset | 554 | (fn p1 => fn p2 => | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
changeset | 556 | (leq1_mapping a)) | 
| 
e6f0c9bf966c
order_tac: prevent potential bug, improve perf and tracing
 Lukas Stevens <mail@lukas-stevens.de> parents: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
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: 
73526diff
changeset | 592 |