Analysis I, Section 11.3: Upper and lower Riemann integrals

I have attempted to make the translation as faithful a paraphrasing as possible of the original text. When there is a choice between a more idiomatic Lean solution and a more faithful translation, I have generally chosen the latter. In particular, there will be places where the Lean code could be "golfed" to be more elegant and idiomatic, but I have consciously avoided doing so.

Main constructions and results of this section:

namespace Chapter11open BoundedInterval Chapter9

Definition 11.3.1 (Majorization of functions)

abbrev MajorizesOn (g f: ) (I: BoundedInterval) : Prop := x (I:Set ), f x g x
abbrev MinorizesOn (g f: ) (I: BoundedInterval) : Prop := x (I:Set ), g x f xtheorem MinorizesOn.iff (g f: ) (I: BoundedInterval) : MinorizesOn g f I MajorizesOn f g I := g: f: I:BoundedIntervalMinorizesOn g f I MajorizesOn f g I All goals completed! 🐙

Definition 11.3.2 (Uppper and lower Riemann integrals )

noncomputable abbrev upper_integral (f: ) (I: BoundedInterval) : := sInf ((PiecewiseConstantOn.integ ·I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I})
noncomputable abbrev lower_integral (f: ) (I: BoundedInterval) : := sSup ((PiecewiseConstantOn.integ ·I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I})theorem upper_integral_congr {f g: } {I: BoundedInterval} (h: Set.EqOn f g I) : upper_integral f I = upper_integral g I := f: g: I:BoundedIntervalh:Set.EqOn f g Iupper_integral f I = upper_integral g I f: g: I:BoundedIntervalh:Set.EqOn f g IsInf ((fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}) = sInf ((fun x => PiecewiseConstantOn.integ x I) '' {g_1 | MajorizesOn g_1 g I PiecewiseConstantOn g_1 I}); f: g: I:BoundedIntervalh:Set.EqOn f g I{g | MajorizesOn g f I PiecewiseConstantOn g I} = {g_1 | MajorizesOn g_1 g I PiecewiseConstantOn g_1 I}; f: g: I:BoundedIntervalh:Set.EqOn f g Ix✝: x✝ {g | MajorizesOn g f I PiecewiseConstantOn g I} x✝ {g_1 | MajorizesOn g_1 g I PiecewiseConstantOn g_1 I}; f: g: I:BoundedIntervalh:Set.EqOn f g Ix✝: (x : Partition I), PiecewiseConstantWith x✝ x (MajorizesOn x✝ f I MajorizesOn x✝ g I); All goals completed! 🐙theorem lower_integral_congr {f g: } {I: BoundedInterval} (h: Set.EqOn f g I) : lower_integral f I = lower_integral g I := f: g: I:BoundedIntervalh:Set.EqOn f g Ilower_integral f I = lower_integral g I f: g: I:BoundedIntervalh:Set.EqOn f g IsSup ((fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}) = sSup ((fun x => PiecewiseConstantOn.integ x I) '' {g_1 | MinorizesOn g_1 g I PiecewiseConstantOn g_1 I}); f: g: I:BoundedIntervalh:Set.EqOn f g I{g | MinorizesOn g f I PiecewiseConstantOn g I} = {g_1 | MinorizesOn g_1 g I PiecewiseConstantOn g_1 I}; f: g: I:BoundedIntervalh:Set.EqOn f g Ix✝: x✝ {g | MinorizesOn g f I PiecewiseConstantOn g I} x✝ {g_1 | MinorizesOn g_1 g I PiecewiseConstantOn g_1 I}; f: g: I:BoundedIntervalh:Set.EqOn f g Ix✝: (x : Partition I), PiecewiseConstantWith x✝ x (MinorizesOn x✝ f I MinorizesOn x✝ g I); All goals completed! 🐙lemma integral_bound_upper_of_bounded {f: } {M:} {I: BoundedInterval} (h: x (I:Set ), |f x| M) : M * |I|ₗ (PiecewiseConstantOn.integ ·I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I} := f: M:I:BoundedIntervalh: x I, |f x| MM * I.length (fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I} f: M:I:BoundedIntervalh: x I, |f x| M x, (MajorizesOn x f I PiecewiseConstantOn x I) PiecewiseConstantOn.integ x I = M * I.length f: M:I:BoundedIntervalh: x I, |f x| MMajorizesOn (fun x => M) f If: M:I:BoundedIntervalh: x I, |f x| MPiecewiseConstantOn (fun x => M) I f: M:I:BoundedIntervalh: x I, |f x| MMajorizesOn (fun x => M) f I All goals completed! 🐙 f: M:I:BoundedIntervalh: x I, |f x| M x I, M = M; All goals completed! 🐙lemma integral_bound_lower_of_bounded {f: } {M:} {I: BoundedInterval} (h: x (I:Set ), |f x| M) : -M * |I|ₗ (PiecewiseConstantOn.integ ·I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I} := f: M:I:BoundedIntervalh: x I, |f x| M-M * I.length (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I} f: M:I:BoundedIntervalh: x I, |f x| M x, (MinorizesOn x f I PiecewiseConstantOn x I) PiecewiseConstantOn.integ x I = -(M * I.length) refine' fun _ -M , _, _ , f: M:I:BoundedIntervalh: x I, |f x| MPiecewiseConstantOn.integ (fun x => -M) I = -(M * I.length) f: M:I:BoundedIntervalh: x I, |f x| M-(M * I.length) = -M * I.length; All goals completed! 🐙 f: M:I:BoundedIntervalh: x I, |f x| MMinorizesOn (fun x => -M) f I All goals completed! 🐙 exact (ConstantOn.of_const (c := -M) (f: M:I:BoundedIntervalh: x I, |f x| M x I, -M = -M All goals completed! 🐙)).piecewiseConstantOnlemma integral_bound_upper_nonempty {f: } {I: BoundedInterval} (h: BddOn f I) : ((PiecewiseConstantOn.integ ·I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}).Nonempty := _, integral_bound_upper_of_bounded h.choose_spec lemma integral_bound_lower_nonempty {f: } {I: BoundedInterval} (h: BddOn f I) : ((PiecewiseConstantOn.integ ·I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}).Nonempty := _, integral_bound_lower_of_bounded h.choose_spec lemma integral_bound_lower_le_upper {f: } {I: BoundedInterval} {a b:} (ha: a (PiecewiseConstantOn.integ ·I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}) (hb: b (PiecewiseConstantOn.integ ·I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}) : b a:= f: I:BoundedIntervala:b:ha:a (fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}hb:b (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}b a f: I:BoundedIntervalb:hb:b (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}g: hmaj:MajorizesOn g f Ihgp:PiecewiseConstantOn g Ib (fun x => PiecewiseConstantOn.integ x I) g f: I:BoundedIntervalg: hmaj:MajorizesOn g f Ihgp:PiecewiseConstantOn g Ih: hmin:MinorizesOn h f Ihhp:PiecewiseConstantOn h I(fun x => PiecewiseConstantOn.integ x I) h (fun x => PiecewiseConstantOn.integ x I) g f: I:BoundedIntervalg: hmaj:MajorizesOn g f Ihgp:PiecewiseConstantOn g Ih: hmin:MinorizesOn h f Ihhp:PiecewiseConstantOn h I x I, h x g x; f: I:BoundedIntervalg: hmaj:MajorizesOn g f Ihgp:PiecewiseConstantOn g Ih: hmin:MinorizesOn h f Ihhp:PiecewiseConstantOn h Ix:hx:x Ih x g x; All goals completed! 🐙lemma integral_bound_below {f: } {I: BoundedInterval} (h: BddOn f I) : BddBelow ((PiecewiseConstantOn.integ ·I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}) := f: I:BoundedIntervalh:BddOn f IBddBelow ((fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}) f: I:BoundedIntervalh:BddOn f I x, y (fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}, x y; f: I:BoundedIntervalh:BddOn f I y (fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}, .some y f: I:BoundedIntervalh:BddOn f Ia:ha:a (fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}.some a; All goals completed! 🐙lemma integral_bound_above {f: } {I: BoundedInterval} (h: BddOn f I) : BddAbove ((PiecewiseConstantOn.integ ·I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}) := f: I:BoundedIntervalh:BddOn f IBddAbove ((fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}) f: I:BoundedIntervalh:BddOn f I x, y (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}, y x; f: I:BoundedIntervalh:BddOn f I y (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}, y .some f: I:BoundedIntervalh:BddOn f Ib:hb:b (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}b .some; All goals completed! 🐙

