| author | wenzelm | 
| Thu, 16 Jul 2009 20:15:57 +0200 | |
| changeset 32017 | e91a3acf8383 | 
| parent 30190 | 479806475f3c | 
| child 32215 | 87806301a813 | 
| permissions | -rw-r--r-- | 
| 29276 | 1 | (* Author: Oliver Kutter, TU Muenchen | 
| 2 | ||
| 3 | Transitivity reasoner for partial and linear orders. | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 4 | *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 5 | |
| 14445 | 6 | (* TODO: reduce number of input thms *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 7 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 8 | (* | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 9 | |
| 15103 
79846e8792eb
New transitivity reasoners for transitivity only and quasi orders.
 ballarin parents: 
15098diff
changeset | 10 | The package provides tactics partial_tac and linear_tac that use all | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 11 | premises of the form | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 12 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 13 | t = u, t ~= u, t < u, t <= u, ~(t < u) and ~(t <= u) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 14 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 15 | to | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 16 | 1. either derive a contradiction, | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 17 | in which case the conclusion can be any term, | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 18 | 2. or prove the conclusion, which must be of the same form as the | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 19 | premises (excluding ~(t < u) and ~(t <= u) for partial orders) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 20 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 21 | The package is not limited to the relation <= and friends. It can be | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 22 | instantiated to any partial and/or linear order --- for example, the | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 23 | divisibility relation "dvd". In order to instantiate the package for | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 24 | a partial order only, supply dummy theorems to the rules for linear | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 25 | orders, and don't use linear_tac! | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 26 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 27 | *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 28 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 29 | signature ORDER_TAC = | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 30 | sig | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 31 | (* Theorems required by the reasoner *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 32 | type less_arith | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 33 | val empty : thm -> less_arith | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 34 | val update : string -> thm -> less_arith -> less_arith | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 35 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 36 | (* Tactics *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 37 | val partial_tac: | 
| 24704 
9a95634ab135
Transitivity reasoner gets additional argument of premises to improve integration with simplifier.
 ballarin parents: 
24639diff
changeset | 38 | (theory -> term -> (term * string * term) option) -> less_arith -> thm list -> int -> tactic | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 39 | val linear_tac: | 
| 24704 
9a95634ab135
Transitivity reasoner gets additional argument of premises to improve integration with simplifier.
 ballarin parents: 
24639diff
changeset | 40 | (theory -> term -> (term * string * term) option) -> less_arith -> thm list -> int -> tactic | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 41 | end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 42 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 43 | structure Order_Tac: ORDER_TAC = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 44 | struct | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 45 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 46 | (* Record to handle input theorems in a convenient way. *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 47 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 48 | type less_arith = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 49 |   {
 | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 50 | (* Theorems for partial orders *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 51 | less_reflE: thm, (* x < x ==> P *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 52 | le_refl: thm, (* x <= x *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 53 | less_imp_le: thm, (* x < y ==> x <= y *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 54 | eqI: thm, (* [| x <= y; y <= x |] ==> x = y *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 55 | eqD1: thm, (* x = y ==> x <= y *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 56 | eqD2: thm, (* x = y ==> y <= x *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 57 | less_trans: thm, (* [| x < y; y < z |] ==> x < z *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 58 | less_le_trans: thm, (* [| x < y; y <= z |] ==> x < z *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 59 | le_less_trans: thm, (* [| x <= y; y < z |] ==> x < z *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 60 | le_trans: thm, (* [| x <= y; y <= z |] ==> x <= z *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 61 | le_neq_trans : thm, (* [| x <= y ; x ~= y |] ==> x < y *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 62 | neq_le_trans : thm, (* [| x ~= y ; x <= y |] ==> x < y *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 63 | not_sym : thm, (* x ~= y ==> y ~= x *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 64 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 65 | (* Additional theorems for linear orders *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 66 | not_lessD: thm, (* ~(x < y) ==> y <= x *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 67 | not_leD: thm, (* ~(x <= y) ==> y < x *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 68 | not_lessI: thm, (* y <= x ==> ~(x < y) *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 69 | not_leI: thm, (* y < x ==> ~(x <= y) *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 70 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 71 | (* Additional theorems for subgoals of form x ~= y *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 72 | less_imp_neq : thm, (* x < y ==> x ~= y *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 73 | eq_neq_eq_imp_neq : thm (* [| x = u ; u ~= v ; v = z|] ==> x ~= z *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 74 | } | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 75 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 76 | fun empty dummy_thm = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 77 |     {less_reflE= dummy_thm, le_refl= dummy_thm, less_imp_le= dummy_thm, eqI= dummy_thm,
 | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 78 | eqD1= dummy_thm, eqD2= dummy_thm, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 79 | less_trans= dummy_thm, less_le_trans= dummy_thm, le_less_trans= dummy_thm, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 80 | le_trans= dummy_thm, le_neq_trans = dummy_thm, neq_le_trans = dummy_thm, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 81 | not_sym = dummy_thm, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 82 | not_lessD= dummy_thm, not_leD= dummy_thm, not_lessI= dummy_thm, not_leI= dummy_thm, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 83 | less_imp_neq = dummy_thm, eq_neq_eq_imp_neq = dummy_thm} | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 84 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 85 | fun change thms f = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 86 | let | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 87 |     val {less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans,
 | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 88 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 89 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 90 | eq_neq_eq_imp_neq} = thms; | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 91 | val (less_reflE', le_refl', less_imp_le', eqI', eqD1', eqD2', less_trans', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 92 | less_le_trans', le_less_trans', le_trans', le_neq_trans', neq_le_trans', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 93 | not_sym', not_lessD', not_leD', not_lessI', not_leI', less_imp_neq', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 94 | eq_neq_eq_imp_neq') = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 95 | f (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 96 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 97 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 98 | eq_neq_eq_imp_neq) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 99 |   in {less_reflE = less_reflE', le_refl= le_refl',
 | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 100 | less_imp_le = less_imp_le', eqI = eqI', eqD1 = eqD1', eqD2 = eqD2', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 101 | less_trans = less_trans', less_le_trans = less_le_trans', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 102 | le_less_trans = le_less_trans', le_trans = le_trans', le_neq_trans = le_neq_trans', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 103 | neq_le_trans = neq_le_trans', not_sym = not_sym', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 104 | not_lessD = not_lessD', not_leD = not_leD', not_lessI = not_lessI', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 105 | not_leI = not_leI', | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 106 | less_imp_neq = less_imp_neq', eq_neq_eq_imp_neq = eq_neq_eq_imp_neq'} | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 107 | end; | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 108 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 109 | fun update "less_reflE" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 110 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 111 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 112 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 113 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 114 | (thm, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 115 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 116 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 117 | | update "le_refl" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 118 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 119 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 120 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 121 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 122 | (less_reflE, thm, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 123 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 124 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 125 | | update "less_imp_le" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 126 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 127 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 128 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 129 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 130 | (less_reflE, le_refl, thm, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 131 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 132 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 133 | | update "eqI" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 134 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 135 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 136 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 137 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 138 | (less_reflE, le_refl, less_imp_le, thm, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 139 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 140 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 141 | | update "eqD1" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 142 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 143 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 144 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 145 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 146 | (less_reflE, le_refl, less_imp_le, eqI, thm, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 147 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 148 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 149 | | update "eqD2" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 150 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 151 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 152 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 153 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 154 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, thm, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 155 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 156 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 157 | | update "less_trans" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 158 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 159 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 160 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 161 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 162 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, thm, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 163 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 164 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 165 | | update "less_le_trans" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 166 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 167 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 168 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 169 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 170 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 171 | thm, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 172 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 173 | | update "le_less_trans" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 174 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 175 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 176 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 177 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 178 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 179 | less_le_trans, thm, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 180 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 181 | | update "le_trans" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 182 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 183 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 184 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 185 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 186 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 187 | less_le_trans, le_less_trans, thm, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 188 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 189 | | update "le_neq_trans" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 190 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 191 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 192 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 193 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 194 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 195 | less_le_trans, le_less_trans, le_trans, thm, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 196 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 197 | | update "neq_le_trans" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 198 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 199 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 200 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 201 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 202 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 203 | less_le_trans, le_less_trans, le_trans, le_neq_trans, thm, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 204 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 205 | | update "not_sym" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 206 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 207 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 208 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 209 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 210 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 211 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 212 | thm, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 213 | | update "not_lessD" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 214 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 215 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 216 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 217 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 218 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 219 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 220 | not_sym, thm, not_leD, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 221 | | update "not_leD" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 222 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 223 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 224 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 225 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 226 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 227 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 228 | not_sym, not_lessD, thm, not_lessI, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 229 | | update "not_lessI" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 230 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 231 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 232 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 233 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 234 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 235 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 236 | not_sym, not_lessD, not_leD, thm, not_leI, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 237 | | update "not_leI" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 238 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 239 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 240 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 241 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 242 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 243 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 244 | not_sym, not_lessD, not_leD, not_lessI, thm, less_imp_neq, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 245 | | update "less_imp_neq" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 246 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 247 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 248 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 249 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 250 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 251 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 252 | not_sym, not_lessD, not_leD, not_lessI, not_leI, thm, eq_neq_eq_imp_neq)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 253 | | update "eq_neq_eq_imp_neq" thm thms = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 254 | change thms (fn (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 255 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 256 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 257 | eq_neq_eq_imp_neq) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 258 | (less_reflE, le_refl, less_imp_le, eqI, eqD1, eqD2, less_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 259 | less_le_trans, le_less_trans, le_trans, le_neq_trans, neq_le_trans, | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 260 | not_sym, not_lessD, not_leD, not_lessI, not_leI, less_imp_neq, thm)); | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 261 | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 262 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 263 | (* Extract subgoal with signature *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 264 | fun SUBGOAL goalfun i st = | 
| 22578 | 265 | goalfun (List.nth(prems_of st, i-1), i, Thm.theory_of_thm st) st | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 266 | handle Subscript => Seq.empty; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 267 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 268 | (* Internal datatype for the proof *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 269 | datatype proof | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 270 | = Asm of int | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 271 | | Thm of proof list * thm; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 272 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 273 | exception Cannot; | 
| 14445 | 274 | (* Internal exception, raised if conclusion cannot be derived from | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 275 | assumptions. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 276 | exception Contr of proof; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 277 | (* Internal exception, raised if contradiction ( x < x ) was derived *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 278 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 279 | fun prove asms = | 
| 15570 | 280 | let fun pr (Asm i) = List.nth (asms, i) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 281 | | pr (Thm (prfs, thm)) = (map pr prfs) MRS thm | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 282 | in pr end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 283 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 284 | (* Internal datatype for inequalities *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 285 | datatype less | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 286 | = Less of term * term * proof | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 287 | | Le of term * term * proof | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 288 | | NotEq of term * term * proof; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 289 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 290 | (* Misc functions for datatype less *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 291 | fun lower (Less (x, _, _)) = x | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 292 | | lower (Le (x, _, _)) = x | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 293 | | lower (NotEq (x,_,_)) = x; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 294 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 295 | fun upper (Less (_, y, _)) = y | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 296 | | upper (Le (_, y, _)) = y | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 297 | | upper (NotEq (_,y,_)) = y; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 298 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 299 | fun getprf (Less (_, _, p)) = p | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 300 | | getprf (Le (_, _, p)) = p | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 301 | | getprf (NotEq (_,_, p)) = p; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 302 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 303 | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 304 | (* ************************************************************************ *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 305 | (* *) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 306 | (* mkasm_partial *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 307 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 308 | (* Tuple (t, n) (t an assumption, n its index in the assumptions) is *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 309 | (* translated to an element of type less. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 310 | (* Partial orders only. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 311 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 312 | (* ************************************************************************ *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 313 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 314 | fun mkasm_partial decomp (less_thms : less_arith) sign (t, n) = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 315 | case decomp sign t of | 
| 15531 | 316 | SOME (x, rel, y) => (case rel of | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 317 | "<" => if (x aconv y) then raise Contr (Thm ([Asm n], #less_reflE less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 318 | else [Less (x, y, Asm n)] | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 319 | | "~<" => [] | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 320 | | "<=" => [Le (x, y, Asm n)] | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 321 | | "~<=" => [] | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 322 | | "=" => [Le (x, y, Thm ([Asm n], #eqD1 less_thms)), | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 323 | Le (y, x, Thm ([Asm n], #eqD2 less_thms))] | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 324 | | "~=" => if (x aconv y) then | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 325 | raise Contr (Thm ([(Thm ([(Thm ([], #le_refl less_thms)) ,(Asm n)], #le_neq_trans less_thms))], #less_reflE less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 326 | else [ NotEq (x, y, Asm n), | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 327 | NotEq (y, x,Thm ( [Asm n], #not_sym less_thms))] | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 328 |     | _     => error ("partial_tac: unknown relation symbol ``" ^ rel ^
 | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 329 | "''returned by decomp.")) | 
| 15531 | 330 | | NONE => []; | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 331 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 332 | (* ************************************************************************ *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 333 | (* *) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 334 | (* mkasm_linear *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 335 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 336 | (* Tuple (t, n) (t an assumption, n its index in the assumptions) is *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 337 | (* translated to an element of type less. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 338 | (* Linear orders only. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 339 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 340 | (* ************************************************************************ *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 341 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 342 | fun mkasm_linear decomp (less_thms : less_arith) sign (t, n) = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 343 | case decomp sign t of | 
| 15531 | 344 | SOME (x, rel, y) => (case rel of | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 345 | "<" => if (x aconv y) then raise Contr (Thm ([Asm n], #less_reflE less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 346 | else [Less (x, y, Asm n)] | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 347 | | "~<" => [Le (y, x, Thm ([Asm n], #not_lessD less_thms))] | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 348 | | "<=" => [Le (x, y, Asm n)] | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 349 | | "~<=" => if (x aconv y) then | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 350 | raise (Contr (Thm ([Thm ([Asm n], #not_leD less_thms)], #less_reflE less_thms))) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 351 | else [Less (y, x, Thm ([Asm n], #not_leD less_thms))] | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 352 | | "=" => [Le (x, y, Thm ([Asm n], #eqD1 less_thms)), | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 353 | Le (y, x, Thm ([Asm n], #eqD2 less_thms))] | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 354 | | "~=" => if (x aconv y) then | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 355 | raise Contr (Thm ([(Thm ([(Thm ([], #le_refl less_thms)) ,(Asm n)], #le_neq_trans less_thms))], #less_reflE less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 356 | else [ NotEq (x, y, Asm n), | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 357 | NotEq (y, x,Thm ( [Asm n], #not_sym less_thms))] | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 358 |     | _     => error ("linear_tac: unknown relation symbol ``" ^ rel ^
 | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 359 | "''returned by decomp.")) | 
| 15531 | 360 | | NONE => []; | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 361 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 362 | (* ************************************************************************ *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 363 | (* *) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 364 | (* mkconcl_partial *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 365 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 366 | (* Translates conclusion t to an element of type less. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 367 | (* Partial orders only. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 368 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 369 | (* ************************************************************************ *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 370 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 371 | fun mkconcl_partial decomp (less_thms : less_arith) sign t = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 372 | case decomp sign t of | 
| 15531 | 373 | SOME (x, rel, y) => (case rel of | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 374 | "<" => ([Less (x, y, Asm ~1)], Asm 0) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 375 | | "<=" => ([Le (x, y, Asm ~1)], Asm 0) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 376 | | "=" => ([Le (x, y, Asm ~1), Le (y, x, Asm ~1)], | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 377 | Thm ([Asm 0, Asm 1], #eqI less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 378 | | "~=" => ([NotEq (x,y, Asm ~1)], Asm 0) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 379 | | _ => raise Cannot) | 
| 15531 | 380 | | NONE => raise Cannot; | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 381 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 382 | (* ************************************************************************ *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 383 | (* *) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 384 | (* mkconcl_linear *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 385 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 386 | (* Translates conclusion t to an element of type less. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 387 | (* Linear orders only. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 388 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 389 | (* ************************************************************************ *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 390 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 391 | fun mkconcl_linear decomp (less_thms : less_arith) sign t = | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 392 | case decomp sign t of | 
| 15531 | 393 | SOME (x, rel, y) => (case rel of | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 394 | "<" => ([Less (x, y, Asm ~1)], Asm 0) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 395 | | "~<" => ([Le (y, x, Asm ~1)], Thm ([Asm 0], #not_lessI less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 396 | | "<=" => ([Le (x, y, Asm ~1)], Asm 0) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 397 | | "~<=" => ([Less (y, x, Asm ~1)], Thm ([Asm 0], #not_leI less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 398 | | "=" => ([Le (x, y, Asm ~1), Le (y, x, Asm ~1)], | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 399 | Thm ([Asm 0, Asm 1], #eqI less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 400 | | "~=" => ([NotEq (x,y, Asm ~1)], Asm 0) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 401 | | _ => raise Cannot) | 
| 15531 | 402 | | NONE => raise Cannot; | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 403 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 404 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 405 | (*** The common part for partial and linear orders ***) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 406 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 407 | (* Analysis of premises and conclusion: *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 408 | (* decomp (`x Rel y') should yield (x, Rel, y) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 409 | where Rel is one of "<", "<=", "~<", "~<=", "=" and "~=", | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 410 | other relation symbols cause an error message *) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 411 | |
| 26834 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 berghofe parents: 
24704diff
changeset | 412 | fun gen_order_tac mkasm mkconcl decomp' (less_thms : less_arith) prems = | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 413 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 414 | let | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 415 | |
| 26834 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 berghofe parents: 
24704diff
changeset | 416 | fun decomp sign t = Option.map (fn (x, rel, y) => | 
| 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 berghofe parents: 
24704diff
changeset | 417 | (Envir.beta_eta_contract x, rel, Envir.beta_eta_contract y)) (decomp' sign t); | 
| 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 berghofe parents: 
24704diff
changeset | 418 | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 419 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 420 | (* *) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 421 | (* mergeLess *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 422 | (* *) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 423 | (* Merge two elements of type less according to the following rules *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 424 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 425 | (* x < y && y < z ==> x < z *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 426 | (* x < y && y <= z ==> x < z *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 427 | (* x <= y && y < z ==> x < z *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 428 | (* x <= y && y <= z ==> x <= z *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 429 | (* x <= y && x ~= y ==> x < y *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 430 | (* x ~= y && x <= y ==> x < y *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 431 | (* x < y && x ~= y ==> x < y *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 432 | (* x ~= y && x < y ==> x < y *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 433 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 434 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 435 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 436 | fun mergeLess (Less (x, _, p) , Less (_ , z, q)) = | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 437 | Less (x, z, Thm ([p,q] , #less_trans less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 438 | | mergeLess (Less (x, _, p) , Le (_ , z, q)) = | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 439 | Less (x, z, Thm ([p,q] , #less_le_trans less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 440 | | mergeLess (Le (x, _, p) , Less (_ , z, q)) = | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 441 | Less (x, z, Thm ([p,q] , #le_less_trans less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 442 | | mergeLess (Le (x, z, p) , NotEq (x', z', q)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 443 | if (x aconv x' andalso z aconv z' ) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 444 | then Less (x, z, Thm ([p,q] , #le_neq_trans less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 445 | else error "linear/partial_tac: internal error le_neq_trans" | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 446 | | mergeLess (NotEq (x, z, p) , Le (x' , z', q)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 447 | if (x aconv x' andalso z aconv z') | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 448 | then Less (x, z, Thm ([p,q] , #neq_le_trans less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 449 | else error "linear/partial_tac: internal error neq_le_trans" | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 450 | | mergeLess (NotEq (x, z, p) , Less (x' , z', q)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 451 | if (x aconv x' andalso z aconv z') | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 452 | then Less ((x' , z', q)) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 453 | else error "linear/partial_tac: internal error neq_less_trans" | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 454 | | mergeLess (Less (x, z, p) , NotEq (x', z', q)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 455 | if (x aconv x' andalso z aconv z') | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 456 | then Less (x, z, p) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 457 | else error "linear/partial_tac: internal error less_neq_trans" | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 458 | | mergeLess (Le (x, _, p) , Le (_ , z, q)) = | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 459 | Le (x, z, Thm ([p,q] , #le_trans less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 460 | | mergeLess (_, _) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 461 | error "linear/partial_tac: internal error: undefined case"; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 462 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 463 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 464 | (* ******************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 465 | (* tr checks for valid transitivity step *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 466 | (* ******************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 467 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 468 | infix tr; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 469 | fun (Less (_, y, _)) tr (Le (x', _, _)) = ( y aconv x' ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 470 | | (Le (_, y, _)) tr (Less (x', _, _)) = ( y aconv x' ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 471 | | (Less (_, y, _)) tr (Less (x', _, _)) = ( y aconv x' ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 472 | | (Le (_, y, _)) tr (Le (x', _, _)) = ( y aconv x' ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 473 | | _ tr _ = false; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 474 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 475 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 476 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 477 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 478 | (* transPath (Lesslist, Less): (less list * less) -> less *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 479 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 480 | (* If a path represented by a list of elements of type less is found, *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 481 | (* this needs to be contracted to a single element of type less. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 482 | (* Prior to each transitivity step it is checked whether the step is *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 483 | (* valid. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 484 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 485 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 486 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 487 | fun transPath ([],lesss) = lesss | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 488 | | transPath (x::xs,lesss) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 489 | if lesss tr x then transPath (xs, mergeLess(lesss,x)) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 490 | else error "linear/partial_tac: internal error transpath"; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 491 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 492 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 493 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 494 | (* less1 subsumes less2 : less -> less -> bool *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 495 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 496 | (* subsumes checks whether less1 implies less2 *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 497 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 498 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 499 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 500 | infix subsumes; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 501 | fun (Less (x, y, _)) subsumes (Le (x', y', _)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 502 | (x aconv x' andalso y aconv y') | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 503 | | (Less (x, y, _)) subsumes (Less (x', y', _)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 504 | (x aconv x' andalso y aconv y') | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 505 | | (Le (x, y, _)) subsumes (Le (x', y', _)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 506 | (x aconv x' andalso y aconv y') | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 507 | | (Less (x, y, _)) subsumes (NotEq (x', y', _)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 508 | (x aconv x' andalso y aconv y') orelse (y aconv x' andalso x aconv y') | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 509 | | (NotEq (x, y, _)) subsumes (NotEq (x', y', _)) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 510 | (x aconv x' andalso y aconv y') orelse (y aconv x' andalso x aconv y') | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 511 | | (Le _) subsumes (Less _) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 512 | error "linear/partial_tac: internal error: Le cannot subsume Less" | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 513 | | _ subsumes _ = false; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 514 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 515 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 516 | (* *) | 
| 15531 | 517 | (* triv_solv less1 : less -> proof option *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 518 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 519 | (* Solves trivial goal x <= x. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 520 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 521 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 522 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 523 | fun triv_solv (Le (x, x', _)) = | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 524 | if x aconv x' then SOME (Thm ([], #le_refl less_thms)) | 
| 15531 | 525 | else NONE | 
| 526 | | triv_solv _ = NONE; | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 527 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 528 | (* ********************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 529 | (* Graph functions *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 530 | (* ********************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 531 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 532 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 533 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 534 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 535 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 536 | (* General: *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 537 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 538 | (* Inequalities are represented by various types of graphs. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 539 | (* *) | 
| 14445 | 540 | (* 1. (Term.term * (Term.term * less) list) list *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 541 | (* - Graph of this type is generated from the assumptions, *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 542 | (* it does contain information on which edge stems from which *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 543 | (* assumption. *) | 
| 14445 | 544 | (* - Used to compute strongly connected components *) | 
| 545 | (* - Used to compute component subgraphs *) | |
| 546 | (* - Used for component subgraphs to reconstruct paths in components*) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 547 | (* *) | 
| 14445 | 548 | (* 2. (int * (int * less) list ) list *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 549 | (* - Graph of this type is generated from the strong components of *) | 
| 14445 | 550 | (* graph of type 1. It consists of the strong components of *) | 
| 551 | (* graph 1, where nodes are indices of the components. *) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 552 | (* Only edges between components are part of this graph. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 553 | (* - Used to reconstruct paths between several components. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 554 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 555 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 556 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 557 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 558 | (* *********************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 559 | (* Functions for constructing graphs *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 560 | (* *********************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 561 | |
| 14445 | 562 | fun addEdge (v,d,[]) = [(v,d)] | 
| 563 | | addEdge (v,d,((u,dl)::el)) = if v aconv u then ((v,d@dl)::el) | |
| 564 | else (u,dl):: (addEdge(v,d,el)); | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 565 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 566 | (* ********************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 567 | (* *) | 
| 14445 | 568 | (* mkGraphs constructs from a list of objects of type less a graph g, *) | 
| 569 | (* by taking all edges that are candidate for a <=, and a list neqE, by *) | |
| 570 | (* taking all edges that are candiate for a ~= *) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 571 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 572 | (* ********************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 573 | |
| 14445 | 574 | fun mkGraphs [] = ([],[],[]) | 
| 575 | | mkGraphs lessList = | |
| 576 | let | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 577 | |
| 14445 | 578 | fun buildGraphs ([],leqG,neqG,neqE) = (leqG, neqG, neqE) | 
| 579 | | buildGraphs (l::ls, leqG,neqG, neqE) = case l of | |
| 580 | (Less (x,y,p)) => | |
| 581 | buildGraphs (ls, addEdge (x,[(y,(Less (x, y, p)))],leqG) , | |
| 582 | addEdge (x,[(y,(Less (x, y, p)))],neqG), l::neqE) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 583 | | (Le (x,y,p)) => | 
| 14445 | 584 | buildGraphs (ls, addEdge (x,[(y,(Le (x, y,p)))],leqG) , neqG, neqE) | 
| 585 | | (NotEq (x,y,p)) => | |
| 586 | buildGraphs (ls, leqG , addEdge (x,[(y,(NotEq (x, y, p)))],neqG), l::neqE) ; | |
| 587 | ||
| 588 | in buildGraphs (lessList, [], [], []) end; | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 589 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 590 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 591 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 592 | (* *) | 
| 14445 | 593 | (* adjacent g u : (''a * 'b list ) list -> ''a -> 'b list                  *)
 | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 594 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 595 | (* List of successors of u in graph g *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 596 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 597 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 598 | |
| 14445 | 599 | fun adjacent eq_comp ((v,adj)::el) u = | 
| 600 | if eq_comp (u, v) then adj else adjacent eq_comp el u | |
| 601 | | adjacent _ [] _ = [] | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 602 | |
| 14445 | 603 | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 604 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 605 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 606 | (* transpose g: *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 607 | (* (''a * ''a list) list -> (''a * ''a list) list                          *)
 | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 608 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 609 | (* Computes transposed graph g' from g *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 610 | (* by reversing all edges u -> v to v -> u *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 611 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 612 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 613 | |
| 14445 | 614 | fun transpose eq_comp g = | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 615 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 616 | (* Compute list of reversed edges for each adjacency list *) | 
| 14445 | 617 | fun flip (u,(v,l)::el) = (v,(u,l)) :: flip (u,el) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 618 | | flip (_,nil) = nil | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 619 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 620 | (* Compute adjacency list for node u from the list of edges | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 621 | and return a likewise reduced list of edges. The list of edges | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 622 | is searches for edges starting from u, and these edges are removed. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 623 | fun gather (u,(v,w)::el) = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 624 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 625 | val (adj,edges) = gather (u,el) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 626 | in | 
| 14445 | 627 | if eq_comp (u, v) then (w::adj,edges) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 628 | else (adj,(v,w)::edges) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 629 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 630 | | gather (_,nil) = (nil,nil) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 631 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 632 | (* For every node in the input graph, call gather to find all reachable | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 633 | nodes in the list of edges *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 634 | fun assemble ((u,_)::el) edges = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 635 | let val (adj,edges) = gather (u,edges) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 636 | in (u,adj) :: assemble el edges | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 637 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 638 | | assemble nil _ = nil | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 639 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 640 | (* Compute, for each adjacency list, the list with reversed edges, | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 641 | and concatenate these lists. *) | 
| 30190 | 642 | val flipped = List.foldr (op @) nil (map flip g) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 643 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 644 | in assemble g flipped end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 645 | |
| 14445 | 646 | (* *********************************************************************** *) | 
| 647 | (* *) | |
| 648 | (* scc_term : (term * term list) list -> term list list *) | |
| 649 | (* *) | |
| 650 | (* The following is based on the algorithm for finding strongly connected *) | |
| 651 | (* components described in Introduction to Algorithms, by Cormon, Leiserson*) | |
| 652 | (* and Rivest, section 23.5. The input G is an adjacency list description *) | |
| 653 | (* of a directed graph. The output is a list of the strongly connected *) | |
| 654 | (* components (each a list of vertices). *) | |
| 655 | (* *) | |
| 656 | (* *) | |
| 657 | (* *********************************************************************** *) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 658 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 659 | fun scc_term G = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 660 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 661 | (* Ordered list of the vertices that DFS has finished with; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 662 | most recently finished goes at the head. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 663 | val finish : term list ref = ref nil | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 664 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 665 | (* List of vertices which have been visited. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 666 | val visited : term list ref = ref nil | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 667 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 668 | fun been_visited v = exists (fn w => w aconv v) (!visited) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 669 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 670 | (* Given the adjacency list rep of a graph (a list of pairs), | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 671 | return just the first element of each pair, yielding the | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 672 | vertex list. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 673 | val members = map (fn (v,_) => v) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 674 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 675 | (* Returns the nodes in the DFS tree rooted at u in g *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 676 | fun dfs_visit g u : term list = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 677 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 678 | val _ = visited := u :: !visited | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 679 | val descendents = | 
| 30190 | 680 | List.foldr (fn ((v,l),ds) => if been_visited v then ds | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 681 | else v :: dfs_visit g v @ ds) | 
| 15574 
b1d1b5bfc464
Removed practically all references to Library.foldr.
 skalberg parents: 
15570diff
changeset | 682 | nil (adjacent (op aconv) g u) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 683 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 684 | finish := u :: !finish; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 685 | descendents | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 686 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 687 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 688 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 689 | (* DFS on the graph; apply dfs_visit to each vertex in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 690 | the graph, checking first to make sure the vertex is | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 691 | as yet unvisited. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 692 | app (fn u => if been_visited u then () | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 693 | else (dfs_visit G u; ())) (members G); | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 694 | visited := nil; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 695 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 696 | (* We don't reset finish because its value is used by | 
| 14445 | 697 | foldl below, and it will never be used again (even | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 698 | though dfs_visit will continue to modify it). *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 699 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 700 | (* DFS on the transpose. The vertices returned by | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 701 | dfs_visit along with u form a connected component. We | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 702 | collect all the connected components together in a | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 703 | list, which is what is returned. *) | 
| 15570 | 704 | Library.foldl (fn (comps,u) => | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 705 | if been_visited u then comps | 
| 14445 | 706 | else ((u :: dfs_visit (transpose (op aconv) G) u) :: comps)) (nil,(!finish)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 707 | end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 708 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 709 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 710 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 711 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 712 | (* dfs_int_reachable g u: *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 713 | (* (int * int list) list -> int -> int list *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 714 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 715 | (* Computes list of all nodes reachable from u in g. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 716 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 717 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 718 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 719 | fun dfs_int_reachable g u = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 720 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 721 | (* List of vertices which have been visited. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 722 | val visited : int list ref = ref nil | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 723 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 724 | fun been_visited v = exists (fn w => w = v) (!visited) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 725 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 726 | fun dfs_visit g u : int list = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 727 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 728 | val _ = visited := u :: !visited | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 729 | val descendents = | 
| 30190 | 730 | List.foldr (fn ((v,l),ds) => if been_visited v then ds | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 731 | else v :: dfs_visit g v @ ds) | 
| 15574 
b1d1b5bfc464
Removed practically all references to Library.foldr.
 skalberg parents: 
15570diff
changeset | 732 | nil (adjacent (op =) g u) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 733 | in descendents end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 734 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 735 | in u :: dfs_visit g u end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 736 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 737 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 738 | fun indexComps components = | 
| 14445 | 739 | ListPair.map (fn (a,b) => (a,b)) (0 upto (length components -1), components); | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 740 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 741 | fun indexNodes IndexComp = | 
| 15570 | 742 | List.concat (map (fn (index, comp) => (map (fn v => (v,index)) comp)) IndexComp); | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 743 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 744 | fun getIndex v [] = ~1 | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 745 | | getIndex v ((v',k)::vs) = if v aconv v' then k else getIndex v vs; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 746 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 747 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 748 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 749 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 750 | (* *) | 
| 14445 | 751 | (* dfs eq_comp g u v: *) | 
| 752 | (* ('a * 'a -> bool) -> ('a  *( 'a * less) list) list ->                   *)
 | |
| 753 | (* 'a -> 'a -> (bool * ('a * less) list)                                   *) 
 | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 754 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 755 | (* Depth first search of v from u. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 756 | (* Returns (true, path(u, v)) if successful, otherwise (false, []). *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 757 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 758 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 759 | |
| 14445 | 760 | fun dfs eq_comp g u v = | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 761 | let | 
| 14445 | 762 | val pred = ref nil; | 
| 763 | val visited = ref nil; | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 764 | |
| 14445 | 765 | fun been_visited v = exists (fn w => eq_comp (w, v)) (!visited) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 766 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 767 | fun dfs_visit u' = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 768 | let val _ = visited := u' :: (!visited) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 769 | |
| 14445 | 770 | fun update (x,l) = let val _ = pred := (x,l) ::(!pred) in () end; | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 771 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 772 | in if been_visited v then () | 
| 14445 | 773 | else (app (fn (v',l) => if been_visited v' then () else ( | 
| 774 | update (v',l); | |
| 775 | dfs_visit v'; ()) )) (adjacent eq_comp g u') | |
| 776 | end | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 777 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 778 | dfs_visit u; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 779 | if (been_visited v) then (true, (!pred)) else (false , []) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 780 | end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 781 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 782 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 783 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 784 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 785 | (* completeTermPath u v g: *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 786 | (* Term.term -> Term.term -> (Term.term * (Term.term * less) list) list *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 787 | (* -> less list *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 788 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 789 | (* Complete the path from u to v in graph g. Path search is performed *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 790 | (* with dfs_term g u v. This yields for each node v' its predecessor u' *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 791 | (* and the edge u' -> v'. Allows traversing graph backwards from v and *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 792 | (* finding the path u -> v. *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 793 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 794 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 795 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 796 | |
| 14445 | 797 | fun completeTermPath u v g = | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 798 | let | 
| 14445 | 799 | val (found, tmp) = dfs (op aconv) g u v ; | 
| 800 | val pred = map snd tmp; | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 801 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 802 | fun path x y = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 803 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 804 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 805 | (* find predecessor u of node v and the edge u -> v *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 806 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 807 | fun lookup v [] = raise Cannot | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 808 | | lookup v (e::es) = if (upper e) aconv v then e else lookup v es; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 809 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 810 | (* traverse path backwards and return list of visited edges *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 811 | fun rev_path v = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 812 | let val l = lookup v pred | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 813 | val u = lower l; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 814 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 815 | if u aconv x then [l] | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 816 | else (rev_path u) @ [l] | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 817 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 818 | in rev_path y end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 819 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 820 | in | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 821 | if found then (if u aconv v then [(Le (u, v, (Thm ([], #le_refl less_thms))))] | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 822 | else path u v ) else raise Cannot | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 823 | end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 824 | |
| 14445 | 825 | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 826 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 827 | (* *) | 
| 14445 | 828 | (* findProof (sccGraph, neqE, ntc, sccSubgraphs) subgoal: *) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 829 | (* *) | 
| 14445 | 830 | (* (int * (int * less) list) list * less list * (Term.term * int) list *) | 
| 831 | (* * ((term * (term * less) list) list) list -> Less -> proof *) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 832 | (* *) | 
| 14445 | 833 | (* findProof constructs from graphs (sccGraph, sccSubgraphs) and neqE a *) | 
| 834 | (* proof for subgoal. Raises exception Cannot if this is not possible. *) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 835 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 836 | (* *********************************************************************** *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 837 | |
| 14445 | 838 | fun findProof (sccGraph, neqE, ntc, sccSubgraphs) subgoal = | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 839 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 840 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 841 | (* complete path x y from component graph *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 842 | fun completeComponentPath x y predlist = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 843 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 844 | val xi = getIndex x ntc | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 845 | val yi = getIndex y ntc | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 846 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 847 | fun lookup k [] = raise Cannot | 
| 23577 | 848 | | lookup k ((h: int,l)::us) = if k = h then l else lookup k us; | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 849 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 850 | fun rev_completeComponentPath y' = | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 851 | let val edge = lookup (getIndex y' ntc) predlist | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 852 | val u = lower edge | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 853 | val v = upper edge | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 854 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 855 | if (getIndex u ntc) = xi then | 
| 15570 | 856 | (completeTermPath x u (List.nth(sccSubgraphs, xi)) )@[edge] | 
| 857 | @(completeTermPath v y' (List.nth(sccSubgraphs, getIndex y' ntc)) ) | |
| 14445 | 858 | else (rev_completeComponentPath u)@[edge] | 
| 15570 | 859 | @(completeTermPath v y' (List.nth(sccSubgraphs, getIndex y' ntc)) ) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 860 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 861 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 862 | if x aconv y then | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 863 | [(Le (x, y, (Thm ([], #le_refl less_thms))))] | 
| 15570 | 864 | else ( if xi = yi then completeTermPath x y (List.nth(sccSubgraphs, xi)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 865 | else rev_completeComponentPath y ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 866 | end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 867 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 868 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 869 | (* findLess e x y xi yi xreachable yreachable *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 870 | (* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 871 | (* Find a path from x through e to y, of weight < *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 872 | (* ******************************************************************* *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 873 | |
| 14445 | 874 | fun findLess e x y xi yi xreachable yreachable = | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 875 | let val u = lower e | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 876 | val v = upper e | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 877 | val ui = getIndex u ntc | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 878 | val vi = getIndex v ntc | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 879 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 880 | in | 
| 14445 | 881 | if ui mem xreachable andalso vi mem xreachable andalso | 
| 882 | ui mem yreachable andalso vi mem yreachable then ( | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 883 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 884 | (case e of (Less (_, _, _)) => | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 885 | let | 
| 14445 | 886 | val (xufound, xupred) = dfs (op =) sccGraph xi (getIndex u ntc) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 887 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 888 | if xufound then ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 889 | let | 
| 14445 | 890 | val (vyfound, vypred) = dfs (op =) sccGraph (getIndex v ntc) yi | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 891 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 892 | if vyfound then ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 893 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 894 | val xypath = (completeComponentPath x u xupred)@[e]@(completeComponentPath v y vypred) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 895 | val xyLesss = transPath (tl xypath, hd xypath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 896 | in | 
| 15531 | 897 | if xyLesss subsumes subgoal then SOME (getprf xyLesss) | 
| 898 | else NONE | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 899 | end) | 
| 15531 | 900 | else NONE | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 901 | end) | 
| 15531 | 902 | else NONE | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 903 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 904 | | _ => | 
| 14445 | 905 | let val (uvfound, uvpred) = dfs (op =) sccGraph (getIndex u ntc) (getIndex v ntc) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 906 | in | 
| 14445 | 907 | if uvfound then ( | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 908 | let | 
| 14445 | 909 | val (xufound, xupred) = dfs (op =) sccGraph xi (getIndex u ntc) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 910 | in | 
| 14445 | 911 | if xufound then ( | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 912 | let | 
| 14445 | 913 | val (vyfound, vypred) = dfs (op =) sccGraph (getIndex v ntc) yi | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 914 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 915 | if vyfound then ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 916 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 917 | val uvpath = completeComponentPath u v uvpred | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 918 | val uvLesss = mergeLess ( transPath (tl uvpath, hd uvpath), e) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 919 | val xypath = (completeComponentPath x u xupred)@[uvLesss]@(completeComponentPath v y vypred) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 920 | val xyLesss = transPath (tl xypath, hd xypath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 921 | in | 
| 15531 | 922 | if xyLesss subsumes subgoal then SOME (getprf xyLesss) | 
| 923 | else NONE | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 924 | end ) | 
| 15531 | 925 | else NONE | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 926 | end) | 
| 15531 | 927 | else NONE | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 928 | end ) | 
| 15531 | 929 | else NONE | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 930 | end ) | 
| 15531 | 931 | ) else NONE | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 932 | end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 933 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 934 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 935 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 936 | (* looking for x <= y: any path from x to y is sufficient *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 937 | case subgoal of (Le (x, y, _)) => ( | 
| 19617 | 938 | if null sccGraph then raise Cannot else ( | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 939 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 940 | val xi = getIndex x ntc | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 941 | val yi = getIndex y ntc | 
| 14445 | 942 | (* searches in sccGraph a path from xi to yi *) | 
| 943 | val (found, pred) = dfs (op =) sccGraph xi yi | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 944 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 945 | if found then ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 946 | let val xypath = completeComponentPath x y pred | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 947 | val xyLesss = transPath (tl xypath, hd xypath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 948 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 949 | (case xyLesss of | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 950 | (Less (_, _, q)) => if xyLesss subsumes subgoal then (Thm ([q], #less_imp_le less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 951 | else raise Cannot | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 952 | | _ => if xyLesss subsumes subgoal then (getprf xyLesss) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 953 | else raise Cannot) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 954 | end ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 955 | else raise Cannot | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 956 | end | 
| 14445 | 957 | ) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 958 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 959 | (* looking for x < y: particular path required, which is not necessarily | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 960 | found by normal dfs *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 961 | | (Less (x, y, _)) => ( | 
| 19617 | 962 | if null sccGraph then raise Cannot else ( | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 963 | let | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 964 | val xi = getIndex x ntc | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 965 | val yi = getIndex y ntc | 
| 14445 | 966 | val sccGraph_transpose = transpose (op =) sccGraph | 
| 967 | (* all components that can be reached from component xi *) | |
| 968 | val xreachable = dfs_int_reachable sccGraph xi | |
| 969 | (* all comonents reachable from y in the transposed graph sccGraph' *) | |
| 970 | val yreachable = dfs_int_reachable sccGraph_transpose yi | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 971 | (* for all edges u ~= v or u < v check if they are part of path x < y *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 972 | fun processNeqEdges [] = raise Cannot | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 973 | | processNeqEdges (e::es) = | 
| 15531 | 974 | case (findLess e x y xi yi xreachable yreachable) of (SOME prf) => prf | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 975 | | _ => processNeqEdges es | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 976 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 977 | in | 
| 14445 | 978 | processNeqEdges neqE | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 979 | end | 
| 14445 | 980 | ) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 981 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 982 | | (NotEq (x, y, _)) => ( | 
| 14445 | 983 | (* if there aren't any edges that are candidate for a ~= raise Cannot *) | 
| 19617 | 984 | if null neqE then raise Cannot | 
| 14445 | 985 | (* if there aren't any edges that are candidate for <= then just search a edge in neqE that implies the subgoal *) | 
| 19617 | 986 | else if null sccSubgraphs then ( | 
| 14445 | 987 | (case (Library.find_first (fn fact => fact subsumes subgoal) neqE, subgoal) of | 
| 15531 | 988 | ( SOME (NotEq (x, y, p)), NotEq (x', y', _)) => | 
| 14445 | 989 | if (x aconv x' andalso y aconv y') then p | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 990 | else Thm ([p], #not_sym less_thms) | 
| 15531 | 991 | | ( SOME (Less (x, y, p)), NotEq (x', y', _)) => | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 992 | if x aconv x' andalso y aconv y' then (Thm ([p], #less_imp_neq less_thms)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 993 | else (Thm ([(Thm ([p], #less_imp_neq less_thms))], #not_sym less_thms)) | 
| 14445 | 994 | | _ => raise Cannot) | 
| 995 | ) else ( | |
| 996 | ||
| 997 | let val xi = getIndex x ntc | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 998 | val yi = getIndex y ntc | 
| 14445 | 999 | val sccGraph_transpose = transpose (op =) sccGraph | 
| 1000 | val xreachable = dfs_int_reachable sccGraph xi | |
| 1001 | val yreachable = dfs_int_reachable sccGraph_transpose yi | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1002 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1003 | fun processNeqEdges [] = raise Cannot | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1004 | | processNeqEdges (e::es) = ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1005 | let val u = lower e | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1006 | val v = upper e | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1007 | val ui = getIndex u ntc | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1008 | val vi = getIndex v ntc | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1009 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1010 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1011 | (* if x ~= y follows from edge e *) | 
| 14445 | 1012 | if e subsumes subgoal then ( | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1013 | case e of (Less (u, v, q)) => ( | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1014 | if u aconv x andalso v aconv y then (Thm ([q], #less_imp_neq less_thms)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1015 | else (Thm ([(Thm ([q], #less_imp_neq less_thms))], #not_sym less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1016 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1017 | | (NotEq (u,v, q)) => ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1018 | if u aconv x andalso v aconv y then q | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1019 | else (Thm ([q], #not_sym less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1020 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1021 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1022 | (* if SCC_x is linked to SCC_y via edge e *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1023 | else if ui = xi andalso vi = yi then ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1024 | case e of (Less (_, _,_)) => ( | 
| 15570 | 1025 | let val xypath = (completeTermPath x u (List.nth(sccSubgraphs, ui)) ) @ [e] @ (completeTermPath v y (List.nth(sccSubgraphs, vi)) ) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1026 | val xyLesss = transPath (tl xypath, hd xypath) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1027 | in (Thm ([getprf xyLesss], #less_imp_neq less_thms)) end) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1028 | | _ => ( | 
| 14445 | 1029 | let | 
| 15570 | 1030 | val xupath = completeTermPath x u (List.nth(sccSubgraphs, ui)) | 
| 1031 | val uxpath = completeTermPath u x (List.nth(sccSubgraphs, ui)) | |
| 1032 | val vypath = completeTermPath v y (List.nth(sccSubgraphs, vi)) | |
| 1033 | val yvpath = completeTermPath y v (List.nth(sccSubgraphs, vi)) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1034 | val xuLesss = transPath (tl xupath, hd xupath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1035 | val uxLesss = transPath (tl uxpath, hd uxpath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1036 | val vyLesss = transPath (tl vypath, hd vypath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1037 | val yvLesss = transPath (tl yvpath, hd yvpath) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1038 | val x_eq_u = (Thm ([(getprf xuLesss),(getprf uxLesss)], #eqI less_thms)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1039 | val v_eq_y = (Thm ([(getprf vyLesss),(getprf yvLesss)], #eqI less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1040 | in | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1041 | (Thm ([x_eq_u , (getprf e), v_eq_y ], #eq_neq_eq_imp_neq less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1042 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1043 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1044 | ) else if ui = yi andalso vi = xi then ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1045 | case e of (Less (_, _,_)) => ( | 
| 15570 | 1046 | let val xypath = (completeTermPath y u (List.nth(sccSubgraphs, ui)) ) @ [e] @ (completeTermPath v x (List.nth(sccSubgraphs, vi)) ) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1047 | val xyLesss = transPath (tl xypath, hd xypath) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1048 | in (Thm ([(Thm ([getprf xyLesss], #less_imp_neq less_thms))] , #not_sym less_thms)) end ) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1049 | | _ => ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1050 | |
| 15570 | 1051 | let val yupath = completeTermPath y u (List.nth(sccSubgraphs, ui)) | 
| 1052 | val uypath = completeTermPath u y (List.nth(sccSubgraphs, ui)) | |
| 1053 | val vxpath = completeTermPath v x (List.nth(sccSubgraphs, vi)) | |
| 1054 | val xvpath = completeTermPath x v (List.nth(sccSubgraphs, vi)) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1055 | val yuLesss = transPath (tl yupath, hd yupath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1056 | val uyLesss = transPath (tl uypath, hd uypath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1057 | val vxLesss = transPath (tl vxpath, hd vxpath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1058 | val xvLesss = transPath (tl xvpath, hd xvpath) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1059 | val y_eq_u = (Thm ([(getprf yuLesss),(getprf uyLesss)], #eqI less_thms)) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1060 | val v_eq_x = (Thm ([(getprf vxLesss),(getprf xvLesss)], #eqI less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1061 | in | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1062 | (Thm ([(Thm ([y_eq_u , (getprf e), v_eq_x ], #eq_neq_eq_imp_neq less_thms))], #not_sym less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1063 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1064 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1065 | ) else ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1066 | (* there exists a path x < y or y < x such that | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1067 | x ~= y may be concluded *) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1068 | case (findLess e x y xi yi xreachable yreachable) of | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1069 | (SOME prf) => (Thm ([prf], #less_imp_neq less_thms)) | 
| 15531 | 1070 | | NONE => ( | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1071 | let | 
| 14445 | 1072 | val yr = dfs_int_reachable sccGraph yi | 
| 1073 | val xr = dfs_int_reachable sccGraph_transpose xi | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1074 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1075 | case (findLess e y x yi xi yr xr) of | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1076 | (SOME prf) => (Thm ([(Thm ([prf], #less_imp_neq less_thms))], #not_sym less_thms)) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1077 | | _ => processNeqEdges es | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1078 | end) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1079 | ) end) | 
| 14445 | 1080 | in processNeqEdges neqE end) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1081 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1082 | end; | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1083 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1084 | |
| 14445 | 1085 | (* ******************************************************************* *) | 
| 1086 | (* *) | |
| 1087 | (* mk_sccGraphs components leqG neqG ntc : *) | |
| 1088 | (* Term.term list list -> *) | |
| 1089 | (* (Term.term * (Term.term * less) list) list -> *) | |
| 1090 | (* (Term.term * (Term.term * less) list) list -> *) | |
| 1091 | (* (Term.term * int) list -> *) | |
| 1092 | (* (int * (int * less) list) list * *) | |
| 1093 | (* ((Term.term * (Term.term * less) list) list) list *) | |
| 1094 | (* *) | |
| 1095 | (* *) | |
| 1096 | (* Computes, from graph leqG, list of all its components and the list *) | |
| 1097 | (* ntc (nodes, index of component) a graph whose nodes are the *) | |
| 1098 | (* indices of the components of g. Egdes of the new graph are *) | |
| 1099 | (* only the edges of g linking two components. Also computes for each *) | |
| 1100 | (* component the subgraph of leqG that forms this component. *) | |
| 1101 | (* *) | |
| 1102 | (* For each component SCC_i is checked if there exists a edge in neqG *) | |
| 1103 | (* that leads to a contradiction. *) | |
| 1104 | (* *) | |
| 1105 | (* We have a contradiction for edge u ~= v and u < v if: *) | |
| 1106 | (* - u and v are in the same component, *) | |
| 1107 | (* that is, a path u <= v and a path v <= u exist, hence u = v. *) | |
| 1108 | (* From irreflexivity of < follows u < u or v < v. Ex false quodlibet. *) | |
| 1109 | (* *) | |
| 1110 | (* ******************************************************************* *) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1111 | |
| 14445 | 1112 | fun mk_sccGraphs _ [] _ _ = ([],[]) | 
| 1113 | | mk_sccGraphs components leqG neqG ntc = | |
| 1114 | let | |
| 1115 | (* Liste (Index der Komponente, Komponente *) | |
| 1116 | val IndexComp = indexComps components; | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1117 | |
| 14445 | 1118 | |
| 1119 | fun handleContr edge g = | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1120 | (case edge of | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1121 | (Less (x, y, _)) => ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1122 | let | 
| 14445 | 1123 | val xxpath = edge :: (completeTermPath y x g ) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1124 | val xxLesss = transPath (tl xxpath, hd xxpath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1125 | val q = getprf xxLesss | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1126 | in | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1127 | raise (Contr (Thm ([q], #less_reflE less_thms ))) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1128 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1129 | ) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1130 | | (NotEq (x, y, _)) => ( | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1131 | let | 
| 14445 | 1132 | val xypath = (completeTermPath x y g ) | 
| 1133 | val yxpath = (completeTermPath y x g ) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1134 | val xyLesss = transPath (tl xypath, hd xypath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1135 | val yxLesss = transPath (tl yxpath, hd yxpath) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1136 | val q = getprf (mergeLess ((mergeLess (edge, xyLesss)),yxLesss )) | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1137 | in | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1138 | raise (Contr (Thm ([q], #less_reflE less_thms ))) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1139 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1140 | ) | 
| 14445 | 1141 | | _ => error "trans_tac/handleContr: invalid Contradiction"); | 
| 1142 | ||
| 1143 | ||
| 1144 | (* k is index of the actual component *) | |
| 1145 | ||
| 1146 | fun processComponent (k, comp) = | |
| 1147 | let | |
| 1148 | (* all edges with weight <= of the actual component *) | |
| 15570 | 1149 | val leqEdges = List.concat (map (adjacent (op aconv) leqG) comp); | 
| 14445 | 1150 | (* all edges with weight ~= of the actual component *) | 
| 15570 | 1151 | val neqEdges = map snd (List.concat (map (adjacent (op aconv) neqG) comp)); | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1152 | |
| 14445 | 1153 | (* find an edge leading to a contradiction *) | 
| 15531 | 1154 | fun findContr [] = NONE | 
| 14445 | 1155 | | findContr (e::es) = | 
| 1156 | let val ui = (getIndex (lower e) ntc) | |
| 1157 | val vi = (getIndex (upper e) ntc) | |
| 1158 | in | |
| 15531 | 1159 | if ui = vi then SOME e | 
| 14445 | 1160 | else findContr es | 
| 1161 | end; | |
| 1162 | ||
| 1163 | (* sort edges into component internal edges and | |
| 1164 | edges pointing away from the component *) | |
| 1165 | fun sortEdges [] (intern,extern) = (intern,extern) | |
| 1166 | | sortEdges ((v,l)::es) (intern, extern) = | |
| 1167 | let val k' = getIndex v ntc in | |
| 1168 | if k' = k then | |
| 1169 | sortEdges es (l::intern, extern) | |
| 1170 | else sortEdges es (intern, (k',l)::extern) end; | |
| 1171 | ||
| 1172 | (* Insert edge into sorted list of edges, where edge is | |
| 1173 | only added if | |
| 1174 | - it is found for the first time | |
| 1175 | - it is a <= edge and no parallel < edge was found earlier | |
| 1176 | - it is a < edge | |
| 1177 | *) | |
| 23577 | 1178 | fun insert (h: int,l) [] = [(h,l)] | 
| 14445 | 1179 | | insert (h,l) ((k',l')::es) = if h = k' then ( | 
| 1180 | case l of (Less (_, _, _)) => (h,l)::es | |
| 1181 | | _ => (case l' of (Less (_, _, _)) => (h,l')::es | |
| 1182 | | _ => (k',l)::es) ) | |
| 1183 | else (k',l'):: insert (h,l) es; | |
| 1184 | ||
| 1185 | (* Reorganise list of edges such that | |
| 1186 | - duplicate edges are removed | |
| 1187 | - if a < edge and a <= edge exist at the same time, | |
| 1188 | remove <= edge *) | |
| 1189 | fun reOrganizeEdges [] sorted = sorted: (int * less) list | |
| 1190 | | reOrganizeEdges (e::es) sorted = reOrganizeEdges es (insert e sorted); | |
| 1191 | ||
| 1192 | (* construct the subgraph forming the strongly connected component | |
| 1193 | from the edge list *) | |
| 1194 | fun sccSubGraph [] g = g | |
| 1195 | | sccSubGraph (l::ls) g = | |
| 1196 | sccSubGraph ls (addEdge ((lower l),[((upper l),l)],g)) | |
| 1197 | ||
| 1198 | val (intern, extern) = sortEdges leqEdges ([], []); | |
| 1199 | val subGraph = sccSubGraph intern []; | |
| 1200 | ||
| 1201 | in | |
| 15531 | 1202 | case findContr neqEdges of SOME e => handleContr e subGraph | 
| 14445 | 1203 | | _ => ((k, (reOrganizeEdges (extern) [])), subGraph) | 
| 1204 | end; | |
| 1205 | ||
| 1206 | val tmp = map processComponent IndexComp | |
| 1207 | in | |
| 1208 | ( (map fst tmp), (map snd tmp)) | |
| 1209 | end; | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1210 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1211 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1212 | (** Find proof if possible. **) | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1213 | |
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1214 | fun gen_solve mkconcl sign (asms, concl) = | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1215 | let | 
| 14445 | 1216 | val (leqG, neqG, neqE) = mkGraphs asms | 
| 1217 | val components = scc_term leqG | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1218 | val ntc = indexNodes (indexComps components) | 
| 14445 | 1219 | val (sccGraph, sccSubgraphs) = mk_sccGraphs components leqG neqG ntc | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1220 | in | 
| 14445 | 1221 | let | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1222 | val (subgoals, prf) = mkconcl decomp less_thms sign concl | 
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1223 | fun solve facts less = | 
| 15531 | 1224 | (case triv_solv less of NONE => findProof (sccGraph, neqE, ntc, sccSubgraphs) less | 
| 1225 | | SOME prf => prf ) | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1226 | in | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1227 | map (solve asms) subgoals | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1228 | end | 
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1229 | end; | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1230 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1231 | in | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1232 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1233 | SUBGOAL (fn (A, n, sign) => | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1234 | let | 
| 29276 | 1235 | val rfrees = map Free (Term.rename_wrt_term A (Logic.strip_params A)) | 
| 24704 
9a95634ab135
Transitivity reasoner gets additional argument of premises to improve integration with simplifier.
 ballarin parents: 
24639diff
changeset | 1236 | val Hs = map prop_of prems @ map (fn H => subst_bounds (rfrees, H)) (Logic.strip_assums_hyp A) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1237 | val C = subst_bounds (rfrees, Logic.strip_assums_concl A) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1238 | val lesss = List.concat (ListPair.map (mkasm decomp less_thms sign) (Hs, 0 upto (length Hs - 1))) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1239 | val prfs = gen_solve mkconcl sign (lesss, C); | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1240 | val (subgoals, prf) = mkconcl decomp less_thms sign C; | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1241 | in | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1242 | METAHYPS (fn asms => | 
| 24704 
9a95634ab135
Transitivity reasoner gets additional argument of premises to improve integration with simplifier.
 ballarin parents: 
24639diff
changeset | 1243 | let val thms = map (prove (prems @ asms)) prfs | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1244 | in rtac (prove thms prf) 1 end) n | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1245 | end | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1246 | handle Contr p => METAHYPS (fn asms => rtac (prove asms p) 1) n | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1247 | | Cannot => no_tac | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1248 | ) | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1249 | |
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1250 | end; | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1251 | |
| 14445 | 1252 | (* partial_tac - solves partial orders *) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1253 | val partial_tac = gen_order_tac mkasm_partial mkconcl_partial; | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1254 | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1255 | (* linear_tac - solves linear/total orders *) | 
| 24639 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1256 | val linear_tac = gen_order_tac mkasm_linear mkconcl_linear; | 
| 
9b73bc9b05a1
Defunctorised transitivity reasoner; locale interpretation requires dynamic instances.
 ballarin parents: 
23577diff
changeset | 1257 | |
| 14398 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1258 | |
| 
c5c47703f763
Efficient, graph-based reasoner for linear and partial orders.
 ballarin parents: diff
changeset | 1259 | end; |