/** Clones the given program by replacing some classes by other classes.
/** Clones the given program by replacing some classes by other classes.
*
*
* @param p The original program
* @param p The original program
* @param cdMapF Given c returns Some(d) where d can take an abstract parent and return a class e if c should be replaced by e, and None if c should be kept.
* @param ciMapF Given a previous case class invocation and its new case class definition, returns the expression to use.
* @param ciMapF Given a previous case class invocation and its new case class definition, returns the expression to use.
* By default it is the case class construction using the new case class definition.
* By default it is the case class construction using the new case class definition.
* @return the new program with a map from the old case classes to the new case classes, with maps concerning identifiers and function definitions. */
* @return the new program with a map from the old case classes to the new case classes, with maps concerning identifiers and function definitions. */