Lemma 11.3.3. The proof has been reorganized somewhat from the textbook.

lemma le_lower_integral {f: } {I: BoundedInterval} {M:} (h: x (I:Set ), |f x| M) : -M * |I|ₗ lower_integral f I := ConditionallyCompleteLattice.le_csSup _ _ (integral_bound_above (BddOn.of_bounded h)) (integral_bound_lower_of_bounded h)
lemma lower_integral_le_upper {f: } {I: BoundedInterval} (h: BddOn f I) : lower_integral f I upper_integral f I := f: I:BoundedIntervalh:BddOn f Ilower_integral f I upper_integral f I f: I:BoundedIntervalh:BddOn f Iupper_integral f I upperBounds ((fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}) f: I:BoundedIntervalh:BddOn f I x (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}, x upper_integral f I; f: I:BoundedIntervalh:BddOn f Ix✝:a✝:x✝ (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}x✝ upper_integral f I f: I:BoundedIntervalh:BddOn f Ix✝:a✝:x✝ (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}x✝ lowerBounds ((fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}) f: I:BoundedIntervalh:BddOn f Ix✝:a✝:x✝ (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I} x (fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}, x✝ x All goals completed! 🐙lemma upper_integral_le {f: } {I: BoundedInterval} {M:} (h: x (I:Set ), |f x| M) : upper_integral f I M * |I|ₗ := ConditionallyCompleteLattice.csInf_le _ _ (integral_bound_below (BddOn.of_bounded h)) (integral_bound_upper_of_bounded h)lemma upper_integral_le_integ {f g: } {I: BoundedInterval} (hf: BddOn f I) (hfg: MajorizesOn g f I) (hg: PiecewiseConstantOn g I) : upper_integral f I hg.integ' := f: g: I:BoundedIntervalhf:BddOn f Ihfg:MajorizesOn g f Ihg:PiecewiseConstantOn g Iupper_integral f I hg.integ' f: g: I:BoundedIntervalhf:BddOn f Ihfg:MajorizesOn g f Ihg:PiecewiseConstantOn g Ihg.integ' (fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I} f: g: I:BoundedIntervalhf:BddOn f Ihfg:MajorizesOn g f Ihg:PiecewiseConstantOn g Ig {g | MajorizesOn g f I PiecewiseConstantOn g I} (fun x => PiecewiseConstantOn.integ x I) g = hg.integ'; All goals completed! 🐙lemma integ_le_lower_integral {f h: } {I: BoundedInterval} (hf: BddOn f I) (hfh: MinorizesOn h f I) (hg: PiecewiseConstantOn h I) : hg.integ' lower_integral f I := f: h: I:BoundedIntervalhf:BddOn f Ihfh:MinorizesOn h f Ihg:PiecewiseConstantOn h Ihg.integ' lower_integral f I f: h: I:BoundedIntervalhf:BddOn f Ihfh:MinorizesOn h f Ihg:PiecewiseConstantOn h Ihg.integ' (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I} f: h: I:BoundedIntervalhf:BddOn f Ihfh:MinorizesOn h f Ihg:PiecewiseConstantOn h Ih {g | MinorizesOn g f I PiecewiseConstantOn g I} (fun x => PiecewiseConstantOn.integ x I) h = hg.integ'; All goals completed! 🐙lemma lt_of_gt_upper_integral {f: } {I: BoundedInterval} (hf: BddOn f I) {X:} (hX: upper_integral f I < X ) : g, MajorizesOn g f I PiecewiseConstantOn g I PiecewiseConstantOn.integ g I < X := f: I:BoundedIntervalhf:BddOn f IX:hX:upper_integral f I < X g, MajorizesOn g f I PiecewiseConstantOn g I PiecewiseConstantOn.integ g I < X f: I:BoundedIntervalhf:BddOn f IX:hX:upper_integral f I < XY:hY:Y (fun x => PiecewiseConstantOn.integ x I) '' {g | MajorizesOn g f I PiecewiseConstantOn g I}hYX:Y < X g, MajorizesOn g f I PiecewiseConstantOn g I PiecewiseConstantOn.integ g I < X f: I:BoundedIntervalhf:BddOn f IX:hX:upper_integral f I < XY:hYX:Y < XhY: x, (MajorizesOn x f I PiecewiseConstantOn x I) PiecewiseConstantOn.integ x I = Y g, MajorizesOn g f I PiecewiseConstantOn g I PiecewiseConstantOn.integ g I < X; f: I:BoundedIntervalhf:BddOn f IX:hX:upper_integral f I < XY:hYX:Y < XhY: x, (MajorizesOn x f I PiecewiseConstantOn x I) PiecewiseConstantOn.integ x I = Yg✝: this:(MajorizesOn g✝ f I PiecewiseConstantOn g✝ I) PiecewiseConstantOn.integ g✝ I = YMajorizesOn g✝ f I PiecewiseConstantOn g✝ I PiecewiseConstantOn.integ g✝ I < X; f: I:BoundedIntervalhf:BddOn f IX:hX:upper_integral f I < XY:hYX:Y < XhY: x, (MajorizesOn x f I PiecewiseConstantOn x I) PiecewiseConstantOn.integ x I = Yg✝: this:(MajorizesOn g✝ f I PiecewiseConstantOn g✝ I) PiecewiseConstantOn.integ g✝ I = YMajorizesOn g✝ f I; All goals completed! 🐙lemma gt_of_lt_lower_integral {f: } {I: BoundedInterval} (hf: BddOn f I) {X:} (hX: X < lower_integral f I) : h, MinorizesOn h f I PiecewiseConstantOn h I X < PiecewiseConstantOn.integ h I := f: I:BoundedIntervalhf:BddOn f IX:hX:X < lower_integral f I h, MinorizesOn h f I PiecewiseConstantOn h I X < PiecewiseConstantOn.integ h I f: I:BoundedIntervalhf:BddOn f IX:hX:X < lower_integral f IY:hY:Y (fun x => PiecewiseConstantOn.integ x I) '' {g | MinorizesOn g f I PiecewiseConstantOn g I}hYX:X < Y h, MinorizesOn h f I PiecewiseConstantOn h I X < PiecewiseConstantOn.integ h I f: I:BoundedIntervalhf:BddOn f IX:hX:X < lower_integral f IY:hYX:X < YhY: x, (MinorizesOn x f I PiecewiseConstantOn x I) PiecewiseConstantOn.integ x I = Y h, MinorizesOn h f I PiecewiseConstantOn h I X < PiecewiseConstantOn.integ h I; f: I:BoundedIntervalhf:BddOn f IX:hX:X < lower_integral f IY:hYX:X < YhY: x, (MinorizesOn x f I PiecewiseConstantOn x I) PiecewiseConstantOn.integ x I = Yh✝: this:(MinorizesOn h✝ f I PiecewiseConstantOn h✝ I) PiecewiseConstantOn.integ h✝ I = YMinorizesOn h✝ f I PiecewiseConstantOn h✝ I X < PiecewiseConstantOn.integ h✝ I; f: I:BoundedIntervalhf:BddOn f IX:hX:X < lower_integral f IY:hYX:X < YhY: x, (MinorizesOn x f I PiecewiseConstantOn x I) PiecewiseConstantOn.integ x I = Yh✝: this:(MinorizesOn h✝ f I PiecewiseConstantOn h✝ I) PiecewiseConstantOn.integ h✝ I = YMinorizesOn h✝ f I; All goals completed! 🐙

