(** *** Composition *)
(** Composition with linear functions *)

(* Specifications: *)
Lemma Derive_n_comp_scal (f : R -> R) (a : R) (n : nat) (x : R) :
locally (a * x) (fun x => forall k, (k <= n)%nat -> ex_derive_n f k x) ->
Derive_n (fun y => f (a * y)) n x  = (a ^ n * Derive_n f n (a * x)).
Lemma ex_derive_n_comp_scal (f : R -> R) (a : R) (n : nat) (x : R) :
locally (a * x) (fun x => forall k, (k <= n)%nat -> ex_derive_n f k x)
-> ex_derive_n (fun y => f (a * y)) n x.
Lemma is_derive_n_comp_scal (f : R -> R) (a : R) (n : nat) (x l : R) :
locally (a * x) (fun x => forall k, (k <= n)%nat -> ex_derive_n f k x)
-> is_derive_n f n (a * x) l
-> is_derive_n (fun y => f (a * y)) n x (a ^ n * l).
Lemma Derive_n_comp_opp (f : R -> R) (n : nat) (x : R) :
locally (- x) (fun y => (forall k, (k <= n)%nat -> ex_derive_n f k y)) ->
Derive_n (fun y => f (- y)) n x  = ((-1) ^ n * Derive_n f n (-x)).
Lemma ex_derive_n_comp_opp (f : R -> R) (n : nat) (x : R) :
locally (- x) (fun y => (forall k, (k <= n)%nat -> ex_derive_n f k y)) ->
ex_derive_n (fun y => f (- y)) n x.
Lemma is_derive_n_comp_opp (f : R -> R) (n : nat) (x l : R) :
locally (- x) (fun y => (forall k, (k <= n)%nat -> ex_derive_n f k y)) ->
is_derive_n f n (-x) l ->
is_derive_n (fun y => f (- y)) n x ((-1)^n * l).
Lemma Derive_n_comp_trans (f : R -> R) (n : nat) (x b : R) :
Derive_n (fun y => f (y + b)) n x  = Derive_n f n (x + b).
Lemma ex_derive_n_comp_trans (f : R -> R) (n : nat) (x b : R) :
ex_derive_n f n (x + b) ->
ex_derive_n (fun y => f (y + b)) n x.
Lemma is_derive_n_comp_trans (f : R -> R) (n : nat) (x b l : R) :
is_derive_n f n (x + b) l ->
is_derive_n (fun y => f (y + b)) n x l.