 public struct Vertex: SetType, Comparable {
     public let id: Int
     public let label: String
+    
+    // TODO Vertex should be abstract.
+    //      Extract product structure.
     private let _components: [Vertex] // for product-vertex
     
     private init(_ label: String, _ components: [Vertex]) {

        if let v = productList[key] {
            return v
        } else {
            let label = "v(\(components.map{"\($0.id)"}.joined(separator: ",")))"
            let v = Vertex(label, components)
            productList[key] = v
            return v

    }
    
    public init(prefix: String = "v") {
        self.init(Format.symbol(prefix, list.count))
    }
    
    public var hashValue: Int {
