public CompoundFact copy(CompoundFact fact) throws ParserException {
   // FIXME reliance on toString()
   MembershipMolecule mm = null;
   MoleculeFact mf = (MoleculeFact) fact; // FIXME handle relation facts);
   if (mf.listMembershipMolecules().size() > 0)
     mm =
         (MembershipMolecule)
             leFactory.createLogicalExpression(
                 mf.listMembershipMolecules().iterator().next().toString());
   Set<AttributeValueMolecule> avms = new HashSet<AttributeValueMolecule>();
   for (AttributeValueMolecule avm : mf.listAttributeValueMolecules()) {
     avms.add((AttributeValueMolecule) leFactory.createLogicalExpression(avm.toString()));
   }
   // TODO write this more elegant once factory convenience creators are fixed
   Set<MembershipMolecule> mms = new HashSet<MembershipMolecule>();
   if (mf.listMembershipMolecules().size() > 0) mms.add(mm);
   return cFactory.facts.createMoleculeFact(mms, avms);
 }