% generate the size-M combinations from 0 to n-1 combinations = iter (m, n: int) yields (sequence[int]) if m<=n then state: array[int] := array[int]$predict(1, m) for i: int in int$from_to(0, m-1) do array[int]$addh(state, i) end i: int := m while i>0 do yield (sequence[int]$a2s(state)) i := m while i>0 do state[i] := state[i] + 1 for j: int in int$from_to(i,m-1) do state[j+1] := state[j] + 1 end if state[i] < n-(m-i) then break end i := i - 1 end end end end combinations % print a combination print_comb = proc (s: stream, comb: sequence[int]) for i: int in sequence[int]$elements(comb) do stream$puts(s, int$unparse(i) || " ") end end print_comb start_up = proc () po: stream := stream$primary_output() for comb: sequence[int] in combinations(3, 5) do print_comb(po, comb) stream$putl(po, "") end end start_up