X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fcommon%2Fhierarchy.ml;h=b7d4283539c394e2d35ee5c65fbb977c03eb1317;hb=f7839175bf6024d8c7d0c481ee3c8da8393e2ff3;hp=375390bdca10aec79410cef305c2345c2a6735e2;hpb=79684e8bd0f54b5c88fff981366bd8c78dd0fbe9;p=helm.git diff --git a/helm/software/lambda-delta/common/hierarchy.ml b/helm/software/lambda-delta/common/hierarchy.ml index 375390bdc..b7d428353 100644 --- a/helm/software/lambda-delta/common/hierarchy.ml +++ b/helm/software/lambda-delta/common/hierarchy.ml @@ -15,29 +15,50 @@ module C = Cps type graph = string * (int -> int) -let sorts = 2 +let sorts = 3 let sort = H.create sorts +let default_graph = "Z1" + (* Internal functions *******************************************************) -let set_sort f (h:int) (s:string) = - H.add sort h s; f (succ h) +let set_sort h s = + H.add sort h s; succ h + +let graph_of_string err f s = + try + let x = S.sscanf s "Z%u" C.start in + if x > 0 then f (s, fun h -> x + h) else err () + with + S.Scan_failure _ | Failure _ | End_of_file -> err () + +let graph = ref (graph_of_string C.err C.start default_graph) (* Interface functions ******************************************************) -let set_sorts f ss i = - C.list_fold_left f set_sort i ss +let set_sorts i ss = + List.fold_left set_sort i ss -let get_sort err f h = +let string_of_sort err f h = try f (H.find sort h) with Not_found -> err () -let string_of_graph f (s, _) = f s +let sort_of_string err f s = + let map h n = function + | None when n = s -> Some h + | xh -> xh + in + match H.fold map sort None with + | None -> err () + | Some h -> f h -let apply f (_, g) h = f (g h) +let string_of_graph () = fst !graph -let graph_of_string err f s = - try - let x = S.sscanf s "Z%u" C.start in - if x > 0 then f (s, fun h -> x + h) else err () - with - S.Scan_failure _ | Failure _ | End_of_file -> err () +let apply h = snd !graph h + +let set_graph s = + let err () = false in + let f g = graph := g; true in + graph_of_string err f s + +let clear () = + H.clear sort; graph := graph_of_string C.err C.start default_graph