private boolean fundamentalRule() {
    boolean change = false;
    for(int i = 0; i < chart.size(); i++) {
      final Edge e = chart.get(i);
      if(e.isActive()) {
        for(int k = 0; k < chart.size(); k++) {
          final Edge e2 = chart.get(k);
          if(!e2.isActive() && e.matches(e2)) {
            final Edge nw = new Edge(e, e2);
            if(!chart.contains(nw)) {
              chart.add(nw);
              change = true;
              log("FR", "Adding edge: " + nw);
            }
          }
        }
      }
    }
    return change;
  }