namespace http://mathhub.info/MitM/core/calculus 

import base http://mathhub.info/MitM/Foundation 
import ts http://mathhub.info/MitM/core/typedsets 
import ms http://mathhub.info/MitM/core/measures 

theory LebesgueIntegral : base:?Logic =
	include ☞ms:?Measure 
	include ☞ts:?Functions 
	include ☞ts:?SetCollection 
	include ?SimpleFunctions 
	include ☞ts:?SetSum 
	include ☞ts:?SupremumReal 
	include ☞ms:?LebesgueMeasurable 
	// include arith:?RealArithmetics ❙

  simpleLebesgueIntegral :  {m : measureSpace , s : nonnegativeSimpleFunction  m }  ℝ 
    = [m , s] setSum  ((im (πl s) (fullset (m.universe))) : set ℝ) 
  (theorem_nonnegativeSimpleFunctionHasFiniteValues m s) (([x] x ⋅ (m.rmeasure.measure) (elem (m.sigma_algebra.coll) (preim (πl s) (single x)))) : ℝ ⟶ ℝ) 
	
  upperFunction : {a : type} (a ⟶ ℝ) ⟶ a ⟶ ℝ  =  [a , f , x ] max (f x) 0
  
  lowerFunction : {a : type} (a ⟶ ℝ) ⟶ a ⟶ ℝ  =  [a : type, f : a ⟶ ℝ, x : a] max (- f x) 0  
  
  lemma_upperFunctionIsNonNegative : {A : type , f : A ⟶ ℝ} ⊦ prop_nonnegative_function (upperFunction A f) 
  # upperFunctionIsNonNegative 2
  
  lemma_lowerFunctionInNonNegative : {A : type , f : A ⟶ ℝ} ⊦ prop_nonnegative_function (lowerFunction A f)  
  # lowerFunctionInNonNegative 2
  
 
	positiveLebesgueIntegral : {m : measureSpace, f : (m.universe ⟶ ℝ)} ⊦ lebesgueMeasurableLeq (m.sigma_algebra) f ⟶
	⊦ prop_nonnegative_function f  ⟶ ℝ 
	 = [m , f, p1,p2] supR ( im (simpleLebesgueIntegral m) ( ⟪ fullset (nonnegativeSimpleFunction m) | ([ff] (∀[x] ((πl ff) x) ≤ (f x))) ⟫ )) 

	
	lemma_lebesgueMeasurableFunctionUpperLebesgueMeasurable : 
	{A : type , s : sigmaAlgebra A, f : A ⟶ ℝ} ⊦ lebesgueMeasurableLeq s f ⟶ ⊦ lebesgueMeasurableLeq s (upperFunction A f)  
	 # lebesgueMeasurableFunctionUpperLebesgueMeasurable 2 3 4
	
	lemma_lebesgueMeasurableFunctionLowerLebesgueMeasurable : 
	{A : type , s : sigmaAlgebra A, f : A ⟶ ℝ} ⊦ lebesgueMeasurableLeq s f ⟶ ⊦ lebesgueMeasurableLeq s (lowerFunction A f)  
	# lebesgueMeasurableFunctionLowerLebesgueMeasurable 2 3 4
	
	lebesgueIntegrable : {ms : measureSpace, f : (ms.universe ⟶ ℝ)} ⊦ lebesgueMeasurableLeq (ms.sigma_algebra) f ⟶ bool
	 = [ms, f , p] positiveLebesgueIntegral ms (upperFunction (ms.universe) f) 
	(lebesgueMeasurableFunctionUpperLebesgueMeasurable (ms.sigma_algebra) f p) 
	(upperFunctionIsNonNegative f)
	< ∞ ∧ positiveLebesgueIntegral ms (lowerFunction (ms.universe) f) 
	(lebesgueMeasurableFunctionLowerLebesgueMeasurable (ms.sigma_algebra) f p) 
	(lowerFunctionInNonNegative f)
	< ∞ 
	

	quasiIntegrable : {ms : measureSpace , f : (ms.universe ⟶ ℝ)} ⊦ lebesgueMeasurableLeq (ms.sigma_algebra) f ⟶ bool 
	 = [ms, f , p] positiveLebesgueIntegral ms (upperFunction (ms.universe) f) 
	(lebesgueMeasurableFunctionUpperLebesgueMeasurable (ms.sigma_algebra) f p) 
	(upperFunctionIsNonNegative f)
	< ∞ ∨ positiveLebesgueIntegral ms (lowerFunction (ms.universe) f) 
	(lebesgueMeasurableFunctionLowerLebesgueMeasurable (ms.sigma_algebra) f p) 
	(lowerFunctionInNonNegative f)
	< ∞ 
	

	lebesgueIntegral : {m : measureSpace ,f : ((m.universe ⟶ ℝ)) , 
	p1 : ⊦ lebesgueMeasurableLeq (m.sigma_algebra) f}  ⊦  quasiIntegrable m f p1 ⟶ ℝ   
	 = [m,f, p1 , p2] 
	(positiveLebesgueIntegral m (upperFunction (m.universe) f) 
	(lebesgueMeasurableFunctionUpperLebesgueMeasurable (m.sigma_algebra) f p1) 
	(upperFunctionIsNonNegative f) : ℝ) + 
	(- (positiveLebesgueIntegral m (lowerFunction (m.universe) f) 
	(lebesgueMeasurableFunctionLowerLebesgueMeasurable (m.sigma_algebra) f p1) 
	(lowerFunctionInNonNegative f) : ℝ))