namespace http://mathhub.info/MitM/core/calculus ❚
import base http://mathhub.info/MitM/Foundation ❚
import sets http://mathhub.info/MitM/core/typedsets ❚
theory Sequences : base:?Logic =
   include ?MetricSpace ❙
   include ☞sets:?AllSets ❙
   // MiKo: should G here not be a metric space? ❙
   sequence : {G: type}type ❘ = [G] ℕ ⟶ G ❘ # 1 ^ω prec 1 ❙
   structseq : {G : setstruct}type ❘ = [G] (G.universe)^ω ❘ # 1 ^ω❙
   
   // prop_isSupremum : {G: metricSpace} G^ω ⟶ G.universe ⟶ prop  ❘
   		= [G,a,l] ∀[ε : ℝ+] (∀[n : ℕ] a n < l + ε) ∧ (∃[n : ℕ] a n > l - ε) ❙
   // prop_isInfimum : {G: metricSpace} G^ω ⟶ G.universe ⟶ prop  ❘
   		= [G,a,l] ∀[ε : ℝ+] (∀[n : ℕ] a n > l - ε) ∧ (∃[n : ℕ] a n < l + ε) ❙
   // prop_hasSupremum : {G: metricSpace} G^ω ⟶ prop  ❘
   		= [G,a] ∃![g] prop_isSupremum G a g   ❙
   // prop_hasInfimum : {G: metricSpace} G^ω ⟶ prop  ❘
   		= [G,a] ∃![g] prop_isInfimum G a g    ❙
   // supremum : {G : metricSpace, a : G^ω, p : ⊦ prop_hasSupremum G a} dom G ❘
   		= [G, a, p] that (dom G) ([g] prop_isSupremum G a g) p ❘
   		# sup 2 %I3 ❙
   // infimum : {G : metricSpace, a : G^ω, p : ⊦ prop_hasInfimum G a} dom G ❘
   		= [G, a, p] that (dom G) ([g] prop_isInfimum G a g) p ❘
   		# inf 2 %I3 ❙
   	// All of this stuff is only applicable to the real numbers, due to the usage of orders, addition etc. directly on elements of the
   		domain. Possibly can be generalized ❙
❚
theory SequenceConvergence : base:?Logic =
	include ?Sequences ❙
	prop_converges : {G: metricSpace} G^ω ⟶ G.universe ⟶ prop  ❘
		= [G,a,l] ∀[ε : ℝ+]∃[n : ℕ] ∀[m : ℕ] (m ≥ n) ⇒ (d (a m) l) < ε ❙
	prop_convergent : {G: metricSpace} G^ω ⟶ prop  ❘
		= [G,a] ∃![g] prop_converges G a g   ❙
            
	// isLimitSupremum : {G: metricSpace} G^ω ⟶ G.universe ⟶ prop  ❘
		// = [G,a,l] ∀[ε : ℝ+] (∀[N : ℕ] ∃[n : ℕ] (n ≥ N) ∧ (a n > l - ε)) ∧ (∃[N : ℕ] ∀[n : ℕ] (n ≥ N) ⇒ (a n < l + ε)) ❙
	// isLimitInfimum : {G: metricSpace} G^ω ⟶ G.universe ⟶ prop  ❘
		//  = [G,a,l] ∀[ε : ℝ+] (∀[N : ℕ] ∃[n : ℕ] (n ≥ N) ∧ (a n < l + ε)) ∧ (∃[N : ℕ] ∀[n : ℕ] (n ≥ N) ⇒ (a n > l - ε)) ❙
	// hasLimitSupremum : {G: metricSpace} G^ω ⟶ prop  ❘
		// = [G,a] ∃![g] isLimitSupremum G a g   ❙
	// hasLimitInfimum : {G: metricSpace} G^ω ⟶ prop  ❘
		// = [G,a] ∃![g] isLimitInfimum G a g    ❙
	// limitSupremum : {G : metricSpace, a : G^ω, p : ⊦ hasLimitSupremum G a} dom G ❘
		//   = [G, a, p] that (dom G) ([g] isLimitSupremum G a g) p ❘
		// # limsup 2 %I3 ❙
	// limitInfimum : {G : metricSpace, a : G^ω, p : ⊦ hasLimitInfimum G a} dom G ❘
		//  = [G, a, p] that (dom G) ([g] isLimitInfimum G a g) p ❘
		// # liminf 2 %I3 ❙
         
	prop_isLimit : {G: metricSpace} G^ω ⟶ G.universe ⟶ prop  ❘
		= [G,a,l] ∀[ε : ℝ+] ∀[N : ℕ] ∃[n : ℕ] (n ≥ N) ∧ ((d (a n) l) < ε) ❙
	prop_hasLimit : {G: metricSpace} G^ω ⟶ prop  ❘
		= [G,a] ∃![g] prop_isLimit G a g    ❙
	limit : {G : metricSpace, a : G^ω, p : ⊦ prop_convergent G a} G.universe ❘
		= [G, a, p] that (G.universe) ([g : G.universe] prop_converges G a g) p ❘
		# lim 2 %I3 ❙
