 /// - Note: A type conforming to `SetAlgebraType` can implement any of
 ///   these initializers or methods, and those implementations will be
 ///   used in lieu of these defaults.
-extension SetAlgebraType {
-  /// The set containing all elements of `sequence`.
+extension SetAlgebraType where DefaultImplementations == () {
+  /// Creates the set containing all elements of `sequence`.
   public init<
     S : SequenceType where S.Generator.Element == Element
   >(_ sequence: S) {

  /// - Postcondition: `self.isSupersetOf(other)`
  mutating func unionInPlace(other: Self)

  /// Remove all elements of `self` that are not also present in
  /// `other`.
  ///
  /// - Equivalent to replacing `self` with `self.intersect(other)`
  /// - Postcondition: `self.isSubsetOf(other)`
  mutating func intersectInPlace(other: Self)

  /// Replace `self` with a set containing all elements contained in
  /// either `self` or `other`, but not both.
  ///
  /// - Equivalent to replacing `self` with `self.exclusiveOr(other)`
  mutating func exclusiveOrInPlace(other: Self)  
}

/// `SetAlgebraType` requirements for which default implementations

///   - `x.isSubsetOf(y)` iff `y.isSupersetOf(x)`
///   - `x.isStrictSupersetOf(y)` iff `x.isSupersetOf(y) && x != y`
///   - `x.isStrictSubsetOf(y)` iff `x.isSubsetOf(y) && x != y`
public protocol SetAlgebraType : Equatable, ArrayLiteralConvertible {

  typealias DefaultImplementations = ()

  /// A type for which `Self` provides a containment test.
  typealias Element
  
  /// Creates an empty set.
  ///
  /// - Equivalent to `[] as Self`
  init()
