| author | wenzelm | 
| Tue, 12 Apr 2016 15:00:26 +0200 | |
| changeset 62960 | cfbb6a5b427c | 
| parent 60785 | c6f96559e032 | 
| child 67379 | c2dfc510a38c | 
| permissions | -rw-r--r-- | 
| 37744 | 1  | 
(* Title: Provers/trancl.ML  | 
| 30190 | 2  | 
Author: Oliver Kutter, TU Muenchen  | 
| 37744 | 3  | 
|
4  | 
Transitivity reasoner for transitive closures of relations  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
5  | 
*)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
6  | 
|
| 15098 | 7  | 
(*  | 
8  | 
||
9  | 
The packages provides tactics trancl_tac and rtrancl_tac that prove  | 
|
10  | 
goals of the form  | 
|
11  | 
||
12  | 
(x,y) : r^+ and (x,y) : r^* (rtrancl_tac only)  | 
|
13  | 
||
14  | 
from premises of the form  | 
|
15  | 
||
16  | 
(x,y) : r, (x,y) : r^+ and (x,y) : r^* (rtrancl_tac only)  | 
|
17  | 
||
18  | 
by reflexivity and transitivity. The relation r is determined by inspecting  | 
|
19  | 
the conclusion.  | 
|
20  | 
||
21  | 
The package is implemented as an ML functor and thus not limited to  | 
|
22  | 
particular constructs for transitive and reflexive-transitive  | 
|
23  | 
closures, neither need relations be represented as sets of pairs. In  | 
|
24  | 
order to instantiate the package for transitive closure only, supply  | 
|
25  | 
dummy theorems to the additional rules for reflexive-transitive  | 
|
26  | 
closures, and don't use rtrancl_tac!  | 
|
27  | 
||
28  | 
*)  | 
|
29  | 
||
| 32215 | 30  | 
signature TRANCL_ARITH =  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
31  | 
sig  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
32  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
33  | 
(* theorems for transitive closure *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
34  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
35  | 
val r_into_trancl : thm  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
36  | 
(* (a,b) : r ==> (a,b) : r^+ *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
37  | 
val trancl_trans : thm  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
38  | 
(* [| (a,b) : r^+ ; (b,c) : r^+ |] ==> (a,c) : r^+ *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
39  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
40  | 
(* additional theorems for reflexive-transitive closure *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
41  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
42  | 
val rtrancl_refl : thm  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
43  | 
(* (a,a): r^* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
44  | 
val r_into_rtrancl : thm  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
45  | 
(* (a,b) : r ==> (a,b) : r^* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
46  | 
val trancl_into_rtrancl : thm  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
47  | 
(* (a,b) : r^+ ==> (a,b) : r^* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
48  | 
val rtrancl_trancl_trancl : thm  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
49  | 
(* [| (a,b) : r^* ; (b,c) : r^+ |] ==> (a,c) : r^+ *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
50  | 
val trancl_rtrancl_trancl : thm  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
51  | 
(* [| (a,b) : r^+ ; (b,c) : r^* |] ==> (a,c) : r^+ *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
52  | 
val rtrancl_trans : thm  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
53  | 
(* [| (a,b) : r^* ; (b,c) : r^* |] ==> (a,c) : r^* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
54  | 
|
| 15098 | 55  | 
(* decomp: decompose a premise or conclusion  | 
56  | 
||
57  | 
Returns one of the following:  | 
|
58  | 
||
| 15531 | 59  | 
NONE if not an instance of a relation,  | 
60  | 
SOME (x, y, r, s) if instance of a relation, where  | 
|
| 15098 | 61  | 
x: left hand side argument, y: right hand side argument,  | 
62  | 
r: the relation,  | 
|
63  | 
s: the kind of closure, one of  | 
|
64  | 
"r": the relation itself,  | 
|
65  | 
"r^+": transitive closure of the relation,  | 
|
66  | 
"r^*": reflexive-transitive closure of the relation  | 
|
| 32215 | 67  | 
*)  | 
| 15098 | 68  | 
|
| 32215 | 69  | 
val decomp: term -> (term * term * term * string) option  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
70  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
71  | 
end;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
72  | 
|
| 32215 | 73  | 
signature TRANCL_TAC =  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
74  | 
sig  | 
| 32215 | 75  | 
val trancl_tac: Proof.context -> int -> tactic  | 
76  | 
val rtrancl_tac: Proof.context -> int -> tactic  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
77  | 
end;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
78  | 
|
| 32215 | 79  | 
functor Trancl_Tac(Cls: TRANCL_ARITH): TRANCL_TAC =  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
80  | 
struct  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
81  | 
|
| 32215 | 82  | 
|
| 
22257
 
159bfab776e2
"prove" function now instantiates relation variable in order
 
berghofe 
parents: 
15574 
diff
changeset
 | 
83  | 
datatype proof  | 
| 32215 | 84  | 
= Asm of int  | 
85  | 
| Thm of proof list * thm;  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
86  | 
|
| 
22257
 
159bfab776e2
"prove" function now instantiates relation variable in order
 
berghofe 
parents: 
15574 
diff
changeset
 | 
87  | 
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
 | 
88  | 
|
| 
26834
 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 
berghofe 
parents: 
22257 
diff
changeset
 | 
89  | 
fun decomp t = Option.map (fn (x, y, rel, r) =>  | 
| 
 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 
berghofe 
parents: 
22257 
diff
changeset
 | 
90  | 
(Envir.beta_eta_contract x, Envir.beta_eta_contract y,  | 
| 
 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 
berghofe 
parents: 
22257 
diff
changeset
 | 
91  | 
Envir.beta_eta_contract rel, r)) (Cls.decomp t);  | 
| 
 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 
berghofe 
parents: 
22257 
diff
changeset
 | 
92  | 
|
| 60785 | 93  | 
fun prove ctxt r asms =  | 
| 
22257
 
159bfab776e2
"prove" function now instantiates relation variable in order
 
berghofe 
parents: 
15574 
diff
changeset
 | 
94  | 
let  | 
| 
 
159bfab776e2
"prove" function now instantiates relation variable in order
 
berghofe 
parents: 
15574 
diff
changeset
 | 
95  | 
fun inst thm =  | 
| 60785 | 96  | 
let val SOME (_, _, Var (r', _), _) = decomp (Thm.concl_of thm)  | 
97  | 
in infer_instantiate ctxt [(r', Thm.cterm_of ctxt r)] thm end;  | 
|
| 42364 | 98  | 
fun pr (Asm i) = nth asms i  | 
99  | 
| pr (Thm (prfs, thm)) = map pr prfs MRS inst thm;  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
100  | 
in pr end;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
101  | 
|
| 32215 | 102  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
103  | 
(* Internal datatype for inequalities *)  | 
| 32215 | 104  | 
datatype rel  | 
| 15098 | 105  | 
= Trans of term * term * proof (* R^+ *)  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
106  | 
| RTrans of term * term * proof; (* R^* *)  | 
| 32215 | 107  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
108  | 
(* Misc functions for datatype rel *)  | 
| 15098 | 109  | 
fun lower (Trans (x, _, _)) = x  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
110  | 
| lower (RTrans (x,_,_)) = x;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
111  | 
|
| 15098 | 112  | 
fun upper (Trans (_, y, _)) = y  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
113  | 
| upper (RTrans (_,y,_)) = y;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
114  | 
|
| 15098 | 115  | 
fun getprf (Trans (_, _, p)) = p  | 
| 32215 | 116  | 
| getprf (RTrans (_,_, p)) = p;  | 
117  | 
||
| 15098 | 118  | 
(* ************************************************************************ *)  | 
119  | 
(* *)  | 
|
120  | 
(* mkasm_trancl Rel (t,n): term -> (term , int) -> rel list *)  | 
|
121  | 
(* *)  | 
|
122  | 
(* Analyse assumption t with index n with respect to relation Rel: *)  | 
|
123  | 
(* If t is of the form "(x, y) : Rel" (or Rel^+), translate to *)  | 
|
124  | 
(* an object (singleton list) of internal datatype rel. *)  | 
|
125  | 
(* Otherwise return empty list. *)  | 
|
126  | 
(* *)  | 
|
127  | 
(* ************************************************************************ *)  | 
|
128  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
129  | 
fun mkasm_trancl Rel (t, n) =  | 
| 
26834
 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 
berghofe 
parents: 
22257 
diff
changeset
 | 
130  | 
case decomp t of  | 
| 32215 | 131  | 
SOME (x, y, rel,r) => if rel aconv Rel then  | 
132  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
133  | 
(case r of  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
134  | 
"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
 | 
135  | 
| "r+" => [Trans (x,y, Asm n)]  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
136  | 
| "r*" => []  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
137  | 
    | _     => error ("trancl_tac: unknown relation symbol"))
 | 
| 32215 | 138  | 
else []  | 
| 15531 | 139  | 
| NONE => [];  | 
| 32215 | 140  | 
|
| 15098 | 141  | 
(* ************************************************************************ *)  | 
142  | 
(* *)  | 
|
143  | 
(* mkasm_rtrancl Rel (t,n): term -> (term , int) -> rel list *)  | 
|
144  | 
(* *)  | 
|
145  | 
(* Analyse assumption t with index n with respect to relation Rel: *)  | 
|
146  | 
(* If t is of the form "(x, y) : Rel" (or Rel^+ or Rel^* ), translate to *)  | 
|
147  | 
(* an object (singleton list) of internal datatype rel. *)  | 
|
148  | 
(* Otherwise return empty list. *)  | 
|
149  | 
(* *)  | 
|
150  | 
(* ************************************************************************ *)  | 
|
151  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
152  | 
fun mkasm_rtrancl Rel (t, n) =  | 
| 
26834
 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 
berghofe 
parents: 
22257 
diff
changeset
 | 
153  | 
case decomp t of  | 
| 15531 | 154  | 
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
 | 
155  | 
(case r of  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
156  | 
"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
 | 
157  | 
| "r+" => [ Trans (x,y, Asm n)]  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
158  | 
| "r*" => [ RTrans(x,y, Asm n)]  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
159  | 
    | _     => error ("rtrancl_tac: unknown relation symbol" ))
 | 
| 32215 | 160  | 
else []  | 
| 15531 | 161  | 
| NONE => [];  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
162  | 
|
| 15098 | 163  | 
(* ************************************************************************ *)  | 
164  | 
(* *)  | 
|
165  | 
(* mkconcl_trancl t: term -> (term, rel, proof) *)  | 
|
166  | 
(* mkconcl_rtrancl t: term -> (term, rel, proof) *)  | 
|
167  | 
(* *)  | 
|
168  | 
(* Analyse conclusion t: *)  | 
|
169  | 
(* - must be of form "(x, y) : r^+ (or r^* for rtrancl) *)  | 
|
170  | 
(* - returns r *)  | 
|
171  | 
(* - conclusion in internal form *)  | 
|
172  | 
(* - proof object *)  | 
|
173  | 
(* *)  | 
|
174  | 
(* ************************************************************************ *)  | 
|
175  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
176  | 
fun mkconcl_trancl t =  | 
| 
26834
 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 
berghofe 
parents: 
22257 
diff
changeset
 | 
177  | 
case 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  | 
| _ => raise Cannot)  | 
| 15531 | 181  | 
| NONE => raise Cannot;  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
182  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
183  | 
fun mkconcl_rtrancl t =  | 
| 
26834
 
87a5b9ec3863
Terms returned by decomp are now eta-contracted.
 
berghofe 
parents: 
22257 
diff
changeset
 | 
184  | 
case decomp t of  | 
| 15531 | 185  | 
SOME (x, y, rel,r ) => (case r of  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
186  | 
"r+" => (rel, Trans (x,y, Asm ~1), Asm 0)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
187  | 
| "r*" => (rel, RTrans (x,y, Asm ~1), Asm 0)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
188  | 
| _ => raise Cannot)  | 
| 15531 | 189  | 
| NONE => raise Cannot;  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
190  | 
|
| 15098 | 191  | 
(* ************************************************************************ *)  | 
192  | 
(* *)  | 
|
193  | 
(* makeStep (r1, r2): rel * rel -> rel *)  | 
|
194  | 
(* *)  | 
|
195  | 
(* Apply transitivity to r1 and r2, obtaining a new element of r^+ or r^*, *)  | 
|
196  | 
(* according the following rules: *)  | 
|
197  | 
(* *)  | 
|
198  | 
(* ( (a, b) : r^+ , (b,c) : r^+ ) --> (a,c) : r^+ *)  | 
|
199  | 
(* ( (a, b) : r^* , (b,c) : r^+ ) --> (a,c) : r^+ *)  | 
|
200  | 
(* ( (a, b) : r^+ , (b,c) : r^* ) --> (a,c) : r^+ *)  | 
|
201  | 
(* ( (a, b) : r^* , (b,c) : r^* ) --> (a,c) : r^* *)  | 
|
202  | 
(* *)  | 
|
203  | 
(* ************************************************************************ *)  | 
|
204  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
205  | 
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
 | 
206  | 
(* refl. + trans. cls. rules *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
207  | 
| makeStep (RTrans (a,_,p), Trans(_,c,q)) = Trans (a,c, Thm ([p,q], Cls.rtrancl_trancl_trancl))  | 
| 32215 | 208  | 
| makeStep (Trans (a,_,p), RTrans(_,c,q)) = Trans (a,c, Thm ([p,q], Cls.trancl_rtrancl_trancl))  | 
| 15098 | 209  | 
| 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
 | 
210  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
211  | 
(* ******************************************************************* *)  | 
| 
 
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  | 
(* transPath (Clslist, Cls): (rel list * rel) -> rel *)  | 
| 
 
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  | 
(* 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
 | 
216  | 
(* 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
 | 
217  | 
(* 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
 | 
218  | 
(* valid. *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
219  | 
(* *)  | 
| 
 
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  | 
fun transPath ([],acc) = acc  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
223  | 
| transPath (x::xs,acc) = transPath (xs, makeStep(acc,x))  | 
| 32215 | 224  | 
|
| 
15076
 
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  | 
(* Graph functions *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
227  | 
(* ********************************************************************* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
228  | 
|
| 
 
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  | 
(* Functions for constructing graphs *)  | 
| 
 
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  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
233  | 
fun addEdge (v,d,[]) = [(v,d)]  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
234  | 
| 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
 | 
235  | 
else (u,dl):: (addEdge(v,d,el));  | 
| 32215 | 236  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
237  | 
(* ********************************************************************** *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
238  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
239  | 
(* mkGraph constructs from a list of objects of type rel a graph g *)  | 
| 15098 | 240  | 
(* 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
 | 
241  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
242  | 
(* ********************************************************************** *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
243  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
244  | 
fun mkGraph [] = ([],[])  | 
| 32215 | 245  | 
| mkGraph ys =  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
246  | 
let  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
247  | 
fun buildGraph ([],g,zs) = (g,zs)  | 
| 32215 | 248  | 
| buildGraph (x::xs, g, zs) =  | 
249  | 
case x of (Trans (_,_,_)) =>  | 
|
250  | 
buildGraph (xs, addEdge((upper x), [],(addEdge ((lower x),[((upper x),x)],g))), x::zs)  | 
|
251  | 
| _ => buildGraph (xs, addEdge((upper x), [],(addEdge ((lower x),[((upper x),x)],g))), zs)  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
252  | 
in buildGraph (ys, [], []) end;  | 
| 
 
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  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
256  | 
(* 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
 | 
257  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
258  | 
(* List of successors of u in graph g *)  | 
| 
 
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  | 
(* *********************************************************************** *)  | 
| 32215 | 261  | 
|
262  | 
fun adjacent eq_comp ((v,adj)::el) u =  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
263  | 
if eq_comp (u, v) then adj else adjacent eq_comp el u  | 
| 32215 | 264  | 
| adjacent _ [] _ = []  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
265  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
266  | 
(* *********************************************************************** *)  | 
| 
 
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  | 
(* dfs eq_comp g u v: *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
269  | 
(* ('a * 'a -> bool) -> ('a  *( 'a * rel) list) list ->                    *)
 | 
| 32215 | 270  | 
(* 'a -> 'a -> (bool * ('a * rel) list)                                    *)
 | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
271  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
272  | 
(* Depth first search of v from u. *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
273  | 
(* Returns (true, path(u, v)) if successful, otherwise (false, []). *)  | 
| 
 
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  | 
(* *********************************************************************** *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
276  | 
|
| 32215 | 277  | 
fun dfs eq_comp g u v =  | 
278  | 
let  | 
|
| 32740 | 279  | 
val pred = Unsynchronized.ref [];  | 
280  | 
val visited = Unsynchronized.ref [];  | 
|
| 32215 | 281  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
282  | 
fun been_visited v = exists (fn w => eq_comp (w, v)) (!visited)  | 
| 32215 | 283  | 
|
284  | 
fun dfs_visit u' =  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
285  | 
let val _ = visited := u' :: (!visited)  | 
| 32215 | 286  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
287  | 
fun update (x,l) = let val _ = pred := (x,l) ::(!pred) in () end;  | 
| 32215 | 288  | 
|
289  | 
in if been_visited v then ()  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
290  | 
else (app (fn (v',l) => if been_visited v' then () else (  | 
| 32215 | 291  | 
update (v',l);  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
292  | 
dfs_visit v'; ()) )) (adjacent eq_comp g u')  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
293  | 
end  | 
| 32215 | 294  | 
in  | 
295  | 
dfs_visit u;  | 
|
296  | 
if (been_visited v) then (true, (!pred)) else (false , [])  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
297  | 
end;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
298  | 
|
| 
 
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  | 
(* transpose g: *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
302  | 
(* (''a * ''a list) list -> (''a * ''a list) list                          *)
 | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
303  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
304  | 
(* Computes transposed graph g' from g *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
305  | 
(* by reversing all edges u -> v to v -> u *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
306  | 
(* *)  | 
| 
 
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  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
309  | 
fun transpose eq_comp g =  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
310  | 
let  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
311  | 
(* Compute list of reversed edges for each adjacency list *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
312  | 
fun flip (u,(v,l)::el) = (v,(u,l)) :: flip (u,el)  | 
| 32768 | 313  | 
| flip (_,[]) = []  | 
| 32215 | 314  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
315  | 
(* 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
 | 
316  | 
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
 | 
317  | 
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
 | 
318  | 
fun gather (u,(v,w)::el) =  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
319  | 
let  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
320  | 
val (adj,edges) = gather (u,el)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
321  | 
in  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
322  | 
if eq_comp (u, v) then (w::adj,edges)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
323  | 
else (adj,(v,w)::edges)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
324  | 
end  | 
| 32768 | 325  | 
| gather (_,[]) = ([],[])  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
326  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
327  | 
(* 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
 | 
328  | 
nodes in the list of edges *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
329  | 
fun assemble ((u,_)::el) edges =  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
330  | 
let val (adj,edges) = gather (u,edges)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
331  | 
in (u,adj) :: assemble el edges  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
332  | 
end  | 
| 32768 | 333  | 
| assemble [] _ = []  | 
| 
15076
 
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  | 
(* 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
 | 
336  | 
and concatenate these lists. *)  | 
| 32768 | 337  | 
val flipped = maps flip g  | 
| 32215 | 338  | 
|
339  | 
in assemble g flipped end  | 
|
340  | 
||
| 
15076
 
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  | 
(* dfs_reachable eq_comp g u: *)  | 
| 32215 | 344  | 
(* (int * int list) list -> int -> int list *)  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
345  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
346  | 
(* 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
 | 
347  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
348  | 
(* *********************************************************************** *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
349  | 
|
| 32215 | 350  | 
fun dfs_reachable eq_comp g u =  | 
| 
15076
 
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  | 
(* List of vertices which have been visited. *)  | 
| 32768 | 353  | 
val visited = Unsynchronized.ref [];  | 
| 32215 | 354  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
355  | 
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
 | 
356  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
357  | 
fun dfs_visit g u =  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
358  | 
let  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
359  | 
val _ = visited := u :: !visited  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
360  | 
val descendents =  | 
| 46695 | 361  | 
List.foldr (fn ((v,_),ds) => if been_visited v then ds  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
362  | 
else v :: dfs_visit g v @ ds)  | 
| 32768 | 363  | 
[] (adjacent eq_comp g u)  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
364  | 
in descendents end  | 
| 32215 | 365  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
366  | 
in u :: dfs_visit g u end;  | 
| 
 
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  | 
(* dfs_term_reachable g u: *)  | 
| 32215 | 371  | 
(* (term * term list) list -> term -> term list *)  | 
| 
15076
 
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  | 
(* 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
 | 
374  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
375  | 
(* *********************************************************************** *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
376  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
377  | 
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
 | 
378  | 
|
| 32215 | 379  | 
(* ************************************************************************ *)  | 
| 
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  | 
(* findPath x y g: Term.term -> Term.term -> *)  | 
| 32215 | 382  | 
(* (Term.term * (Term.term * rel list) list) -> *)  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
383  | 
(* (bool, rel list) *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
384  | 
(* *)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
385  | 
(* Searches a path from vertex x to vertex y in Graph g, returns true and *)  | 
| 15098 | 386  | 
(* 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
 | 
387  | 
(* *)  | 
| 32215 | 388  | 
(* ************************************************************************ *)  | 
389  | 
||
390  | 
fun findPath x y g =  | 
|
391  | 
let  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
392  | 
val (found, tmp) = dfs (op aconv) g x y ;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
393  | 
val pred = map snd tmp;  | 
| 32215 | 394  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
395  | 
fun path x y =  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
396  | 
let  | 
| 32215 | 397  | 
(* find predecessor u of node v and the edge u -> v *)  | 
398  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
399  | 
fun lookup v [] = raise Cannot  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
400  | 
| lookup v (e::es) = if (upper e) aconv v then e else lookup v es;  | 
| 32215 | 401  | 
|
402  | 
(* traverse path backwards and return list of visited edges *)  | 
|
403  | 
fun rev_path v =  | 
|
404  | 
let val l = lookup v pred  | 
|
405  | 
val u = lower l;  | 
|
406  | 
in  | 
|
407  | 
if u aconv x then [l] else (rev_path u) @ [l]  | 
|
408  | 
end  | 
|
409  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
410  | 
in rev_path y end;  | 
| 32215 | 411  | 
|
412  | 
in  | 
|
413  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
414  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
415  | 
if found then ( (found, (path x y) )) else (found,[])  | 
| 32215 | 416  | 
|
417  | 
||
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
418  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
419  | 
end;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
420  | 
|
| 15098 | 421  | 
(* ************************************************************************ *)  | 
422  | 
(* *)  | 
|
423  | 
(* findRtranclProof g tranclEdges subgoal: *)  | 
|
424  | 
(* (Term.term * (Term.term * rel list) list) -> rel -> proof list *)  | 
|
425  | 
(* *)  | 
|
426  | 
(* Searches in graph g a proof for subgoal. *)  | 
|
427  | 
(* *)  | 
|
428  | 
(* ************************************************************************ *)  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
429  | 
|
| 32215 | 430  | 
fun findRtranclProof g tranclEdges subgoal =  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
431  | 
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
 | 
432  | 
let val (found, path) = findPath (lower subgoal) (upper subgoal) g  | 
| 32215 | 433  | 
in  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
434  | 
if found then (  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
435  | 
let val path' = (transPath (tl path, hd path))  | 
| 32215 | 436  | 
in  | 
437  | 
||
438  | 
case path' of (Trans (_,_,p)) => [Thm ([p], Cls.trancl_into_rtrancl )]  | 
|
439  | 
| _ => [getprf path']  | 
|
440  | 
||
441  | 
end  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
442  | 
)  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
443  | 
else raise Cannot  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
444  | 
end  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
445  | 
)  | 
| 32215 | 446  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
447  | 
| (Trans (x,y,_)) => (  | 
| 32215 | 448  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
449  | 
let  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
450  | 
val Vx = dfs_term_reachable g x;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
451  | 
val g' = transpose (op aconv) g;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
452  | 
val Vy = dfs_term_reachable g' y;  | 
| 32215 | 453  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
454  | 
fun processTranclEdges [] = raise Cannot  | 
| 32215 | 455  | 
| processTranclEdges (e::es) =  | 
| 
36692
 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 
haftmann 
parents: 
35281 
diff
changeset
 | 
456  | 
if member (op =) Vx (upper e) andalso member (op =) Vx (lower e)  | 
| 
 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 
haftmann 
parents: 
35281 
diff
changeset
 | 
457  | 
andalso member (op =) Vy (upper e) andalso member (op =) Vy (lower e)  | 
| 32215 | 458  | 
then (  | 
459  | 
||
460  | 
||
461  | 
if (lower e) aconv x then (  | 
|
462  | 
if (upper e) aconv y then (  | 
|
463  | 
[(getprf e)]  | 
|
464  | 
)  | 
|
465  | 
else (  | 
|
466  | 
let  | 
|
467  | 
val (found,path) = findPath (upper e) y g  | 
|
468  | 
in  | 
|
469  | 
||
470  | 
if found then (  | 
|
471  | 
[getprf (transPath (path, e))]  | 
|
472  | 
) else processTranclEdges es  | 
|
473  | 
||
474  | 
end  | 
|
475  | 
)  | 
|
476  | 
)  | 
|
477  | 
else if (upper e) aconv y then (  | 
|
478  | 
let val (xufound,xupath) = findPath x (lower e) g  | 
|
479  | 
in  | 
|
480  | 
||
481  | 
if xufound then (  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
482  | 
|
| 32215 | 483  | 
let val xuRTranclEdge = transPath (tl xupath, hd xupath)  | 
484  | 
val xyTranclEdge = makeStep(xuRTranclEdge,e)  | 
|
485  | 
||
486  | 
in [getprf xyTranclEdge] end  | 
|
487  | 
||
488  | 
) else processTranclEdges es  | 
|
489  | 
||
490  | 
end  | 
|
491  | 
)  | 
|
492  | 
else (  | 
|
493  | 
||
494  | 
let val (xufound,xupath) = findPath x (lower e) g  | 
|
495  | 
val (vyfound,vypath) = findPath (upper e) y g  | 
|
496  | 
in  | 
|
497  | 
if xufound then (  | 
|
498  | 
if vyfound then (  | 
|
499  | 
let val xuRTranclEdge = transPath (tl xupath, hd xupath)  | 
|
500  | 
val vyRTranclEdge = transPath (tl vypath, hd vypath)  | 
|
501  | 
val xyTranclEdge = makeStep (makeStep(xuRTranclEdge,e),vyRTranclEdge)  | 
|
502  | 
||
503  | 
in [getprf xyTranclEdge] end  | 
|
504  | 
||
505  | 
) else processTranclEdges es  | 
|
506  | 
)  | 
|
507  | 
else processTranclEdges es  | 
|
508  | 
end  | 
|
509  | 
)  | 
|
510  | 
)  | 
|
511  | 
else processTranclEdges es;  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
512  | 
in processTranclEdges tranclEdges end )  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
513  | 
|
| 32215 | 514  | 
|
515  | 
fun solveTrancl (asms, concl) =  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
516  | 
let val (g,_) = mkGraph asms  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
517  | 
in  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
518  | 
let val (_, subgoal, _) = mkconcl_trancl concl  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
519  | 
val (found, path) = findPath (lower subgoal) (upper subgoal) g  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
520  | 
in  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
521  | 
if found then [getprf (transPath (tl path, hd path))]  | 
| 32215 | 522  | 
else raise Cannot  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
523  | 
end  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
524  | 
end;  | 
| 32215 | 525  | 
|
526  | 
fun solveRtrancl (asms, concl) =  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
527  | 
let val (g,tranclEdges) = mkGraph asms  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
528  | 
val (_, subgoal, _) = mkconcl_rtrancl concl  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
529  | 
in  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
530  | 
findRtranclProof g tranclEdges subgoal  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
531  | 
end;  | 
| 32215 | 532  | 
|
533  | 
||
| 
32277
 
ff1e59a15146
trans_tac: use theory from goal state, not the static context, which seems to be outdated under certain circumstances (why?);
 
wenzelm 
parents: 
32215 
diff
changeset
 | 
534  | 
fun trancl_tac ctxt = SUBGOAL (fn (A, n) => fn st =>  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
535  | 
let  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
536  | 
val Hs = Logic.strip_assums_hyp A;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
537  | 
val C = Logic.strip_assums_concl A;  | 
| 46695 | 538  | 
val (rel, _, prf) = mkconcl_trancl C;  | 
| 32215 | 539  | 
|
| 33063 | 540  | 
val prems = flat (map_index (mkasm_trancl rel o swap) Hs);  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
541  | 
val prfs = solveTrancl (prems, C);  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
542  | 
in  | 
| 
59498
 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 
wenzelm 
parents: 
58839 
diff
changeset
 | 
543  | 
  Subgoal.FOCUS (fn {context = ctxt', prems, concl, ...} =>
 | 
| 
35281
 
206e2f1759cc
Fixed bug that caused (r)trancl_tac to crash when the term denoting the relation
 
berghofe 
parents: 
33063 
diff
changeset
 | 
544  | 
let  | 
| 59582 | 545  | 
val SOME (_, _, rel', _) = decomp (Thm.term_of concl);  | 
| 60785 | 546  | 
val thms = map (prove ctxt' rel' prems) prfs  | 
547  | 
in resolve_tac ctxt' [prove ctxt' rel' thms prf] 1 end) ctxt n st  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
548  | 
end  | 
| 
32277
 
ff1e59a15146
trans_tac: use theory from goal state, not the static context, which seems to be outdated under certain circumstances (why?);
 
wenzelm 
parents: 
32215 
diff
changeset
 | 
549  | 
handle Cannot => Seq.empty);  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
550  | 
|
| 32215 | 551  | 
|
552  | 
fun rtrancl_tac ctxt = SUBGOAL (fn (A, n) => fn st =>  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
553  | 
let  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
554  | 
val Hs = Logic.strip_assums_hyp A;  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
555  | 
val C = Logic.strip_assums_concl A;  | 
| 46695 | 556  | 
val (rel, _, prf) = mkconcl_rtrancl C;  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
557  | 
|
| 33063 | 558  | 
val prems = flat (map_index (mkasm_rtrancl rel o swap) Hs);  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
559  | 
val prfs = solveRtrancl (prems, C);  | 
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
560  | 
in  | 
| 
59498
 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 
wenzelm 
parents: 
58839 
diff
changeset
 | 
561  | 
  Subgoal.FOCUS (fn {context = ctxt', prems, concl, ...} =>
 | 
| 
35281
 
206e2f1759cc
Fixed bug that caused (r)trancl_tac to crash when the term denoting the relation
 
berghofe 
parents: 
33063 
diff
changeset
 | 
562  | 
let  | 
| 59582 | 563  | 
val SOME (_, _, rel', _) = decomp (Thm.term_of concl);  | 
| 60785 | 564  | 
val thms = map (prove ctxt' rel' prems) prfs  | 
565  | 
in resolve_tac ctxt' [prove ctxt' rel' thms prf] 1 end) ctxt n st  | 
|
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
566  | 
end  | 
| 43278 | 567  | 
handle Cannot => Seq.empty | General.Subscript => Seq.empty);  | 
| 
15076
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
568  | 
|
| 
 
4b3d280ef06a
New prover for transitive and reflexive-transitive closure of relations.
 
ballarin 
parents:  
diff
changeset
 | 
569  | 
end;  |