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