/// Any side-effects such as symbol table updates and top-level constraints are applied to the returned model.
/// - Some(<new_expression>) after applying the first applicable rule to `expr` or a sub-expression.
log::trace!(target: "file", "Rule applicable: {:?}, to Expression: {:?}, resulting in: {:?}", rule, expression, red.new_expression);
// assert!(!red.new_expression.children().iter().any(|c| c.is_clean()), "Rule that caused assertion to fail: {:?}", rule.name);
// assert!(!red.new_expression.children().iter().any(|c| c.children().iter().any(|c| c.is_clean())));
log::trace!(target: "file", "Rule attempted but not applied: {:?}, to Expression: {:?}", rule, expression);