# Associative Set Operations¶

This README describes some initial support for set operations on associative domains. It is expected that the features described here will be included in a future version of the language specification.

## Associative Domain Set Operations¶

The following set functions/operations are supported by associative domains. In the following code examples, `A`, `B`, and `C` are associative domains. For every operator, an op= variant exists. For these op= functions, LHS op= RHS, the LHS argument is modified in-place using the same rules as the normal operator function.

### isSubset¶

```proc isSubset(super : domain) : bool;

A.isSubset(B);
```

This statement will return true if `A` is a subset of `B`. `A` is a subset of `B` if every index in `A` is also present in `B`.

### isSuper¶

```proc isSuper(sub : domain) : bool;

A.isSuper(B);
```

This statement will return true if `B` is a subset of `A`.

### Union¶

```C = A + B;
C = A | B;
```

`C` will be a new associative domain which contains every index in `A` and every index in `B`.

The op= variants are:

```A |= B;
A += B;
```

### Difference¶

```C = A - B;
```

`C` will contain the indices in `A` that are not also in `B`.

The op= variant is:

```A -= B;
```

Any indices in both `A` and `B` will be removed from `A`.

### Intersection¶

```C = A & B;
```

`C` will contain the indices in `A` that are also in `B`.

The op= variant is:

```A &= B;
```

### Symmetric Difference¶

```C = A ^ B;
```

`C` will contain the indices that are unique to `A` and unique to `B`. Another way of writing this statement is:

```C = (A + B) - (A & B)
```

The op= variant is:

```A ^= B;
```