public void buildLattice(FcaTree tree, FcaMatrix matrix) { FcaObjectSet A = new FcaObjectSet(); FcaObjectSet G = matrix.UltimateSet(); List<FcaObjectSet> sup = minimal(A, G, matrix); // множесво всех возможных соседей в решетке head = A; AllSets = tree.returnListOfSets(tree); int i = AllSetsContains(G); if (i == -1) { addAllSets(G); i = AllSetsContains(G); } tail = AllSets[i]; foreach (FcaObjectSet obj in sup) { i = AllSetsContains(obj); FcaObjectSet existObject = AllSets[i]; A.addASupr(existObject); existObject.addAInf(A); addVisited(existObject); } // найти связь между 1 и 123. while (Visited.Count != 0) { List<FcaObjectSet> list = Visited.ToList<FcaObjectSet>(); foreach (FcaObjectSet s in list) { sup = minimal(s, G, matrix); // множесво всех возможных соседей в решетке Visited.Remove(s); foreach (FcaObjectSet obj in sup) { i = AllSetsContains(obj); if (i == -1) { addAllSets(obj); i = AllSetsContains(obj); } FcaObjectSet existObject = AllSets[i]; s.addASupr(existObject); existObject.addAInf(s); addVisited(existObject); } } } foreach (FcaObjectSet set in AllSets) { FcaObjectSet check = new FcaObjectSet(); foreach (FcaObjectSet l in set.AInf) { foreach (FcaObject o in l.getObjects()) { check.addObject(o); } } if (!set.Equals(check)) { i = AllSetsContains(set); set.addAInf(tree.findInList(set).getParent().getMainSet()); } } }