❚
    	      
theory FunctionLimit : base:?Logic = 
   include ?MetricSpace ❙
   /T p is the limit of f at "point" a, where A is the larger space and is restricted by cond ❙
   /T *_c-variants: only on pred_as_subs, all the others on ℝ ❙
   prop_isLimit_c : {A : metricSpace,B: metricSpace, cond : A.universe ⟶ prop} ({x : A.universe,p:⊦ cond x}B.universe) ⟶ A.universe ⟶ B.universe ⟶ prop ❘
   		= [A,B,cond][f][a,l] ∀[ε:ℝ+] ε > 0 ⇒ ∃[δ : ℝ] δ > 0 ∧ ∀[x : A.universe] ∀[p : ⊦ cond x] (d x a) < δ ⇒ (d (f x p) l) < ε ❙
   prop_hasLimit_c : {A : metricSpace,B: metricSpace, cond : A.universe ⟶ prop} ({x : A.universe,p:⊦ cond x}B.universe) ⟶ A.universe ⟶ prop ❘
   		= [A,B,cond,f,a] ∃![l : B.universe] prop_isLimit_c A B cond f a l ❙
   prop_isLimit : {A : metricSpace,B: metricSpace} (A.universe ⟶ B.universe) ⟶ A.universe ⟶ B.universe ⟶ prop ❘
   		= [A,B,f,a,l] prop_isLimit_c A B ([x]true) ([x,p] f x) a l ❙
   prop_hasLimit : {A : metricSpace,B: metricSpace} (A.universe ⟶ B.universe) ⟶ A.universe ⟶ prop ❘
   		= [A,B,f,a] ∃![l : B.universe] prop_isLimit A B f a l❙
   limit_c : {A : metricSpace, B: metricSpace, cond : A.universe ⟶ prop, f : {x : A.universe,p:⊦ cond x}B.universe, a : A.universe, p : ⊦ prop_hasLimit_c A B cond f a} B.universe ❘
   		= [A,B,cond,f,a,p] that (B.universe) ([b:B.universe] prop_isLimit_c A B cond f a b) p ❙
   limit : {A : metricSpace, B: metricSpace, f : A.universe ⟶ B.universe, a : A.universe, p : ⊦ prop_hasLimit A B f a} B.universe ❘
   		= [A,B,f,a,p] that (B.universe) ([b] prop_isLimit A B f a b) p ❙
❚
theory Completeness : base:?Logic = 
   include ?MetricSpace ❙
   include ?SequenceConvergence ❙
   // d(x_k , x_l ) → 0 for k, l → ∞ ❙
   cauchy : {M: metricSpace} (ℕ ⟶ M.universe) ⟶ prop ❘ 
     = [M, seq] ∀[ε : ℝ+] ∀[N : ℕ] ∃[k : ℕ] ∃[l : ℕ] (k ≥ N) ∧ (l > k) ∧ ((d (seq k) (seq l)) < ε) ❘
     # cauchy 2 ❙
   // every Cauchy sequence in M converges ❙
   complete : {M: metricSpace} prop ❘
     = [M] ∀[seq] cauchy seq ⇒ prop_convergent M seq ❘ # complete 1 ❙
❚
// MiKo: maybe we should refactor the iterated operation construction into $?monoid$ with the axioms ❚
theory Series : base:?Logic =
  include ?SequenceConvergence ❙
  include ?MetricMonoid ❙
  
  partialSum : {G : metricMonoid} G^ω ⟶ ℕ ⟶ (G.universe) ❘ # parSum 2 3 ❙
  axiom_partialSumBase : {G : metricMonoid} ⊦ ∀[S : G^ω] parSum S 0 ≐ (G.unit) ❙
  axiom_partialSumStep : {G : metricMonoid} ⊦ ∀[S : G^ω] ∀[n] parSum S (succ_nat_lit n) ≐ (G.op) (parSum S n) (S (succ_nat_lit n)) ❙
  prop_convergent : {G : metricMonoid} G^ω ⟶ prop ❘ = [G][S] prop_convergent G ([n] parSum S n) ❙
  series : {G : metricMonoid, S: G^ω} dom G ❘ = [G,S] lim (partialSum G S) ❘ # SUM 2 ❙ 
❚