Set = {} Set.mt = {} -- metatable for sets function Set.mt.__add (a,b) local res = Set.new{} for k in pairs(a) do res[k] = true end for k in pairs(b) do res[k] = true end return res end function Set.mt.__mul (a,b) local res = Set.new{} for k in pairs(a) do res[k] = b[k] end return res end function Set.mt.__le (a,b) -- set containment for k in pairs(a) do if not b[k] then return false end end return true end function Set.mt.__lt (a,b) return a <= b and not (b <= a) end function Set.mt.__eq (a,b) return a <= b and b <= a end function Set.mt.__tostring (set) local s = "{" local sep = "" for e in pairs(set) do s = s .. sep .. e sep = ", " end return s .. "}" end function Set.new (t) local set = {} setmetatable(set, Set.mt) for _, l in ipairs(t) do set[l] = true end return set end -- some examples s1 = Set.new{10, 20, 30, 50} s2 = Set.new{30, 1} s3 = s1 + s2 print(s3) --> {10, 30, 20, 1, 50} print((s1 + s2)*s1) --> {10, 20, 30, 50} s1 = Set.new{2, 4} s2 = Set.new{4, 10, 2} print(s1 <= s2) --> true print(s1 < s2) --> true print(s1 >= s1) --> true print(s1 > s1) --> false print(s1 == s2 * s1) --> true