X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Futils%2FfiniteCofinite.ml;h=2bfe70c63e703721acf98efad34afdb4558d9d95;hp=8d3c3ee4f23434956e4467a8951348836e77687b;hb=03b6a364e7240ca827585e7baff225a0aaa33bc6;hpb=30bc0bb1291426e5e26eb2dee1ffc41e4c246349 diff --git a/src/utils/finiteCofinite.ml b/src/utils/finiteCofinite.ml index 8d3c3ee..2bfe70c 100644 --- a/src/utils/finiteCofinite.ml +++ b/src/utils/finiteCofinite.ml @@ -14,15 +14,15 @@ (***********************************************************************) (* - Time-stamp: + Time-stamp: *) INCLUDE "utils.ml" -include Sigs.FINITECOFINITE +include FiniteCofinite_sig module type HConsBuilder = - functor (H : Sigs.AUX.HashedType) -> Hcons.S with type data = H.t + functor (H : Common_sig.HashedType) -> Hcons.S with type data = H.t module Builder (HCB : HConsBuilder) (E : Ptset.S) : S with type elt = E.elt and type set = E.t = @@ -34,9 +34,9 @@ struct type t = node let equal a b = match a, b with - Finite (s1), Finite (s2) - | CoFinite (s1), CoFinite (s2) -> E.equal s1 s2 - | _ -> false + Finite s1, Finite s2 + | CoFinite s1, CoFinite s2 -> E.equal s1 s2 + | (Finite _| CoFinite _), _ -> false let hash = function | Finite s -> HASHINT2 (PRIME1, E.hash s) @@ -48,20 +48,21 @@ struct let finite x = make (Finite x) let cofinite x = make (CoFinite x) - let is_empty = function - | { node = Finite s } when E.is_empty s -> true - | _ -> false + let is_empty t = match t.node with + | Finite s -> E.is_empty s + | CoFinite _ -> false - let is_any = function - | { node = CoFinite s } when E.is_empty s -> true - | _ -> false + let is_any t = match t.node with + | CoFinite s -> E.is_empty s + | Finite _ -> false let is_finite t = match t.node with - | Finite _ -> true | _ -> false + | Finite _ -> true + | CoFinite _ -> false let kind t = match t.node with | Finite _ -> `Finite - | _ -> `Cofinite + | CoFinite _ -> `Cofinite let mem x t = match t.node with | Finite s -> E.mem x s @@ -124,21 +125,21 @@ struct let rec next_finite_cofinite facc cacc = function | [] -> finite facc, cofinite (E.diff cacc facc) - | { node = Finite s } ::r -> + | { node = Finite s; _ } ::r -> next_finite_cofinite (E.union s facc) cacc r - | { node = CoFinite _ } ::r when E.is_empty cacc -> + | { node = CoFinite _ ; _ } ::r when E.is_empty cacc -> next_finite_cofinite facc cacc r - | { node = CoFinite s } ::r -> + | { node = CoFinite s; _ } ::r -> next_finite_cofinite facc (E.inter cacc s) r in let rec first_cofinite facc = function | [] -> empty,empty - | { node = Finite s } :: r-> first_cofinite (E.union s facc) r - | { node = CoFinite s } :: r -> next_finite_cofinite facc s r + | { node = Finite s ; _ } :: r-> first_cofinite (E.union s facc) r + | { node = CoFinite s ; _ } :: r -> next_finite_cofinite facc s r in first_cofinite E.empty l - let exn = Sigs.FINITECOFINITE.InfiniteSet + let exn = FiniteCofinite_sig.InfiniteSet let fold f t a = match t.node with | Finite s -> E.fold f s a @@ -177,42 +178,40 @@ struct let choose t = match t.node with Finite s -> E.choose s - | _ -> raise exn + | CoFinite _ -> raise exn let is_singleton t = match t.node with | Finite s -> E.is_singleton s - | _ -> false + | CoFinite _ -> false let intersect s t = match s.node, t.node with | Finite s, Finite t -> E.intersect s t | CoFinite s, Finite t -> not (E.subset t s) | Finite s, CoFinite t -> not (E.subset s t) - | CoFinite s, CoFinite t -> true + | CoFinite _ , CoFinite _ -> true let split x s = match s.node with | Finite s -> let s1, b, s2 = E.split x s in finite s1, b, finite s2 - | _ -> raise exn + | CoFinite _ -> raise exn let min_elt s = match s.node with | Finite s -> E.min_elt s - | _ -> raise exn + | CoFinite _ -> raise exn let max_elt s = match s.node with | Finite s -> E.min_elt s - | _ -> raise exn + | CoFinite _ -> raise exn - let positive t = - match t.node with + let positive t = match t.node with | Finite x -> x - | _ -> E.empty + | CoFinite _ -> E.empty - let negative t = - match t.node with + let negative t = match t.node with | CoFinite x -> x - | _ -> E.empty + | Finite _ -> E.empty let inj_positive t = finite t let inj_negative t = cofinite t