Definition 11.3.4 (Riemann integral) As we permit junk values, the simplest definition for the Riemann integral is the upper integral.

noncomputable abbrev integ (f: ) (I: BoundedInterval) : := upper_integral f I
theorem integ_congr {f g: } {I: BoundedInterval} (h: Set.EqOn f g I) : integ f I = integ g I := upper_integral_congr hnoncomputable abbrev IntegrableOn (f: ) (I: BoundedInterval) : Prop := BddOn f I lower_integral f I = upper_integral f I

Lemma 11.3.7 / Exercise 11.3.3

theorem declaration uses 'sorry'integ_of_piecewise_const {f: } {I: BoundedInterval} (hf: PiecewiseConstantOn f I) : IntegrableOn f I integ f I = hf.integ' := f: I:BoundedIntervalhf:PiecewiseConstantOn f IIntegrableOn f I integ f I = hf.integ' All goals completed! 🐙

Remark 11.3.8

theorem integ_on_subsingleton {f: } {I: BoundedInterval} (hI: |I|ₗ = 0) : IntegrableOn f I integ f I = 0 := f: I:BoundedIntervalhI:I.length = 0IntegrableOn f I integ f I = 0 f: I:BoundedIntervalhI:I.length = 0this:Subsingleton IIntegrableOn f I integ f I = 0 f: I:BoundedIntervalhI:I.length = 0this:Subsingleton Ihconst:ConstantOn f IIntegrableOn f I integ f I = 0 f: I:BoundedIntervalhI:I.length = 0this:Subsingleton Ihconst:ConstantOn f I0 = .integ' All goals completed! 🐙

