## Main Features

### A Clear Inheritance Structure

# Sets require elements to be unique and order doesn't matter Set$new(1, 2, 1) == Set$new(1, 2) #> [1] TRUE Set$new(1, 2) == Set$new(2, 1) #> [1] TRUE # But tuples can enforce these restrictions Tuple$new(1, 2, 1) != Tuple$new(1, 2) #> [1] TRUE Tuple$new(1, 2) != Tuple$new(2, 1) #> [1] TRUE # Fuzzy sets and tuples extend sets further f = FuzzySet$new(1, 0, 2, 0.6, 3, 1) f$inclusion(1) #> [1] "Not Included" f$inclusion(2) #> [1] "Partially Included" f$inclusion(3) #> [1] "Fully Included" # Symbolic intervals provide a clean way to represent infinite sets Interval$new() #> [-∞,+∞] # Different closure types and classes are possible Interval$new(1, 7, type = "(]") # half-open #> (1,7] Interval$new(1, 7, class = "integer") == Set$new(1:7) #> [1] TRUE # And SpecialSets inheriting from these intervals Reals$new() #> ℝ PosRationals$new() #> ℚ+

### Set operations

# Union Set$new(1, 4, "a", "b") + Set$new(5) #> {1, 4,...,b, 5} Interval$new(1, 5) + FuzzyTuple$new(1, 0.6) #> [1,5] # Power Set$new(1:5)^2 #> {1, 2,...,4, 5}^2 # A symbolic representation is also possible setpower(Set$new(1:5), power = 2, simplify = FALSE) #> {1, 2,...,4, 5}^2 Reals$new()^5 #> ℝ^5 # Product Set$new(1,2) * Set$new(5, 6) #> {1, 2} × {5, 6} Interval$new(1,5) * Tuple$new(3) #> [1,5] × (3) # Intersection Set$new(1:5) & Set$new(4:10) #> {4, 5} ConditionalSet$new(function(x) x == 0) & Set$new(-2:2) #> {0} Interval$new(1, 10) & Set$new(5:6) #> {5, 6} # Difference Interval$new(1, 10) - Set$new(5) #> [1,5) ∪ (5,10] Set$new(1:5) - Set$new(2:3) #> {1, 4, 5}

### Containedness and Comparators

Interval$new(1, 10)$contains(5) #> [1] TRUE # check multiple elements Interval$new(1, 10)$contains(8:12) #> [1] TRUE TRUE TRUE FALSE FALSE # only return TRUE if all are TRUE Interval$new(1, 10)$contains(8:12, all = TRUE) #> [1] FALSE # decide whether open bounds should be included Interval$new(1, 10, type = "()")$contains(10, bound = TRUE) #> [1] TRUE Interval$new(1, 10, type = "()")$contains(10, bound = TRUE) #> [1] TRUE Interval$new(1, 5, class = "numeric")$equals(Set$new(1:5)) #> [1] FALSE Interval$new(1, 5, class = "integer")$equals(Set$new(1:5)) #> [1] TRUE Set$new(1) == FuzzySet$new(1, 1) #> [1] TRUE # proper subsets Set$new(1:3)$isSubset(Set$new(1), proper = TRUE) #> [1] TRUE Set$new(1) < Set$new(1:3) #> [1] TRUE # (non-proper) subsets Set$new(1:3)$isSubset(Set$new(1:3), proper = FALSE) #> [1] TRUE Set$new(1:3) <= Set$new(1:3) #> [1] TRUE # multi-dimensional checks x = PosReals$new()^2 x$contains(list(Tuple$new(1, 1), Tuple$new(-2, 3))) #> [1] TRUE FALSE