module S = Set.Make(String)        (* pentru multimi de siruri *)
module PS = Set.Make(S)                (* multimi de multimi de siruri *)

(* daca ss = {m1, m2, ... mn} multime de multimi
 * parcurge ss și adaugă mulțimile {e} U m1, {e} U m2, ... , {e} U mn *)
          
let addelem e ss = PS.fold (fun s acc -> PS.add (S.add e s) acc) ss ss
(* let addelem e ss = PS.fold (fun s -> s |> S.add e |> PS.add) ss ss *)

(* parcurge s și aplică pasul de mai sus cu fiecare element, pornind de la
 * mulțimea cu 1 element { {} }; fiecare pas va dubla numărul de multimi *)
let powset s = S.fold addelem s (PS.singleton S.empty)

let test = S.of_list ["1";"2";"3"] |> powset |> PS.elements |> List.map S.elements

This document was generated using caml2html