code: private String printAbstractConcept(AbstractConcept ac) {
          if(ac instanceof au.csiro.snorocket.core.model.Concept) {
              au.csiro.snorocket.core.model.Concept c = (au.csiro.snorocket.core.model.Concept) ac;
              Object o = factory.lookupConceptId(c.hashCode());
              if(o instanceof String) {
                  return (String) o;
              } else {
                  return printAbstractConcept((AbstractConcept) o);
              }
          } else if(ac instanceof au.csiro.snorocket.core.model.Conjunction) {
              au.csiro.snorocket.core.model.Conjunction c = (au.csiro.snorocket.core.model.Conjunction) ac;
              AbstractConcept[] acs = c.getConcepts();
              StringBuilder sb = new StringBuilder();
              if(acs != null && acs.length > 0) {
                  sb.append(printAbstractConcept(acs[0]));
                  for(int i = 1; i < acs.length; i++) {
                      sb.append(" + ");
                      sb.append(printAbstractConcept(acs[i]));
                  }
              }
              return sb.toString();
          } else if(ac instanceof au.csiro.snorocket.core.model.Existential) {
              au.csiro.snorocket.core.model.Existential e = (au.csiro.snorocket.core.model.Existential) ac;
              return "E"+factory.lookupRoleId(e.getRole()).toString()+"."+printAbstractConcept(e.getConcept());
          } else if(ac instanceof au.csiro.snorocket.core.model.Datatype) {
              au.csiro.snorocket.core.model.Datatype d = (au.csiro.snorocket.core.model.Datatype) ac;
              return "F"+factory.lookupFeatureId(d.getFeature())+".("+d.getOperator()+", "+d.getLiteral()+")";
          } else {
              throw new RuntimeException("Unexpected concept: " + ac);
          }
      }
docs: Prints an abstract concept. Useful for debugging.
  
  @param ac
  @return