Definition 11.3.9 (Riemann sums). The restriction to positive length J is not needed thanks to various junk value conventions.

noncomputable abbrev upper_riemann_sum (f: ) {I: BoundedInterval} (P: Partition I) : := J P.intervals, (sSup (f '' (J:Set ))) * |J|ₗ
noncomputable abbrev lower_riemann_sum (f: ) {I: BoundedInterval} (P: Partition I) : := J P.intervals, (sInf (f '' (J:Set ))) * |J|ₗ

Lemma 11.3.11 / Exercise 11.3.4

theorem declaration uses 'sorry'upper_riemann_sum_le {f g: } {I:BoundedInterval} (P: Partition I) (hf: BddOn f I) (hgf: MajorizesOn g f I) (hg: PiecewiseConstantOn g I) : upper_riemann_sum f P integ g I := f: g: I:BoundedIntervalP:Partition Ihf:BddOn f Ihgf:MajorizesOn g f Ihg:PiecewiseConstantOn g Iupper_riemann_sum f P integ g I All goals completed! 🐙
theorem declaration uses 'sorry'lower_riemann_sum_ge {f h: } {I:BoundedInterval} (P: Partition I) (hf: BddOn f I) (hfh: MinorizesOn h f I) (hg: PiecewiseConstantOn h I) : integ h I lower_riemann_sum f P := f: h: I:BoundedIntervalP:Partition Ihf:BddOn f Ihfh:MinorizesOn h f Ihg:PiecewiseConstantOn h Iinteg h I lower_riemann_sum f P All goals completed! 🐙

