# struct_set - Man Page

Procedures for manipulating sets

## Synopsis

`package require `

**Tcl 8.0**

`package require `

**struct::set ?2.2.3?**

**::struct::set empty** *set*

**::struct::set size** *set*

**::struct::set contains** *set item*

**::struct::set union** ?*set1*...?

**::struct::set intersect** ?*set1*...?

**::struct::set difference** *set1 set2*

**::struct::set symdiff** *set1 set2*

**::struct::set intersect3** *set1 set2*

**::struct::set equal** *set1 set2*

**::struct::set include** *svar item*

**::struct::set exclude** *svar item*

**::struct::set add** *svar set*

**::struct::set subtract** *svar set*

**::struct::set subsetof** *A B*

## Description

The **::struct::set** namespace contains several useful commands for processing finite sets.

It exports only a single command, **struct::set**. All functionality provided here can be reached through a subcommand of this command.

*Note:* As of version 2.2 of this package a critcl based C implementation is available. This implementation however requires Tcl 8.4 to run.

## Commands

**::struct::set****empty***set*Returns a boolean value indicating if the

*set*is empty (**true**), or not (**false**).**::struct::set size***set*Returns an integer number greater than or equal to zero. This is the number of elements in the

*set*. In other words, its cardinality.**::struct::set contains***set item*Returns a boolean value indicating if the

*set*contains the element*item*(**true**), or not (**false**).**::struct::set union**?*set1*...?Computes the set containing the union of

*set1*,*set2*, etc., i.e. "*set1*+*set2*+ ...", and returns this set as the result of the command.**::struct::set intersect**?*set1*...?Computes the set containing the intersection of

*set1*,*set2*, etc., i.e. "*set1***set2** ...", and returns this set as the result of the command.**::struct::set difference***set1 set2*Computes the set containing the difference of

*set1*and*set2*, i.e. ("*set1*-*set2*") and returns this set as the result of the command.**::struct::set symdiff***set1 set2*Computes the set containing the symmetric difference of

*set1*and*set2*, i.e. ("(*set1*-*set2*) + (*set2*-*set1*)") and returns this set as the result of the command.**::struct::set intersect3***set1 set2*This command is a combination of the methods

**intersect**and**difference**. It returns a three-element list containing "*set1***set2*", "*set1*-*set2*", and "*set2*-*set1*", in this order. In other words, the intersection of the two parameter sets, and their differences.**::struct::set equal***set1 set2*Returns a boolean value indicating if the two sets are equal (

**true**) or not (**false**).**::struct::set include***svar item*The element

*item*is added to the set specified by the variable name in*svar*. The return value of the command is empty. This is the equivalent of**lappend**for sets. If the variable named by*svar*does not exist it will be created.**::struct::set exclude***svar item*The element

*item*is removed from the set specified by the variable name in*svar*. The return value of the command is empty. This is a near-equivalent of**lreplace**for sets.**::struct::set add***svar set*All the element of

*set*are added to the set specified by the variable name in*svar*. The return value of the command is empty. This is like the method**include**, but for the addition of a whole set. If the variable named by*svar*does not exist it will be created.**::struct::set subtract***svar set*All the element of

*set*are removed from the set specified by the variable name in*svar*. The return value of the command is empty. This is like the method**exclude**, but for the removal of a whole set.**::struct::set subsetof***A B*Returns a boolean value indicating if the set

*A*is a true subset of or equal to the set*B*(**true**), or not (**false**).

## References

## Bugs, Ideas, Feedback

This document, and the package it describes, will undoubtedly contain bugs and other problems. Please report such in the category *struct :: set* of the *Tcllib Trackers* [http://core.tcl.tk/tcllib/reportlist]. Please also report any ideas for enhancements you may have for either package and/or documentation.

When proposing code changes, please provide *unified diffs*, i.e the output of **diff -u**.

Note further that *attachments* are strongly preferred over inlined patches. Attachments can be made by going to the **Edit** form of the ticket immediately after its creation, and then using the left-most button in the secondary navigation bar.

## Keywords

cardinality, difference, emptiness, exclusion, inclusion, intersection, membership, set, symmetric difference, union

## Category

Data structures

## Copyright

Copyright (c) 2004-2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>