                    ) => fold_sub_const(c1, c2)?.map(|c3| {
                        let e1 = mem::take(e1);
                        let e2 = mem::take(e2);
                        let e = Expr::func(FuncKind::Add, vec![e1, e2]);
                        expr_sub_const(e, c3)
                    }),
                    // rule 8.4: (e1-c1)+(e2-c2) => (e1+e2) - (c1+c2)
                    (