The following is a proposed implementation of a cartesian product 
method for the set class. Comments and suggestions would be welcome.

require 'set'
require 'tuple'

class Set
   def cproduct(set)
     set3 = Set.new
     self.each do |ae|
       set.each do |be|
         set3.add(Tuple.new(ae, be))
       end
     end
     set3
   end
end

tuple.rb is from the Seattle Ruby Brigade's Ruby Audit, which can be 
downloaded here:

http://sourceforge.net/project/showfiles.php?group_id=50485

The Tuple class creates immutable arrays. Methods that would modify the 
object in place return an error for attempted modification of a frozen 
object. A deepfreeze method is also added to Enumerable so that the 
Tuple object can't be unfrozen.