private static int[][] compress(int[][] src, int axioms, IntSet reachable, IntSet core) {
final int[][] dest = new int[reachable.size()-core.size()+axioms][];
System.arraycopy(src, 0, dest, 0, axioms);
final int[] pos = new int[src.length-axioms];
final IntIterator srcIdxs = reachable.iterator(axioms, src.length);
for(int i = axioms; srcIdxs.hasNext(); i++) {
int srcIdx = srcIdxs.next();
pos[srcIdx-axioms] = i;
// move the resolvent and adjust its antecedent indices
int[] resolvent = src[srcIdx];
dest[i] = resolvent;
for(int j = 0, lastAnte = resolvent.length; j < lastAnte; j++) {