Returns the cartesian product of objects inheriting from class Set.

setproduct(..., simplify = FALSE, nest = FALSE)

# S3 method for Set
*(x, y)

## Arguments

... Sets logical, if TRUE returns the result in its simplest (unwrapped) form, usually a Set otherwise a ProductSet. logical, if FALSE (default) then will treat any ProductSets passed to ... as unwrapped Sets. See details and examples. Set

## Value

Either an object of class ProductSet or an unwrapped object inheriting from Set.

## Details

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()

## Examples

# 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)) #>  TRUEnest_set$contains(Tuple$new(Tuple$new(1, 3), 5))
#>  TRUE
# product of two sets
Set$new(-2:4) * Set$new(2:5)
#> {-2, -1,...,3, 4} × {2, 3, 4, 5} setproduct(Set$new(1, 4, "a"), Set$new("a", 6))
#> {1, 4, a} × {a, 6} setproduct(Set$new(1, 4, "a"), Set$new("a", 6), simplify = TRUE)
#> {(1, a), (4, a),...,(4, 6), (a, 6)}
# 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, 2,...,9, 10} × [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 ∈ V, y ∈ V} × {x == y : x ∈ V, y ∈ V}
# product of special sets
PosReals$new() * NegReals$new()
#> ℝ+ × ℝ-