Tuple generator

if 0 {Richard Suchenwirth 2004-03-19 - I needed to generate lists of n-tuples from a set, i.e. subsets of fixed length (pairs, triples, ...) in canonical (lexicographic) ordering, like the pairs over {a b c d} being

 {a b} {a c} {a d} {b c} {b d} {c d}.

Here's code that does that for different values of n:}

 proc tuples {n set} {
    if {$n == 1} {return $set}
    set res {}
    incr n -1
    foreach i [lrange $set 0 end-$n] {
        set set [lrange $set 1 end]
        foreach t [tuples $n $set] {
           lappend res [linsert $t 0 $i]
        }
    }
    set res
 }

 % tuples 3 {a b c d}
 {a b c} {a b d} {a c d} {b c d}
 % tuples 4 {a b c d e}
 {a b c d} {a b c e} {a b d e} {a c d e} {b c d e}
 % tuples 2 {a b c d}
 {a b} {a c} {a d} {b c} {b d} {c d}