From 910aafd5803c65fd7dd0308eccdc132753c4c189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vouillon?= Date: Sat, 10 May 1997 15:38:17 +0000 Subject: [PATCH] Ajout de la fonction [subset]. git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1519 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/set.ml | 16 ++++++++++++++++ stdlib/set.mli | 3 +++ 2 files changed, 19 insertions(+) diff --git a/stdlib/set.ml b/stdlib/set.ml index cb0635850..a6230863d 100644 --- a/stdlib/set.ml +++ b/stdlib/set.ml @@ -33,6 +33,7 @@ module type S = val diff: t -> t -> t val compare: t -> t -> int val equal: t -> t -> bool + val subset: t -> t -> bool val iter: (elt -> 'a) -> t -> unit val fold: (elt -> 'a -> 'a) -> t -> 'a -> 'a val cardinal: t -> int @@ -217,6 +218,21 @@ module Make(Ord: OrderedType) = let equal s1 s2 = compare s1 s2 = 0 + let rec subset s1 s2 = + match (s1, s2) with + Empty, _ -> + true + | _, Empty -> + false + | Node (l1, v1, r1, _), (Node (l2, v2, r2, _) as t2) -> + let c = Ord.compare v1 v2 in + if c = 0 then + subset l1 l2 && subset r1 r2 + else if c < 0 then + subset (Node (l1, v1, Empty, 0)) l2 && subset r1 t2 + else + subset (Node (Empty, v1, r1, 0)) r2 && subset l1 t2 + let rec iter f = function Empty -> () | Node(l, v, r, _) -> iter f l; f v; iter f r diff --git a/stdlib/set.mli b/stdlib/set.mli index ded5a9bd4..53468d268 100644 --- a/stdlib/set.mli +++ b/stdlib/set.mli @@ -64,6 +64,9 @@ module type S = val equal: t -> t -> bool (* [equal s1 s2] tests whether the sets [s1] and [s2] are equal, that is, contain the same elements. *) + val subset: t -> t -> bool + (* [subset s1 s2] tests whether the set [s1] is a subset of + the set [s2]. *) val iter: (elt -> 'a) -> t -> unit (* [iter f s] applies [f] in turn to all elements of [s], and discards the results. The elements of [s] are presented to [f]