public Lattice getJoinReduction() {
        if (!this.containsConcepts()) {
            return null;
        }
        if (!this.containsAllSetA()) {
            return null;
        }
        Lattice lattice = new Lattice();
        //ConceptLattice csl = new ConceptLattice (this);
        ConceptLattice csl = this.copy();
        csl.makeIrreduciblesReduction();
        TreeSet<Node> joinIrr = csl.joinIrreducibles();
        // addition to lattice of a comparable issued from each reduced closed set
        TreeMap<Node, Node> reduced = new TreeMap<Node, Node>();
        for (Node n : csl.getNodes()) {
            Concept c = (Concept) n;
            Node nred;
            if (c.hasSetA() && joinIrr.contains(n)) {
                nred = new Node(c.getSetA().first());
            } else {
                nred = new Node();
            }
            reduced.put(n, nred);
        }
        // addtion of nodes to lattice
        for (Node n : csl.getNodes()) {
            lattice.addNode(reduced.get(n));
        }
        // addtion of edges to lattice
        for (Node from : csl.getNodes()) {
            for (Node to : csl.getSuccessorNodes(from)) {
                lattice.addEdge(reduced.get(from), reduced.get(to));
            }
        }
        return lattice;
    }