Proposition 11.3.12 / Exercise 11.3.5

theorem declaration uses 'sorry'upper_integ_le_upper_sum {f: } {I:BoundedInterval} (hf: BddOn f I) (P: Partition I): upper_integral f I upper_riemann_sum f P := f: I:BoundedIntervalhf:BddOn f IP:Partition Iupper_integral f I upper_riemann_sum f P All goals completed! 🐙
theorem declaration uses 'sorry'upper_integ_eq_inf_upper_sum {f: } {I:BoundedInterval} (hf: BddOn f I) : upper_integral f I = sInf (.range (fun P : Partition I upper_riemann_sum f P)) := f: I:BoundedIntervalhf:BddOn f Iupper_integral f I = sInf (Set.range fun P => upper_riemann_sum f P) All goals completed! 🐙theorem declaration uses 'sorry'lower_integ_ge_lower_sum {f: } {I:BoundedInterval} (hf: BddOn f I) (P: Partition I): lower_riemann_sum f P lower_integral f I := f: I:BoundedIntervalhf:BddOn f IP:Partition Ilower_riemann_sum f P lower_integral f I All goals completed! 🐙theorem declaration uses 'sorry'lower_integ_eq_sup_lower_sum {f: } {I:BoundedInterval} (hf: BddOn f I) : lower_integral f I = sSup (.range (fun P : Partition I lower_riemann_sum f P)) := f: I:BoundedIntervalhf:BddOn f Ilower_integral f I = sSup (Set.range fun P => lower_riemann_sum f P) All goals completed! 🐙

Exercise 11.3.1

theorem declaration uses 'sorry'MajorizesOn.trans {f g h: } {I: BoundedInterval} (hfg: MajorizesOn f g I) (hgh: MajorizesOn g h I) : MajorizesOn f h I := f: g: h: I:BoundedIntervalhfg:MajorizesOn f g Ihgh:MajorizesOn g h IMajorizesOn f h I All goals completed! 🐙

Exercise 11.3.1

theorem declaration uses 'sorry'MajorizesOn.anti_symm {f g: } {I: BoundedInterval}: x (I:Set ), f x = g x MajorizesOn f g I MajorizesOn g f I := f: g: I:BoundedInterval x I, f x = g x MajorizesOn f g I MajorizesOn g f I All goals completed! 🐙

Exercise 11.3.2

def declaration uses 'sorry'MajorizesOn.of_add : Decidable ( (f g h: ) (I:BoundedInterval) (hfg: MajorizesOn f g I), MajorizesOn (f+h) (g+h) I) := Decidable (∀ (f g h : ) (I : BoundedInterval), MajorizesOn f g I MajorizesOn (f + h) (g + h) I) -- the first line of this construction should be either `apply isTrue` or `apply isFalse`. All goals completed! 🐙
def declaration uses 'sorry'MajorizesOn.of_mul : Decidable ( (f g h: ) (I:BoundedInterval) (hfg: MajorizesOn f g I), MajorizesOn (f*h) (g*h) I) := Decidable (∀ (f g h : ) (I : BoundedInterval), MajorizesOn f g I MajorizesOn (f * h) (g * h) I) -- the first line of this construction should be either `apply isTrue` or `apply isFalse`. All goals completed! 🐙def declaration uses 'sorry'MajorizesOn.of_smul : Decidable ( (f g: ) (c:) (I:BoundedInterval) (hfg: MajorizesOn f g I), MajorizesOn (c f) (c g) I) := Decidable (∀ (f g : ) (c : ) (I : BoundedInterval), MajorizesOn f g I MajorizesOn (c f) (c g) I) -- the first line of this construction should be either `apply isTrue` or `apply isFalse`. All goals completed! 🐙end Chapter11