X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2Fcontribs%2Fformal_topology%2Fbin%2Ftheory_explorer.ml;h=57cac115bdb559d74cd506c5de5820cb7308b6c0;hb=246f6c5ab89ddbec94dec411ba00daf987214688;hp=5d3098d019c05889e462aba658f150a021bb74d4;hpb=4fd0802f846c1c011c9d393747b11d2bbc582269;p=helm.git diff --git a/helm/software/matita/contribs/formal_topology/bin/theory_explorer.ml b/helm/software/matita/contribs/formal_topology/bin/theory_explorer.ml index 5d3098d01..57cac115b 100644 --- a/helm/software/matita/contribs/formal_topology/bin/theory_explorer.ml +++ b/helm/software/matita/contribs/formal_topology/bin/theory_explorer.ml @@ -36,6 +36,9 @@ type equivalence_class = compound_operator * compound_operator list * equivalence_class list ref * equivalence_class list ref +let (===) (repr,_,_,_) (repr',_,_,_) = repr = repr';; +let (<=>) (repr,_,_,_) (repr',_,_,_) = repr <> repr';; + let string_of_equivalence_class (repr,others,leq,_) = String.concat " = " (List.map string_of_cop (repr::others)) ^ (if !leq <> [] then @@ -114,7 +117,8 @@ let ps_of_set (to_be_considered,under_consideration,news) ?processing (s,inf,sup close_out ch; (*ignore (Unix.system "tred xxx.dot > yyy.dot && dot -Tps yyy.dot > xxx.ps")*) ignore (Unix.system "dot -Tps xxx.dot > xxx.ps"); - ignore (read_line ()) + (*ignore (read_line ())*) +;; let test to_be_considered_and_now ((s,_,_) as set) rel candidate repr = ps_of_set to_be_considered_and_now ~processing:(candidate,rel,repr) set; @@ -161,7 +165,7 @@ let test to_be_considered_and_now ((s,_,_) as set) rel candidate repr = print_endline (if res then "y" else "n"); res -let remove node = List.filter (fun node' -> node != node');; +let remove node = List.filter (fun node' -> node <=> node');; let add_leq_arc ((_,_,leq,_) as node) ((_,_,_,geq') as node') = leq := node' :: !leq; @@ -215,7 +219,21 @@ let geq_transitive_closure node node' = remove_transitive_arcs node node' ;; -let (@@) l1 e = if List.memq e l1 then l1 else l1@[e] +let (@@) l1 n = if List.exists (function n' -> n===n') l1 then l1 else l1@[n] + +let rec leq_reachable node = + function + [] -> false + | node'::_ when node === node' -> true + | (_,_,leq,_)::tl -> leq_reachable node (!leq@tl) +;; + +let rec geq_reachable node = + function + [] -> false + | node'::_ when node === node' -> true + | (_,_,_,geq)::tl -> geq_reachable node (!geq@tl) +;; let locate_using_leq to_be_considered_and_now ((repr,_,leq,_) as node) ((_,_,sup) as set) @@ -229,9 +247,9 @@ let locate_using_leq to_be_considered_and_now ((repr,_,leq,_) as node) set | (repr',_,_,geq') as node' :: tl -> if repr=repr' then aux is_sup set (!geq'@tl) - else if List.mem node' !leq - || test to_be_considered_and_now set SubsetEqual repr repr' - then + else if leq_reachable node' !leq then + aux is_sup set tl + else if test to_be_considered_and_now set SubsetEqual repr repr' then begin let inf = if !geq' = [] then (remove node' inf)@@node else inf in leq_transitive_closure node node'; @@ -258,11 +276,11 @@ let locate_using_geq to_be_considered_and_now ((repr,_,leq,geq) as node) set | (repr',_,leq',_) as node' :: tl -> if repr=repr' then aux is_inf set (!leq'@tl) - else if List.mem node' !geq - || test to_be_considered_and_now set SupersetEqual repr repr' - then + else if geq_reachable node' !geq then + aux is_inf set tl + else if test to_be_considered_and_now set SupersetEqual repr repr' then begin - if List.mem node' !leq then + if List.exists (function n -> n===node') !leq then (* We have found two equal nodes! *) raise (SameEquivalenceClass (node,node')) else @@ -299,12 +317,12 @@ let analyze_one to_be_considered repr hecandidate (news,((nodes,inf,sup) as set) function [] -> [] | (repr',others,leq,geq) as node::tl -> - leq := List.filter (function node -> node_to_be_deleted != node) !leq; - geq := List.filter (function node -> node_to_be_deleted != node) !geq; - if node==node' then + leq:= List.filter (function node -> node_to_be_deleted <=> node) !leq; + geq:= List.filter (function node -> node_to_be_deleted <=> node) !geq; + if node===node' then (repr',others@[candidate],leq,geq)::clean tl else - (repr',others,leq,geq)::clean tl + node::clean tl in let nodes = clean nodes in news,(nodes,inf,sup)