module S = Set.Make(String)
module StrList = struct (* modul pentru mulțimi de liste de șiruri *)
  type t = string list
  let compare = compare
end
module LS = Set.Make(StrList)

(* addhd h { l1, l2, ... lk } init = init U { h::l1, h::l2, ... h :: lk } *)

(* addhd h face fold pe o mulțime de liste, cu acumulator mulțime de liste
 * pasul de prelucrare (pentru fiecare listă lst) modifică acumulatorul astfel:
 * adaugă la el lista cu cap h în fața lui lst (elementul curent parcurs) *)
let addhd h = LS.fold (fun lst -> LS.add (h :: lst))

(* m: mulțime (de întregi); rezultat: mulțimea permutărilor (liste) *)
let rec perm m =        (* fold o aplică recursiv la mulțimi cu 1 mai mici *)
  (* fold parcurge m și aplică acumulatorului (mulțime de liste) funcția:
   * scoate el din m, fă permutările, pune el în fața fiecăreia, adaugă-le *)
  if S.is_empty m then LS.singleton []         (* 0! = 1 permutare, lista vidă *)
  else S.fold (fun el -> S.remove el m |> perm |> addhd el) m LS.empty
                 
let s123 = S.(empty |> add "1" |> add "2" |> add "3")

let perml = perm s123 |> LS.elements
                                                     

This document was generated using caml2html