Ltac arithNormalize_step :=
    repeat rewrite mult_succ_r in *;
      repeat rewrite mult_plus_distr_r in *;
        repeat rewrite mult_plus_distr_l in *;
          repeat rewrite mult_minus_distr_r in *;
            repeat rewrite mult_minus_distr_l in *;
              repeat rewrite plus_assoc in *;
                repeat rewrite mult_assoc in *.Ltac arithNormalize := repeat arithNormalize_step.Ltac arithSimplify :=
    match goal with
      | [|- _ + ?x = _ + ?x] => f_equal
      | [|- _ + (?x1 * ?x2) = _ + (?x2 * ?x1) ] => f_equal
      | [|- _ + (?x1 * ?x2 * ?x3) = _ + (?x1 * ?x3 * ?x2) ] => f_equal
      | [|- _ + (?x1 * ?x2 * ?x3 * ?x4 * ?x5 * ?x6) = _ + (?x1 * ?x3 * ?x2 * ?x4 * ?x5 * ?x6) ] => f_equal
      | [|- _ * ?x1 = _ * ?x1] => f_equal
      | [|- _ * ?x = _ ] => rewrite mult_comm; repeat rewrite mult_assoc; arithSimplify
      | [|- _ + ?x = _ ] => rewrite plus_comm; repeat rewrite plus_assoc; arithSimplify
      | [|- _ * ?x1 <= _ * ?x1] => apply mult_le_compat; auto
      | [|- _ * ?x1 <= _ * ?x1] => apply plus_le_compat; auto
      | [|- _ * ?x <= _ ] => rewrite mult_comm; repeat rewrite mult_assoc; arithSimplify
      | [|- _ + ?x <= _ ] => rewrite plus_comm; repeat rewrite plus_assoc; arithSimplify
      
    end.

Lemma minus_plus_assoc : forall n1 n2 n3, (n3 <= n2 -> (n1 + n2) - n3 = n1 + (n2 - n3))%nat.