\import Algebra.Group
\import Algebra.Meta
\import Algebra.Monoid
\import Algebra.Pointed
\import Algebra.Semiring
\import Arith.Rat
\import Arith.Real
\import Arith.Real.Field
\import Arith.Trig.ArcTan
\import Arith.Trig.Real
\import Function.Meta
\import Meta
\import Order.StrictOrder
\import Paths
\import Paths.Meta

\sfunc pi : Real
  => 16 * arctan (ratio 1 5) (ratio-norm-<1 3) - 4 * arctan (ratio 1 239) (ratio-norm-<1 237)
  \where {
    -- | $\left|\tfrac{1}{m+2}\right| < 1$ — domain witness for $\arctan\tfrac{1}{m+2}$.
    \lemma ratio-norm-<1 (m : Nat)
      : RealAbGroup.abs (ratio 1 (suc (suc m))) < 1
      => transportInv (< 1)
          (RealAbGroup.abs-ofPos (rat_real_<=.1 (RatField.<=-char linarith)))
          (rat_real_<.1 (RatField.<-char linarith))
  }

-- | $\cos \pi_M = -1$.
\lemma cos_pi : cos pi = negative 1
  => \have sin2=1 : sin (2 * pi/4) * sin (2 * pi/4) = 1
              => rewrite (cos_pi/2, zro_*-left {RealField} {zro}, zro-left) in pythagoras {2 * pi/4}
     \in pmap cos pi=4*pi/4
         *> pmap cos linarith
         *> cos_+
         *> pmap (\lam c => c * c - sin (2 * pi/4) * sin (2 * pi/4)) cos_pi/2
         *> pmap (\lam s => 0 RealField.* 0 - s) sin2=1
         *> simplify
  \where {
    \func pi/4 : Real
      => 4 * arctan (ratio 1 5) (pi.ratio-norm-<1 3) - arctan (ratio 1 239) (pi.ratio-norm-<1 237)

    \lemma tan_pi/4 : sin pi/4 = cos pi/4
      => \let | a => arctan (ratio 1 5) (pi.ratio-norm-<1 3)
              | b => arctan (ratio 1 239) (pi.ratio-norm-<1 237)
         \in \have
              | tan_a : 5 * sin a = cos a
                      => pmap (5 *) (tan-arctan _) *> inv *-assoc *> pmap (* _) RealField.*-rat *> ide-left
              | tan_b : 239 * sin b = cos b
                      => pmap (239 *) (tan-arctan _) *> inv *-assoc *> pmap (* _) RealField.*-rat *> ide-left
              | A : 4 * a - b = (a + a) + (a + a) - b
                  => linarith
            \in unfold pi/4 $ rewrite A $
                rewrite (sin_minus {(a + a) + (a + a)} {b},
                         cos_minus {(a + a) + (a + a)} {b},
                         sin_+ {a + a} {a + a}, cos_+ {a + a} {a + a},
                         sin_+ {a} {a},         cos_+ {a} {a},
                         inv tan_a, inv tan_b)
                        equation.cRing

    \lemma pi=4*pi/4 : pi = 4 * pi/4
      => (\peval pi) *> equation.cRing

    \lemma cos_pi/2 : cos (2 * pi/4) = 0
      => pmap cos linarith *> cos_+ *> pmap (\lam s => cos pi/4 * cos pi/4 - s * s) tan_pi/4 *> negative-right
  }



-- | $\sin \pi = 0$.
\lemma sin_pi : sin pi = {Real} 0
  => pmap sin cos_pi.pi=4*pi/4
    *> pmap sin (linarith : 4 * cos_pi.pi/4 = {Real} 2 * cos_pi.pi/4 + 2 * cos_pi.pi/4)
         *> sin_+ {2 * cos_pi.pi/4} {2 * cos_pi.pi/4}
              *> rewrite cos_pi.cos_pi/2 equation.cRing

-- | $\cos(2\pi) = 1$.
\lemma cos_two_pi : cos (2 * pi) = {Real} 1
  => pmap cos linarith *> cos_+ *> rewrite (cos_pi, sin_pi) equation.cRing

-- | $\sin(2\pi) = 0$.
\lemma sin_two_pi : sin (2 * pi) = {Real} 0
  => pmap sin linarith *> sin_+ {pi} {pi} *> rewrite (cos_pi, sin_pi) equation.cRing

-- | $\cos$ is $2\pi$-periodic.
\lemma cos_period {x : Real} : cos (x + 2 * pi) = cos x
  => cos_+ *> rewrite (cos_two_pi, sin_two_pi) equation.cRing

-- | $\sin$ is $2\pi$-periodic.
\lemma sin_period {x : Real} : sin (x + 2 * pi) = sin x
  => sin_+ *> rewrite (cos_two_pi, sin_two_pi) equation.cRing