| author | huffman | 
| Wed, 20 Sep 2006 07:42:12 +0200 | |
| changeset 20634 | 45fe31e72391 | 
| parent 15574 | b1d1b5bfc464 | 
| child 22257 | 159bfab776e2 | 
| permissions | -rw-r--r-- | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 1 | (* | 
| 15098 | 2 | Title: Transitivity reasoner for transitive closures of relations | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 3 | Id: $Id$ | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 4 | Author: Oliver Kutter | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 5 | Copyright: TU Muenchen | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 6 | *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 7 | |
| 15098 | 8 | (* | 
| 9 | ||
| 10 | The packages provides tactics trancl_tac and rtrancl_tac that prove | |
| 11 | goals of the form | |
| 12 | ||
| 13 | (x,y) : r^+ and (x,y) : r^* (rtrancl_tac only) | |
| 14 | ||
| 15 | from premises of the form | |
| 16 | ||
| 17 | (x,y) : r, (x,y) : r^+ and (x,y) : r^* (rtrancl_tac only) | |
| 18 | ||
| 19 | by reflexivity and transitivity. The relation r is determined by inspecting | |
| 20 | the conclusion. | |
| 21 | ||
| 22 | The package is implemented as an ML functor and thus not limited to | |
| 23 | particular constructs for transitive and reflexive-transitive | |
| 24 | closures, neither need relations be represented as sets of pairs. In | |
| 25 | order to instantiate the package for transitive closure only, supply | |
| 26 | dummy theorems to the additional rules for reflexive-transitive | |
| 27 | closures, and don't use rtrancl_tac! | |
| 28 | ||
| 29 | *) | |
| 30 | ||
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 31 | signature TRANCL_ARITH = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 32 | sig | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 33 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 34 | (* theorems for transitive closure *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 35 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 36 | val r_into_trancl : thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 37 | (* (a,b) : r ==> (a,b) : r^+ *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 38 | val trancl_trans : thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 39 | (* [| (a,b) : r^+ ; (b,c) : r^+ |] ==> (a,c) : r^+ *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 40 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 41 | (* additional theorems for reflexive-transitive closure *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 42 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 43 | val rtrancl_refl : thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 44 | (* (a,a): r^* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 45 | val r_into_rtrancl : thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 46 | (* (a,b) : r ==> (a,b) : r^* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 47 | val trancl_into_rtrancl : thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 48 | (* (a,b) : r^+ ==> (a,b) : r^* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 49 | val rtrancl_trancl_trancl : thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 50 | (* [| (a,b) : r^* ; (b,c) : r^+ |] ==> (a,c) : r^+ *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 51 | val trancl_rtrancl_trancl : thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 52 | (* [| (a,b) : r^+ ; (b,c) : r^* |] ==> (a,c) : r^+ *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 53 | val rtrancl_trans : thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 54 | (* [| (a,b) : r^* ; (b,c) : r^* |] ==> (a,c) : r^* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 55 | |
| 15098 | 56 | (* decomp: decompose a premise or conclusion | 
| 57 | ||
| 58 | Returns one of the following: | |
| 59 | ||
| 15531 | 60 | NONE if not an instance of a relation, | 
| 61 | SOME (x, y, r, s) if instance of a relation, where | |
| 15098 | 62 | x: left hand side argument, y: right hand side argument, | 
| 63 | r: the relation, | |
| 64 | s: the kind of closure, one of | |
| 65 | "r": the relation itself, | |
| 66 | "r^+": transitive closure of the relation, | |
| 67 | "r^*": reflexive-transitive closure of the relation | |
| 68 | *) | |
| 69 | ||
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 70 | val decomp: term -> (term * term * term * string) option | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 71 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 72 | end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 73 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 74 | signature TRANCL_TAC = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 75 | sig | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 76 | val trancl_tac: int -> tactic; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 77 | val rtrancl_tac: int -> tactic; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 78 | end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 79 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 80 | functor Trancl_Tac_Fun (Cls : TRANCL_ARITH): TRANCL_TAC = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 81 | struct | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 82 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 83 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 84 | datatype proof | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 85 | = Asm of int | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 86 | | Thm of proof list * thm; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 87 | |
| 15098 | 88 | exception Cannot; (* internal exception: raised if no proof can be found *) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 89 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 90 | fun prove asms = | 
| 15570 | 91 | let fun pr (Asm i) = List.nth (asms, i) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 92 | | pr (Thm (prfs, thm)) = (map pr prfs) MRS thm | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 93 | in pr end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 94 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 95 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 96 | (* Internal datatype for inequalities *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 97 | datatype rel | 
| 15098 | 98 | = Trans of term * term * proof (* R^+ *) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 99 | | RTrans of term * term * proof; (* R^* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 100 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 101 | (* Misc functions for datatype rel *) | 
| 15098 | 102 | fun lower (Trans (x, _, _)) = x | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 103 | | lower (RTrans (x,_,_)) = x; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 104 | |
| 15098 | 105 | fun upper (Trans (_, y, _)) = y | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 106 | | upper (RTrans (_,y,_)) = y; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 107 | |
| 15098 | 108 | fun getprf (Trans (_, _, p)) = p | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 109 | | getprf (RTrans (_,_, p)) = p; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 110 | |
| 15098 | 111 | (* ************************************************************************ *) | 
| 112 | (* *) | |
| 113 | (* mkasm_trancl Rel (t,n): term -> (term , int) -> rel list *) | |
| 114 | (* *) | |
| 115 | (* Analyse assumption t with index n with respect to relation Rel: *) | |
| 116 | (* If t is of the form "(x, y) : Rel" (or Rel^+), translate to *) | |
| 117 | (* an object (singleton list) of internal datatype rel. *) | |
| 118 | (* Otherwise return empty list. *) | |
| 119 | (* *) | |
| 120 | (* ************************************************************************ *) | |
| 121 | ||
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 122 | fun mkasm_trancl Rel (t, n) = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 123 | case Cls.decomp t of | 
| 15531 | 124 | SOME (x, y, rel,r) => if rel aconv Rel then | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 125 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 126 | (case r of | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 127 | "r" => [Trans (x,y, Thm([Asm n], Cls.r_into_trancl))] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 128 | | "r+" => [Trans (x,y, Asm n)] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 129 | | "r*" => [] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 130 |     | _     => error ("trancl_tac: unknown relation symbol"))
 | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 131 | else [] | 
| 15531 | 132 | | NONE => []; | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 133 | |
| 15098 | 134 | (* ************************************************************************ *) | 
| 135 | (* *) | |
| 136 | (* mkasm_rtrancl Rel (t,n): term -> (term , int) -> rel list *) | |
| 137 | (* *) | |
| 138 | (* Analyse assumption t with index n with respect to relation Rel: *) | |
| 139 | (* If t is of the form "(x, y) : Rel" (or Rel^+ or Rel^* ), translate to *) | |
| 140 | (* an object (singleton list) of internal datatype rel. *) | |
| 141 | (* Otherwise return empty list. *) | |
| 142 | (* *) | |
| 143 | (* ************************************************************************ *) | |
| 144 | ||
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 145 | fun mkasm_rtrancl Rel (t, n) = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 146 | case Cls.decomp t of | 
| 15531 | 147 | SOME (x, y, rel, r) => if rel aconv Rel then | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 148 | (case r of | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 149 | "r" => [ Trans (x,y, Thm([Asm n], Cls.r_into_trancl))] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 150 | | "r+" => [ Trans (x,y, Asm n)] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 151 | | "r*" => [ RTrans(x,y, Asm n)] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 152 |     | _     => error ("rtrancl_tac: unknown relation symbol" ))
 | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 153 | else [] | 
| 15531 | 154 | | NONE => []; | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 155 | |
| 15098 | 156 | (* ************************************************************************ *) | 
| 157 | (* *) | |
| 158 | (* mkconcl_trancl t: term -> (term, rel, proof) *) | |
| 159 | (* mkconcl_rtrancl t: term -> (term, rel, proof) *) | |
| 160 | (* *) | |
| 161 | (* Analyse conclusion t: *) | |
| 162 | (* - must be of form "(x, y) : r^+ (or r^* for rtrancl) *) | |
| 163 | (* - returns r *) | |
| 164 | (* - conclusion in internal form *) | |
| 165 | (* - proof object *) | |
| 166 | (* *) | |
| 167 | (* ************************************************************************ *) | |
| 168 | ||
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 169 | fun mkconcl_trancl t = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 170 | case Cls.decomp t of | 
| 15531 | 171 | SOME (x, y, rel, r) => (case r of | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 172 | "r+" => (rel, Trans (x,y, Asm ~1), Asm 0) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 173 | | _ => raise Cannot) | 
| 15531 | 174 | | NONE => raise Cannot; | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 175 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 176 | fun mkconcl_rtrancl t = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 177 | case Cls.decomp t of | 
| 15531 | 178 | SOME (x, y, rel,r ) => (case r of | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 179 | "r+" => (rel, Trans (x,y, Asm ~1), Asm 0) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 180 | | "r*" => (rel, RTrans (x,y, Asm ~1), Asm 0) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 181 | | _ => raise Cannot) | 
| 15531 | 182 | | NONE => raise Cannot; | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 183 | |
| 15098 | 184 | (* ************************************************************************ *) | 
| 185 | (* *) | |
| 186 | (* makeStep (r1, r2): rel * rel -> rel *) | |
| 187 | (* *) | |
| 188 | (* Apply transitivity to r1 and r2, obtaining a new element of r^+ or r^*, *) | |
| 189 | (* according the following rules: *) | |
| 190 | (* *) | |
| 191 | (* ( (a, b) : r^+ , (b,c) : r^+ ) --> (a,c) : r^+ *) | |
| 192 | (* ( (a, b) : r^* , (b,c) : r^+ ) --> (a,c) : r^+ *) | |
| 193 | (* ( (a, b) : r^+ , (b,c) : r^* ) --> (a,c) : r^+ *) | |
| 194 | (* ( (a, b) : r^* , (b,c) : r^* ) --> (a,c) : r^* *) | |
| 195 | (* *) | |
| 196 | (* ************************************************************************ *) | |
| 197 | ||
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 198 | fun makeStep (Trans (a,_,p), Trans(_,c,q)) = Trans (a,c, Thm ([p,q], Cls.trancl_trans)) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 199 | (* refl. + trans. cls. rules *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 200 | | makeStep (RTrans (a,_,p), Trans(_,c,q)) = Trans (a,c, Thm ([p,q], Cls.rtrancl_trancl_trancl)) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 201 | | makeStep (Trans (a,_,p), RTrans(_,c,q)) = Trans (a,c, Thm ([p,q], Cls.trancl_rtrancl_trancl)) | 
| 15098 | 202 | | makeStep (RTrans (a,_,p), RTrans(_,c,q)) = RTrans (a,c, Thm ([p,q], Cls.rtrancl_trans)); | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 203 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 204 | (* ******************************************************************* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 205 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 206 | (* transPath (Clslist, Cls): (rel list * rel) -> rel *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 207 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 208 | (* If a path represented by a list of elements of type rel is found, *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 209 | (* this needs to be contracted to a single element of type rel. *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 210 | (* Prior to each transitivity step it is checked whether the step is *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 211 | (* valid. *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 212 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 213 | (* ******************************************************************* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 214 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 215 | fun transPath ([],acc) = acc | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 216 | | transPath (x::xs,acc) = transPath (xs, makeStep(acc,x)) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 217 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 218 | (* ********************************************************************* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 219 | (* Graph functions *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 220 | (* ********************************************************************* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 221 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 222 | (* *********************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 223 | (* Functions for constructing graphs *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 224 | (* *********************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 225 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 226 | fun addEdge (v,d,[]) = [(v,d)] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 227 | | addEdge (v,d,((u,dl)::el)) = if v aconv u then ((v,d@dl)::el) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 228 | else (u,dl):: (addEdge(v,d,el)); | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 229 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 230 | (* ********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 231 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 232 | (* mkGraph constructs from a list of objects of type rel a graph g *) | 
| 15098 | 233 | (* and a list of all edges with label r+. *) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 234 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 235 | (* ********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 236 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 237 | fun mkGraph [] = ([],[]) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 238 | | mkGraph ys = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 239 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 240 | fun buildGraph ([],g,zs) = (g,zs) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 241 | | buildGraph (x::xs, g, zs) = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 242 | case x of (Trans (_,_,_)) => | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 243 | buildGraph (xs, addEdge((upper x), [],(addEdge ((lower x),[((upper x),x)],g))), x::zs) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 244 | | _ => buildGraph (xs, addEdge((upper x), [],(addEdge ((lower x),[((upper x),x)],g))), zs) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 245 | in buildGraph (ys, [], []) end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 246 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 247 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 248 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 249 | (* adjacent g u : (''a * 'b list ) list -> ''a -> 'b list                  *)
 | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 250 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 251 | (* List of successors of u in graph g *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 252 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 253 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 254 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 255 | fun adjacent eq_comp ((v,adj)::el) u = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 256 | if eq_comp (u, v) then adj else adjacent eq_comp el u | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 257 | | adjacent _ [] _ = [] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 258 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 259 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 260 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 261 | (* dfs eq_comp g u v: *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 262 | (* ('a * 'a -> bool) -> ('a  *( 'a * rel) list) list ->                    *)
 | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 263 | (* 'a -> 'a -> (bool * ('a * rel) list)                                    *) 
 | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 264 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 265 | (* Depth first search of v from u. *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 266 | (* Returns (true, path(u, v)) if successful, otherwise (false, []). *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 267 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 268 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 269 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 270 | fun dfs eq_comp g u v = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 271 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 272 | val pred = ref nil; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 273 | val visited = ref nil; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 274 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 275 | fun been_visited v = exists (fn w => eq_comp (w, v)) (!visited) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 276 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 277 | fun dfs_visit u' = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 278 | let val _ = visited := u' :: (!visited) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 279 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 280 | fun update (x,l) = let val _ = pred := (x,l) ::(!pred) in () end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 281 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 282 | in if been_visited v then () | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 283 | else (app (fn (v',l) => if been_visited v' then () else ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 284 | update (v',l); | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 285 | dfs_visit v'; ()) )) (adjacent eq_comp g u') | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 286 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 287 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 288 | dfs_visit u; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 289 | if (been_visited v) then (true, (!pred)) else (false , []) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 290 | end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 291 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 292 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 293 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 294 | (* transpose g: *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 295 | (* (''a * ''a list) list -> (''a * ''a list) list                          *)
 | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 296 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 297 | (* Computes transposed graph g' from g *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 298 | (* by reversing all edges u -> v to v -> u *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 299 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 300 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 301 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 302 | fun transpose eq_comp g = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 303 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 304 | (* Compute list of reversed edges for each adjacency list *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 305 | fun flip (u,(v,l)::el) = (v,(u,l)) :: flip (u,el) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 306 | | flip (_,nil) = nil | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 307 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 308 | (* Compute adjacency list for node u from the list of edges | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 309 | and return a likewise reduced list of edges. The list of edges | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 310 | is searches for edges starting from u, and these edges are removed. *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 311 | fun gather (u,(v,w)::el) = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 312 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 313 | val (adj,edges) = gather (u,el) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 314 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 315 | if eq_comp (u, v) then (w::adj,edges) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 316 | else (adj,(v,w)::edges) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 317 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 318 | | gather (_,nil) = (nil,nil) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 319 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 320 | (* For every node in the input graph, call gather to find all reachable | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 321 | nodes in the list of edges *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 322 | fun assemble ((u,_)::el) edges = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 323 | let val (adj,edges) = gather (u,edges) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 324 | in (u,adj) :: assemble el edges | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 325 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 326 | | assemble nil _ = nil | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 327 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 328 | (* Compute, for each adjacency list, the list with reversed edges, | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 329 | and concatenate these lists. *) | 
| 15574 
b1d1b5bfc464
Removed practically all references to Library.foldr.
 skalberg parents: 
15570diff
changeset | 330 | val flipped = foldr (op @) nil (map flip g) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 331 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 332 | in assemble g flipped end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 333 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 334 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 335 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 336 | (* dfs_reachable eq_comp g u: *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 337 | (* (int * int list) list -> int -> int list *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 338 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 339 | (* Computes list of all nodes reachable from u in g. *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 340 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 341 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 342 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 343 | fun dfs_reachable eq_comp g u = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 344 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 345 | (* List of vertices which have been visited. *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 346 | val visited = ref nil; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 347 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 348 | fun been_visited v = exists (fn w => eq_comp (w, v)) (!visited) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 349 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 350 | fun dfs_visit g u = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 351 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 352 | val _ = visited := u :: !visited | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 353 | val descendents = | 
| 15574 
b1d1b5bfc464
Removed practically all references to Library.foldr.
 skalberg parents: 
15570diff
changeset | 354 | foldr (fn ((v,l),ds) => if been_visited v then ds | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 355 | else v :: dfs_visit g v @ ds) | 
| 15574 
b1d1b5bfc464
Removed practically all references to Library.foldr.
 skalberg parents: 
15570diff
changeset | 356 | nil (adjacent eq_comp g u) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 357 | in descendents end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 358 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 359 | in u :: dfs_visit g u end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 360 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 361 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 362 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 363 | (* dfs_term_reachable g u: *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 364 | (* (term * term list) list -> term -> term list *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 365 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 366 | (* Computes list of all nodes reachable from u in g. *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 367 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 368 | (* *********************************************************************** *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 369 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 370 | fun dfs_term_reachable g u = dfs_reachable (op aconv) g u; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 371 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 372 | (* ************************************************************************ *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 373 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 374 | (* findPath x y g: Term.term -> Term.term -> *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 375 | (* (Term.term * (Term.term * rel list) list) -> *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 376 | (* (bool, rel list) *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 377 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 378 | (* Searches a path from vertex x to vertex y in Graph g, returns true and *) | 
| 15098 | 379 | (* the list of edges if path is found, otherwise false and nil. *) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 380 | (* *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 381 | (* ************************************************************************ *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 382 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 383 | fun findPath x y g = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 384 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 385 | val (found, tmp) = dfs (op aconv) g x y ; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 386 | val pred = map snd tmp; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 387 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 388 | fun path x y = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 389 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 390 | (* find predecessor u of node v and the edge u -> v *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 391 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 392 | fun lookup v [] = raise Cannot | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 393 | | lookup v (e::es) = if (upper e) aconv v then e else lookup v es; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 394 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 395 | (* traverse path backwards and return list of visited edges *) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 396 | fun rev_path v = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 397 | let val l = lookup v pred | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 398 | val u = lower l; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 399 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 400 | if u aconv x then [l] else (rev_path u) @ [l] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 401 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 402 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 403 | in rev_path y end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 404 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 405 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 406 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 407 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 408 | if found then ( (found, (path x y) )) else (found,[]) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 409 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 410 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 411 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 412 | end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 413 | |
| 15098 | 414 | (* ************************************************************************ *) | 
| 415 | (* *) | |
| 416 | (* findRtranclProof g tranclEdges subgoal: *) | |
| 417 | (* (Term.term * (Term.term * rel list) list) -> rel -> proof list *) | |
| 418 | (* *) | |
| 419 | (* Searches in graph g a proof for subgoal. *) | |
| 420 | (* *) | |
| 421 | (* ************************************************************************ *) | |
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 422 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 423 | fun findRtranclProof g tranclEdges subgoal = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 424 | case subgoal of (RTrans (x,y,_)) => if x aconv y then [Thm ([], Cls.rtrancl_refl)] else ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 425 | let val (found, path) = findPath (lower subgoal) (upper subgoal) g | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 426 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 427 | if found then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 428 | let val path' = (transPath (tl path, hd path)) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 429 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 430 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 431 | case path' of (Trans (_,_,p)) => [Thm ([p], Cls.trancl_into_rtrancl )] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 432 | | _ => [getprf path'] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 433 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 434 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 435 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 436 | else raise Cannot | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 437 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 438 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 439 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 440 | | (Trans (x,y,_)) => ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 441 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 442 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 443 | val Vx = dfs_term_reachable g x; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 444 | val g' = transpose (op aconv) g; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 445 | val Vy = dfs_term_reachable g' y; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 446 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 447 | fun processTranclEdges [] = raise Cannot | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 448 | | processTranclEdges (e::es) = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 449 | if (upper e) mem Vx andalso (lower e) mem Vx | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 450 | andalso (upper e) mem Vy andalso (lower e) mem Vy | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 451 | then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 452 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 453 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 454 | if (lower e) aconv x then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 455 | if (upper e) aconv y then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 456 | [(getprf e)] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 457 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 458 | else ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 459 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 460 | val (found,path) = findPath (upper e) y g | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 461 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 462 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 463 | if found then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 464 | [getprf (transPath (path, e))] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 465 | ) else processTranclEdges es | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 466 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 467 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 468 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 469 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 470 | else if (upper e) aconv y then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 471 | let val (xufound,xupath) = findPath x (lower e) g | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 472 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 473 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 474 | if xufound then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 475 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 476 | let val xuRTranclEdge = transPath (tl xupath, hd xupath) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 477 | val xyTranclEdge = makeStep(xuRTranclEdge,e) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 478 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 479 | in [getprf xyTranclEdge] end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 480 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 481 | ) else processTranclEdges es | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 482 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 483 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 484 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 485 | else ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 486 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 487 | let val (xufound,xupath) = findPath x (lower e) g | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 488 | val (vyfound,vypath) = findPath (upper e) y g | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 489 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 490 | if xufound then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 491 | if vyfound then ( | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 492 | let val xuRTranclEdge = transPath (tl xupath, hd xupath) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 493 | val vyRTranclEdge = transPath (tl vypath, hd vypath) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 494 | val xyTranclEdge = makeStep (makeStep(xuRTranclEdge,e),vyRTranclEdge) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 495 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 496 | in [getprf xyTranclEdge] end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 497 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 498 | ) else processTranclEdges es | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 499 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 500 | else processTranclEdges es | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 501 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 502 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 503 | ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 504 | else processTranclEdges es; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 505 | in processTranclEdges tranclEdges end ) | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 506 | | _ => raise Cannot | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 507 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 508 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 509 | fun solveTrancl (asms, concl) = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 510 | let val (g,_) = mkGraph asms | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 511 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 512 | let val (_, subgoal, _) = mkconcl_trancl concl | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 513 | val (found, path) = findPath (lower subgoal) (upper subgoal) g | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 514 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 515 | if found then [getprf (transPath (tl path, hd path))] | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 516 | else raise Cannot | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 517 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 518 | end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 519 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 520 | fun solveRtrancl (asms, concl) = | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 521 | let val (g,tranclEdges) = mkGraph asms | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 522 | val (_, subgoal, _) = mkconcl_rtrancl concl | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 523 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 524 | findRtranclProof g tranclEdges subgoal | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 525 | end; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 526 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 527 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 528 | val trancl_tac = SUBGOAL (fn (A, n) => | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 529 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 530 | val Hs = Logic.strip_assums_hyp A; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 531 | val C = Logic.strip_assums_concl A; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 532 | val (rel,subgoals, prf) = mkconcl_trancl C; | 
| 15570 | 533 | val prems = List.concat (ListPair.map (mkasm_trancl rel) (Hs, 0 upto (length Hs - 1))) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 534 | val prfs = solveTrancl (prems, C); | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 535 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 536 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 537 | METAHYPS (fn asms => | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 538 | let val thms = map (prove asms) prfs | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 539 | in rtac (prove thms prf) 1 end) n | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 540 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 541 | handle Cannot => no_tac); | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 542 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 543 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 544 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 545 | val rtrancl_tac = SUBGOAL (fn (A, n) => | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 546 | let | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 547 | val Hs = Logic.strip_assums_hyp A; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 548 | val C = Logic.strip_assums_concl A; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 549 | val (rel,subgoals, prf) = mkconcl_rtrancl C; | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 550 | |
| 15570 | 551 | val prems = List.concat (ListPair.map (mkasm_rtrancl rel) (Hs, 0 upto (length Hs - 1))) | 
| 15076 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 552 | val prfs = solveRtrancl (prems, C); | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 553 | in | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 554 | METAHYPS (fn asms => | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 555 | let val thms = map (prove asms) prfs | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 556 | in rtac (prove thms prf) 1 end) n | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 557 | end | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 558 | handle Cannot => no_tac); | 
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 559 | |
| 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 ballarin parents: diff
changeset | 560 | end; |