Multiplication of differentiable real functions on proper closed intervals in the real numbers

Content created by Louis Wasserman.

Created on 2026-04-02.
Last modified on 2026-04-02.

{-# OPTIONS --lossy-unification #-}

module analysis.multiplication-differentiable-real-functions-on-proper-closed-intervals-real-numbers where
Imports
open import analysis.differentiable-real-maps-on-proper-closed-intervals-real-numbers

open import elementary-number-theory.inequality-positive-rational-numbers
open import elementary-number-theory.inequality-rational-numbers
open import elementary-number-theory.minimum-positive-rational-numbers
open import elementary-number-theory.multiplication-positive-rational-numbers
open import elementary-number-theory.multiplicative-group-of-positive-rational-numbers
open import elementary-number-theory.nonzero-natural-numbers
open import elementary-number-theory.positive-rational-numbers

open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.existential-quantification
open import foundation.identity-types
open import foundation.propositional-truncations
open import foundation.universe-levels

open import order-theory.large-posets

open import real-numbers.absolute-value-real-numbers
open import real-numbers.addition-real-numbers
open import real-numbers.binary-maximum-real-numbers
open import real-numbers.dedekind-real-numbers
open import real-numbers.difference-real-numbers
open import real-numbers.distance-real-numbers
open import real-numbers.inequalities-addition-and-subtraction-real-numbers
open import real-numbers.inequality-real-numbers
open import real-numbers.metric-space-of-real-numbers
open import real-numbers.multiplication-nonnegative-real-numbers
open import real-numbers.multiplication-real-numbers
open import real-numbers.multiplication-uniformly-continuous-real-maps-proper-closed-intervals-real-numbers
open import real-numbers.negation-real-numbers
open import real-numbers.nonnegative-real-numbers
open import real-numbers.proper-closed-intervals-real-numbers
open import real-numbers.rational-real-numbers
open import real-numbers.similarity-real-numbers
open import real-numbers.strict-inequality-real-numbers
open import real-numbers.uniformly-continuous-real-maps-proper-closed-intervals-real-numbers

Idea

The product rule for derivatives states that if f and g are uniformly continuous functions on a proper closed interval, and they are both differentiable with uniformly continuous derivatives f' and g', then the product function x ↦ f x * g x is differentiable with derivative x ↦ f x * g' x + f' x * g x.

Proof

This proof is derived from Theorem 5 of Chapter 2 in [Bis12].

module _
  {l1 l2 l3 : Level}
  ([a,b] : proper-closed-interval-ℝ l1 l1)
  (f@(map-f , _) :
      uniformly-continuous-real-map-proper-closed-interval-ℝ l1 l2 [a,b])
  (g@(map-g , _) :
      uniformly-continuous-real-map-proper-closed-interval-ℝ l1 l3 [a,b])
  (f'@(map-f' , _) :
    uniformly-continuous-real-map-proper-closed-interval-ℝ l1 (l1  l2) [a,b])
  (g'@(map-g' , _) :
    uniformly-continuous-real-map-proper-closed-interval-ℝ l1 (l1  l3) [a,b])
  (is-derivative-f-f' :
    is-derivative-real-map-proper-closed-interval-ℝ
      ( [a,b])
      ( map-uniformly-continuous-real-map-proper-closed-interval-ℝ [a,b] f)
      ( map-uniformly-continuous-real-map-proper-closed-interval-ℝ [a,b] f'))
  (is-derivative-g-g' :
    is-derivative-real-map-proper-closed-interval-ℝ
      ( [a,b])
      ( map-uniformly-continuous-real-map-proper-closed-interval-ℝ [a,b] g)
      ( map-uniformly-continuous-real-map-proper-closed-interval-ℝ [a,b] g'))
  where

  map-derivative-mul-real-map-proper-closed-interval-ℝ :
    type-proper-closed-interval-ℝ l1 [a,b]   (l1  l2  l3)
  map-derivative-mul-real-map-proper-closed-interval-ℝ x =
    let
      map :
        {l4 : Level} 
        uniformly-continuous-real-map-proper-closed-interval-ℝ l1 l4 [a,b] 
        type-proper-closed-interval-ℝ l1 [a,b]   l4
      map = map-uniformly-continuous-real-map-proper-closed-interval-ℝ [a,b]
    in map f x *ℝ map g' x +ℝ map f' x *ℝ map g x

  abstract
    lemma-is-derivative-mul-uniformly-continuous-real-map-proper-closed-interval-ℝ :
      (x y : type-proper-closed-interval-ℝ l1 [a,b]) (z :  l1) 
      dist-ℝ
        ( (map-f y *ℝ map-g y) -ℝ (map-f x *ℝ map-g x))
        ( (map-f x *ℝ map-g' x +ℝ map-f' x *ℝ map-g x) *ℝ z) 
      abs-ℝ
        ( ( map-f y *ℝ (map-g y -ℝ map-g x) -ℝ map-f x *ℝ (map-g' x *ℝ z)) +ℝ
          ( (map-f y -ℝ map-f x -ℝ map-f' x *ℝ z)) *ℝ map-g x)
    lemma-is-derivative-mul-uniformly-continuous-real-map-proper-closed-interval-ℝ
      x y z =
      let
        fy = map-f y
        gy = map-g y
        fx = map-f x
        gx = map-g x
        f'x = map-f' x
        g'x = map-g' x
      in
        equational-reasoning
          dist-ℝ (fy *ℝ gy -ℝ fx *ℝ gx) ((fx *ℝ g'x +ℝ f'x *ℝ gx) *ℝ z)
           dist-ℝ (fy *ℝ gy -ℝ fx *ℝ gx) (fx *ℝ g'x *ℝ z +ℝ f'x *ℝ gx *ℝ z)
            by ap-dist-ℝ refl (right-distributive-mul-add-ℝ _ _ z)
           dist-ℝ (fy *ℝ gy -ℝ fx *ℝ gx) (fx *ℝ g'x *ℝ z +ℝ f'x *ℝ z *ℝ gx)
            by ap-dist-ℝ refl (ap-add-ℝ refl (right-swap-mul-ℝ f'x gx z))
          
            abs-ℝ
              ( ( fy *ℝ gy -ℝ fx *ℝ g'x *ℝ z) +ℝ
                ( neg-ℝ (fx *ℝ gx) -ℝ f'x *ℝ z *ℝ gx))
            by ap abs-ℝ (interchange-law-diff-add-ℝ _ _ _ _)
           dist-ℝ (fy *ℝ gy -ℝ fx *ℝ g'x *ℝ z) (fx *ℝ gx +ℝ f'x *ℝ z *ℝ gx)
            by ap abs-ℝ (ap-add-ℝ refl (inv (distributive-neg-add-ℝ _ _)))
           dist-ℝ (fy *ℝ gy -ℝ fx *ℝ g'x *ℝ z) ((fx +ℝ f'x *ℝ z) *ℝ gx)
            by
              ap-dist-ℝ
                { l1  l2  l3} -- the compiler seems to need a little help
                ( refl)
                ( inv (right-distributive-mul-add-ℝ _ _ _))
          
            dist-ℝ
              ( (fy *ℝ gy -ℝ fx *ℝ g'x *ℝ z) -ℝ fy *ℝ gx)
              ( (fx +ℝ f'x *ℝ z) *ℝ gx -ℝ fy *ℝ gx)
            by inv (eq-sim-ℝ (preserves-dist-right-add-ℝ _ _ _))
          
            dist-ℝ
              ( (fy *ℝ gy -ℝ fy *ℝ gx) -ℝ fx *ℝ g'x *ℝ z)
              ( ((fx +ℝ f'x *ℝ z) -ℝ fy) *ℝ gx)
            by
              ap-dist-ℝ
                { l1  l2  l3}
                ( right-swap-add-ℝ (fy *ℝ gy) _ (neg-ℝ (fy *ℝ gx)))
                ( inv (right-distributive-mul-diff-ℝ _ _ _))
          
            dist-ℝ
              ( fy *ℝ (gy -ℝ gx) -ℝ fx *ℝ g'x *ℝ z)
              ( ((fx +ℝ f'x *ℝ z) -ℝ fy) *ℝ gx)
            by
              ap-dist-ℝ
                { l1  l2  l3}
                ( ap
                  ( _-ℝ fx *ℝ g'x *ℝ z)
                  ( inv (left-distributive-mul-diff-ℝ _ _ _)))
                ( refl)
          
            abs-ℝ
              ( ( fy *ℝ (gy -ℝ gx) -ℝ fx *ℝ g'x *ℝ z) +ℝ
                ( neg-ℝ ((fx +ℝ f'x *ℝ z) -ℝ fy) *ℝ gx))
            by ap abs-ℝ (ap-add-ℝ refl (inv (left-negative-law-mul-ℝ _ _)))
          
            abs-ℝ
              ( ( fy *ℝ (gy -ℝ gx) -ℝ fx *ℝ g'x *ℝ z) +ℝ
                ( fy -ℝ (fx +ℝ f'x *ℝ z)) *ℝ gx)
            by
              ap
                ( abs-ℝ)
                ( ap-add-ℝ refl (ap-mul-ℝ (distributive-neg-diff-ℝ _ _) refl))
          
            abs-ℝ
              ( ( fy *ℝ (gy -ℝ gx) -ℝ fx *ℝ (g'x *ℝ z)) +ℝ
                ( (fy -ℝ fx -ℝ f'x *ℝ z)) *ℝ gx)
            by
              ap
                ( abs-ℝ)
                ( ap-add-ℝ
                  ( ap-diff-ℝ refl (associative-mul-ℝ fx g'x z))
                  ( ap-mul-ℝ (inv (associative-diff-ℝ _ _ _)) refl))

  abstract
    is-derivative-mul-uniformly-continuous-real-map-proper-closed-interval-ℝ :
      is-derivative-real-map-proper-closed-interval-ℝ
        ( [a,b])
        ( map-mul-uniformly-continuous-real-map-proper-closed-interval-ℝ
          ( [a,b])
          ( f)
          ( g))
        ( map-derivative-mul-real-map-proper-closed-interval-ℝ)
    is-derivative-mul-uniformly-continuous-real-map-proper-closed-interval-ℝ =
      let
        open
          do-syntax-trunc-Prop
            ( is-derivative-prop-real-map-proper-closed-interval-ℝ
              ( [a,b])
              ( map-mul-uniformly-continuous-real-map-proper-closed-interval-ℝ
                ( [a,b])
                ( f)
                ( g))
              ( map-derivative-mul-real-map-proper-closed-interval-ℝ))
        ((Mf , _) , is-bound-Mf) =
          nonnegative-upper-bound-abs-im-uniformly-continuous-real-map-proper-closed-interval-ℝ
            ( [a,b])
            ( f)
        ((Mg , _) , is-bound-Mg) =
          nonnegative-upper-bound-abs-im-uniformly-continuous-real-map-proper-closed-interval-ℝ
            ( [a,b])
            ( g)
        ((Mg' , _) , is-bound-Mg') =
          nonnegative-upper-bound-abs-im-uniformly-continuous-real-map-proper-closed-interval-ℝ
            ( [a,b])
            ( g')
        M₀ = max-ℝ (max-ℝ Mf Mg) Mg'
        open inequality-reasoning-Large-Poset ℝ-Large-Poset
      in do
        (δf , is-mod-δf)  is-derivative-f-f'
        (δg , is-mod-δg)  is-derivative-g-g'
        (ωf , is-mod-ωf) 
          is-uniformly-continuous-map-uniformly-continuous-real-map-proper-closed-interval-ℝ
            ( [a,b])
            ( f)
        (M⁺ , M₀<M⁺)  exists-greater-positive-rational-ℝ M₀
        let
          shrink ε = inv-ℚ⁺ (three-ℚ⁺ *ℚ⁺ M⁺) *ℚ⁺ ε
          δ ε = min-ℚ⁺ (min-ℚ⁺ (δf (shrink ε)) (δg (shrink ε))) (ωf (shrink ε))
          |g|≤M⁺ x =
            chain-of-inequalities
              abs-ℝ (map-g x)
               Mg
                by is-bound-Mg x
               M₀
                by
                  transitive-leq-ℝ _ _ _
                    ( leq-left-max-ℝ _ _)
                    ( leq-right-max-ℝ _ _)
               real-ℚ⁺ M⁺
                by leq-le-ℝ M₀<M⁺
          |f|≤M⁺ x =
            chain-of-inequalities
              abs-ℝ (map-f x)
               Mf
                by is-bound-Mf x
               M₀
                by
                  transitive-leq-ℝ _ _ _
                    ( leq-left-max-ℝ _ _)
                    ( leq-left-max-ℝ _ _)
               real-ℚ⁺ M⁺
                by leq-le-ℝ M₀<M⁺
          |g'|≤M⁺ x =
            chain-of-inequalities
              abs-ℝ (map-g' x)
               Mg'
                by is-bound-Mg' x
               M₀
                by leq-right-max-ℝ _ _
               real-ℚ⁺ M⁺
                by leq-le-ℝ M₀<M⁺
          δ≤δf-shrink ε =
            transitive-leq-ℚ⁺
              ( δ ε)
              ( min-ℚ⁺ (δf (shrink ε)) (δg (shrink ε)))
              ( δf (shrink ε))
              ( leq-left-min-ℚ⁺ (δf (shrink ε)) (δg (shrink ε)))
              ( leq-left-min-ℚ⁺ _ _)
          δ≤δg-shrink ε =
            transitive-leq-ℚ⁺
              ( δ ε)
              ( min-ℚ⁺ (δf (shrink ε)) (δg (shrink ε)))
              ( δg (shrink ε))
              ( leq-right-min-ℚ⁺ (δf (shrink ε)) (δg (shrink ε)))
              ( leq-left-min-ℚ⁺ _ _)
        intro-exists
          ( δ)
          ( λ ε x@(xℝ , _) y@(yℝ , _) Nδxy 
            chain-of-inequalities
              dist-ℝ
                ( (map-f y *ℝ map-g y) -ℝ (map-f x *ℝ map-g x))
                ( (map-f x *ℝ map-g' x +ℝ map-f' x *ℝ map-g x) *ℝ (yℝ -ℝ xℝ))
               abs-ℝ
                  ( ( ( map-f y *ℝ (map-g y -ℝ map-g x)) -ℝ
                      ( map-f x *ℝ (map-g' x *ℝ (yℝ -ℝ xℝ)))) +ℝ
                    ( ( map-f y -ℝ map-f x -ℝ map-f' x *ℝ (yℝ -ℝ xℝ))) *ℝ
                      ( map-g x))
                by
                  leq-eq-ℝ
                    ( lemma-is-derivative-mul-uniformly-continuous-real-map-proper-closed-interval-ℝ
                      ( x)
                      ( y)
                      ( yℝ -ℝ xℝ))
               ( dist-ℝ
                  ( map-f y *ℝ (map-g y -ℝ map-g x))
                  ( map-f x *ℝ (map-g' x *ℝ (yℝ -ℝ xℝ)))) +ℝ
                ( abs-ℝ
                  ( (map-f y -ℝ map-f x -ℝ map-f' x *ℝ (yℝ -ℝ xℝ)) *ℝ map-g x))
                by triangle-inequality-abs-ℝ _ _
               ( dist-ℝ
                  ( map-f y *ℝ (map-g y -ℝ map-g x))
                  ( map-f y *ℝ (map-g' x *ℝ (yℝ -ℝ xℝ)))) +ℝ
                ( dist-ℝ
                  ( map-f y *ℝ (map-g' x *ℝ (yℝ -ℝ xℝ)))
                  ( map-f x *ℝ (map-g' x *ℝ (yℝ -ℝ xℝ)))) +ℝ
                ( ( dist-ℝ (map-f y -ℝ map-f x) (map-f' x *ℝ (yℝ -ℝ xℝ))) *ℝ
                  ( abs-ℝ (map-g x)))
                by
                  preserves-leq-add-ℝ
                    ( triangle-inequality-dist-ℝ _ _ _)
                    ( leq-eq-ℝ (abs-mul-ℝ _ _))
               ( ( abs-ℝ (map-f y)) *ℝ
                  ( dist-ℝ (map-g y -ℝ map-g x) (map-g' x *ℝ (yℝ -ℝ xℝ)))) +ℝ
                ( ( dist-ℝ (map-f y) (map-f x)) *ℝ
                  ( abs-ℝ (map-g' x *ℝ (yℝ -ℝ xℝ)))) +ℝ
                ( ( abs-ℝ (map-g x)) *ℝ
                  ( dist-ℝ (map-f y -ℝ map-f x) (map-f' x *ℝ (yℝ -ℝ xℝ))))
                by
                  leq-eq-ℝ
                    ( ap-add-ℝ
                      ( ap-add-ℝ
                        ( inv (left-distributive-abs-mul-dist-ℝ _ _ _))
                        ( inv (right-distributive-abs-mul-dist-ℝ _ _ _)))
                      ( commutative-mul-ℝ _ _))
               ( real-ℚ⁺ M⁺ *ℝ (real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ)) +ℝ
                ( real-ℚ⁺ (shrink ε) *ℝ (abs-ℝ (map-g' x) *ℝ dist-ℝ yℝ xℝ)) +ℝ
                ( real-ℚ⁺ M⁺ *ℝ (real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ))
                by
                  preserves-leq-add-ℝ
                    ( preserves-leq-add-ℝ
                      ( preserves-leq-mul-ℝ⁰⁺
                        ( nonnegative-abs-ℝ (map-f y))
                        ( nonnegative-real-ℚ⁺ M⁺)
                        ( nonnegative-dist-ℝ _ _)
                        ( ( nonnegative-real-ℚ⁺ (shrink ε)) *ℝ⁰⁺
                          ( nonnegative-dist-ℝ xℝ yℝ))
                        ( |f|≤M⁺ y)
                        ( is-mod-δg (shrink ε) x y
                          ( weakly-monotonic-neighborhood-ℝ xℝ yℝ (δ ε) _
                            ( δ≤δg-shrink ε)
                            ( Nδxy))))
                      ( preserves-leq-mul-ℝ⁰⁺
                        ( nonnegative-dist-ℝ _ _)
                        ( nonnegative-real-ℚ⁺ (shrink ε))
                        ( nonnegative-abs-ℝ _)
                        ( nonnegative-abs-ℝ _ *ℝ⁰⁺ nonnegative-dist-ℝ _ _)
                        ( leq-dist-neighborhood-ℝ (shrink ε) _ _
                          ( is-mod-ωf y (shrink ε) x
                            ( weakly-monotonic-neighborhood-ℝ yℝ xℝ (δ ε) _
                              ( leq-right-min-ℚ⁺ _ _)
                              ( is-symmetric-neighborhood-ℝ (δ ε) xℝ yℝ Nδxy))))
                        ( leq-eq-ℝ (abs-mul-ℝ _ _))))
                    ( preserves-leq-mul-ℝ⁰⁺
                      ( nonnegative-abs-ℝ (map-g x))
                      ( nonnegative-real-ℚ⁺ M⁺)
                      ( nonnegative-dist-ℝ _ _)
                      ( ( nonnegative-real-ℚ⁺ (shrink ε)) *ℝ⁰⁺
                        ( nonnegative-dist-ℝ xℝ yℝ))
                      ( |g|≤M⁺ x)
                      ( is-mod-δf (shrink ε) x y
                        ( weakly-monotonic-neighborhood-ℝ xℝ yℝ (δ ε) _
                          ( δ≤δf-shrink ε)
                          ( Nδxy))))
               ( real-ℚ⁺ M⁺ *ℝ (real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ)) +ℝ
                ( real-ℚ⁺ (shrink ε) *ℝ (real-ℚ⁺ M⁺ *ℝ dist-ℝ yℝ xℝ)) +ℝ
                ( real-ℚ⁺ M⁺ *ℝ (real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ))
                by
                  preserves-leq-right-add-ℝ _ _ _
                    ( preserves-leq-left-add-ℝ _ _ _
                      ( preserves-leq-left-mul-ℝ⁰⁺
                        ( nonnegative-real-ℚ⁺ (shrink ε))
                        ( preserves-leq-right-mul-ℝ⁰⁺
                          ( nonnegative-dist-ℝ yℝ xℝ)
                          ( |g'|≤M⁺ x))))
               ( real-ℚ⁺ M⁺ *ℝ (real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ)) +ℝ
                ( real-ℚ⁺ M⁺ *ℝ (real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ)) +ℝ
                ( real-ℚ⁺ M⁺ *ℝ (real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ))
                by
                  leq-eq-ℝ
                    ( ap-add-ℝ
                      ( ap-add-ℝ
                        ( refl)
                        ( ( ap-mul-ℝ
                            ( refl)
                            ( ap-mul-ℝ refl (commutative-dist-ℝ yℝ xℝ))) 
                          ( left-swap-mul-ℝ _ _ _)))
                      ( refl))
               real-ℕ 3 *ℝ (real-ℚ⁺ M⁺ *ℝ (real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ))
                by leq-eq-ℝ (inv (left-mul-real-ℕ 3 _))
               ( real-ℚ⁺ (three-ℚ⁺ *ℚ⁺ M⁺)) *ℝ
                ( real-ℚ⁺ (shrink ε) *ℝ dist-ℝ xℝ yℝ)
                by leq-eq-ℝ (combine-left-mul-real-ℚ _ _ _)
               ( real-ℚ⁺ (three-ℚ⁺ *ℚ⁺ M⁺ *ℚ⁺ shrink ε)) *ℝ dist-ℝ xℝ yℝ
                by leq-eq-ℝ (combine-left-mul-real-ℚ _ _ _)
               real-ℚ⁺ ε *ℝ dist-ℝ xℝ yℝ
                by
                  leq-eq-ℝ
                    ( ap-mul-ℝ
                      ( ap real-ℚ (is-section-left-div-ℚ⁺ _ _))
                      ( refl)))

module _
  {l1 l2 l3 : Level}
  ([a,b] : proper-closed-interval-ℝ l1 l1)
  (f@(map-f , map-f' , Df=f') :
    differentiable-real-map-proper-closed-interval-ℝ l2 [a,b])
  (g@(map-g , map-g' , Dg=g') :
    differentiable-real-map-proper-closed-interval-ℝ l3 [a,b])
  where

  map-mul-differentiable-real-map-proper-closed-interval-ℝ :
    type-proper-closed-interval-ℝ l1 [a,b]   (l2  l3)
  map-mul-differentiable-real-map-proper-closed-interval-ℝ x =
    map-f x *ℝ map-g x

  map-derivative-mul-differentiable-real-map-proper-closed-interval-ℝ :
    type-proper-closed-interval-ℝ l1 [a,b]   (l1  l2  l3)
  map-derivative-mul-differentiable-real-map-proper-closed-interval-ℝ x =
    map-f x *ℝ map-g' x +ℝ map-f' x *ℝ map-g x

  is-differentiable-map-mul-differentiable-real-map-proper-closed-interval-ℝ :
    is-differentiable-real-map-proper-closed-interval-ℝ
      ( [a,b])
      ( map-mul-differentiable-real-map-proper-closed-interval-ℝ)
  is-differentiable-map-mul-differentiable-real-map-proper-closed-interval-ℝ =
    ( map-derivative-mul-differentiable-real-map-proper-closed-interval-ℝ ,
      is-derivative-mul-uniformly-continuous-real-map-proper-closed-interval-ℝ
        ( [a,b])
        ( uniformly-continuous-map-differentiable-real-map-proper-closed-interval-ℝ
          ( [a,b])
          ( f))
        ( uniformly-continuous-map-differentiable-real-map-proper-closed-interval-ℝ
          ( [a,b])
          ( g))
        ( uniformly-continuous-map-derivative-differentiable-real-map-proper-closed-interval-ℝ
          ( [a,b])
          ( f))
        ( uniformly-continuous-map-derivative-differentiable-real-map-proper-closed-interval-ℝ
          ( [a,b])
          ( g))
        ( Df=f')
        ( Dg=g'))

References

[Bis12]
Errett Bishop. Foundations of constructive analysis. Ishi Press International, New York ; Tokyo, 2012. ISBN 9784871877145.

Recent changes