(** * Partial derivatives *)

Definition partial_derive (m k : nat) (f : R -> R -> R) : R -> R -> R :=
  fun x y => Derive_n (fun t => Derive_n (fun z => f t z) k y) m x.Definition differential (p : nat) (f : R -> R -> R) (x y dx dy : R) : R :=
  sum_f_R0
    (fun m =>
      C p m *
      partial_derive m (p - m)%nat f x y *
      dx ^ m * dy ^ (p - m)%nat)
    p.Definition DL_pol (n : nat) (f : R -> R -> R) (x y dx dy : R) : R :=
  sum_f_R0
    (fun p =>
      differential p f x y dx dy / INR (fact p))
    n.

(* Specifications: *)
Lemma partial_derive_ext_loc : forall f g p q x y, locally_2d (fun u v => f u v = g u v) x y -> partial_derive p q f x y = partial_derive p q g x y.
Lemma Schwarz_aux : forall f x y (eps : posreal), ( forall u v, Rabs (u - x) < eps -> Rabs (v - y) < eps -> ex_derive (fun z : R => f z v) u /\ ex_derive (fun z : R => Derive (fun t => f t z) u) v ) -> forall h k, Rabs h < eps -> Rabs k < eps -> let phi k x := f x (y + k) - f x y in exists u, exists v, Rabs (u - x) <= Rabs h /\ Rabs (v - y) <= Rabs k /\ phi k (x + h) - phi k x = h * k * (Derive (fun z => Derive (fun t => f t z) u) v).
Lemma Schwarz : forall (f : R -> R -> R) x y, locally_2d (fun u v => ex_derive (fun z : R => f z v) u /\ ex_derive (fun z : R => f u z) v /\ ex_derive (fun z : R => Derive (fun t => f z t) v) u /\ ex_derive (fun z : R => Derive (fun t => f t z) u) v) x y -> continuity_2d_pt (fun u v => Derive (fun z => Derive (fun t => f z t) v) u) x y -> continuity_2d_pt (fun u v => Derive (fun z => Derive (fun t => f t z) u) v) x y -> Derive (fun z => Derive (fun t => f z t) y) x = Derive (fun z => Derive (fun t => f t z) x) y.
Lemma partial_derive_add_zero: forall f p q r s x y, (q=0)%nat \/ (r=0)%nat -> partial_derive p q (partial_derive r s f) x y = partial_derive (p+r) (q+s) f x y.