Returns the cartesian product of objects inheriting from class Set
.
setproduct(..., simplify = FALSE, nest = FALSE) # S3 method for Set *(x, y)
... | Sets |
---|---|
simplify | logical, if |
nest | logical, if |
x, y |
Either an object of class ProductSet
or an unwrapped object inheriting from Set
.
The cartesian product of multiple sets, the 'n-ary Cartesian product', is often
implemented in programming languages as being identical to the cartesian product of two sets applied recursively.
However, for sets \(X, Y, Z\),
$$XYZ \ne (XY)Z$$
This is accommodated with the nest
argument. If nest == TRUE
then \(X*Y*Z == (X × Y) × Z\), i.e. the cartesian
product for two sets is applied recursively. If nest == FALSE
then \(X*Y*Z == (X × Y × Z)\) and
the n-ary cartesian product is computed. As it appears the latter (n-ary product) is more common, nest = FALSE
is the default. The N-ary cartesian product of \(N\) sets, \(X1,...,XN\), is defined as
$$X1 × ... × XN = \\{(x1,...,xN) : x1 \epsilon X1 \cap ... \cap xN \epsilon XN\\}$$
where \((x1,...,xN)\) is a tuple.
The product of fuzzy and crisp sets first coerces fuzzy sets to crisp sets by finding their support.
Other operators:
powerset()
,
setcomplement()
,
setintersect()
,
setpower()
,
setsymdiff()
,
setunion()
# difference between nesting Set$new(1, 2) * Set$new(2, 3) * Set$new(4, 5) #> {1, 2} × {2, 3} × {4, 5} setproduct(Set$new(1, 2) * Set$new(2, 3), Set$new(4, 5), nest = FALSE) # same as above #> {1, 2} × {2, 3} × {4, 5} setproduct(Set$new(1, 2) * Set$new(2, 3), Set$new(4, 5), nest = TRUE) #> ({1, 2} × {2, 3}) × {4, 5} unnest_set <- setproduct(Set$new(1, 2) * Set$new(2, 3), Set$new(4, 5), nest = FALSE) nest_set <- setproduct(Set$new(1, 2) * Set$new(2, 3), Set$new(4, 5), nest = TRUE) # note the difference when using contains unnest_set$contains(Tuple$new(1, 3, 5)) #> [1] TRUE nest_set$contains(Tuple$new(Tuple$new(1, 3), 5)) #> [1] TRUE # product of two sets Set$new(-2:4) * Set$new(2:5) #> {-1, -2,...,3, 4} × {2, 3, 4, 5} setproduct(Set$new(1, 4, "a"), Set$new("a", 6)) #> {1, 4, a} × {6, a} setproduct(Set$new(1, 4, "a"), Set$new("a", 6), simplify = TRUE) #> {(1, 6), (1, a),...,(a, 6), (a, a)} # product of two intervals Interval$new(1, 10) * Interval$new(5, 15) #> [1,10] × [5,15] Interval$new(1, 2, type = "()") * Interval$new(2, 3, type = "(]") #> (1,2) × (2,3] Interval$new(1, 5, class = "integer") * Interval$new(2, 7, class = "integer") #> {1,...,5} × {2,...,7} # product of mixed set types Set$new(1:10) * Interval$new(5, 15) #> {1, 10,...,8, 9} × [5,15] Set$new(5, 7) * Tuple$new(6, 8, 7) #> {5, 7} × (6, 8, 7) FuzzySet$new(1, 0.1) * Set$new(2) #> {1(0.1)} × {2} # product of FuzzySet FuzzySet$new(1, 0.1, 2, 0.5) * Set$new(2:5) #> {1(0.1), 2(0.5)} × {2, 3, 4, 5} # product of conditional sets ConditionalSet$new(function(x, y) x >= y) * ConditionalSet$new(function(x, y) x == y) #> {x ∈ 𝕍, y ∈ 𝕍 : x >= y} × {x ∈ 𝕍, y ∈ 𝕍 : x == y} # product of special sets PosReals$new() * NegReals$new() #> ℝ+ × ℝ-