(* ps *) fun add_element e l = e::l; fun ps1 [] = [[]] |ps1 (h::t) = let val p = ps1 t in p @ map (add_element h) p end; fun ps2 [] base = [base] |ps2 (e::s) base = (ps2 s base) @ (ps2 s (e::base));