type bit_set = int let empty = Int64.zero let union set1 set2 = Int64.logor set1 set2 let inter set1 set2 = Int64.logand set1 set2 let complement set = Int64.lognot set let diff set1 set2 = inter set1 (complement set2) let subset set1 set2 = diff set2 set1 = empty let equal set1 set2 = set1 = set2 let add x set = union (Int64.shift_left Int64.one x) set let mem x set = inter (Int64.shift_left Int64.one x) set <> empty let rec interval a b = if a > b then [] else a :: interval (a + 1) b let elements set = List.filter (fun x -> mem x set) (interval 0 63);; let set1 = add 1 (add 2 (add 3 empty)) and set2 = add 3 (add 4 (add 5 empty));; elements (union set1 set2);; elements (diff set1 set2);; elements (inter set1 set2);;