module Collatz;

open import Stdlib.Prelude;
open import Stdlib.Data.Nat.Ord;

collatzNext : NatNat;
collatzNext n := if (mod n 2 == 0) (div n 2) (3 * n + 1);

collatz : NatNat;
collatz zero := zero;
collatz (suc zero) := suc zero;
collatz n := collatzNext n;

terminating
run : (NatNat)NatIO;
run _ (suc zero) := printNatLn 1 >> printStringLn "Finished!";
run f n := printNatLn n >> run f (f n);

welcome : String;
welcome := "Collatz calculator\n------------------\n\nType a number then ENTER";

resultHeading : String;
resultHeading := "Collatz sequence:";

main : IO;
main :=
  printStringLn welcome
    >> readLn
      λ {
        | s := printStringLn resultHeading >> run collatz (stringToNat s)
      };
Last modified on 2023-04-19 22:00 UTC