Library rt.util.fixedpoint

Require Import rt.util.tactics rt.util.induction.

Section FixedPoint.

  Lemma iter_fix T (F : T T) x k n :
    iter k F x = iter k.+1 F x
    k n
    iter n F x = iter n.+1 F x.

  Lemma fun_mon_iter_mon :
     (f: nat nat) x0 x1 x2,
      x1 x2
      f x0 x0
      ( x1 x2, x1 x2 f x1 f x2)
      iter x1 f x0 iter x2 f x0.

  Lemma fun_mon_iter_mon_helper :
     T (f: T T) (le: rel T) x0 x1,
      reflexive le
      transitive le
      ( x2, le x0 (iter x2 f x0))
      ( x1 x2, le x0 x1 le x1 x2 le (f x1) (f x2))
      le (iter x1 f x0) (iter x1.+1 f x0).

  Lemma fun_mon_iter_mon_generic :
     T (f: T T) (le: rel T) x0 x1 x2,
      reflexive le
      transitive le
      x1 x2
      ( x1 x2, le x0 x1 le x1 x2 le (f x1) (f x2))
      ( x2 : nat, le x0 (iter x2 f x0))
      le (iter x1 f x0) (iter x2 f x0).

End FixedPoint.