-- ackermann function
ack :: Nat -> Nat -> Nat
ack      Z                      Z           =                     (S Z)           --(1, 0) =  1
ack      Z                   (S Z)          =                   (S(S Z))          --(1, 1) =  2
ack      Z                 (S(S Z))         =                 (S(S(S Z)))         --(1, 2) =  3
ack      Z               (S(S(S Z)))        =               (S(S(S(S Z))))        --(1, 3) =  4
ack      Z             (S(S(S(S Z))))       =             (S(S(S(S(S Z)))))       --(1, 4) =  5
ack      Z           (S(S(S(S(S Z)))))      =           (S(S(S(S(S(S Z))))))      --(1, 5) =  6
ack      Z         (S(S(S(S(S(S Z))))))     =         (S(S(S(S(S(S(S Z)))))))     --(1, 6) =  7
ack      Z       (S(S(S(S(S(S(S Z)))))))    =       (S(S(S(S(S(S(S(S Z))))))))    --(1, 7) =  8
ack      Z     (S(S(S(S(S(S(S(S Z))))))))   =     (S(S(S(S(S(S(S(S(S Z)))))))))   --(1, 8) =  9
ack      Z   (S(S(S(S(S(S(S(S(S Z)))))))))  =   (S(S(S(S(S(S(S(S(S(S Z))))))))))  --(1, 9) = 10
ack      Z (S(S(S(S(S(S(S(S(S(S Z)))))))))) = (S(S(S(S(S(S(S(S(S(S(S Z))))))))))) --(1,10) = 11
ack   (S Z)                     Z           =                   (S(S Z))          --(1, 0) =  2
ack   (S Z)                  (S Z)          =                 (S(S(S Z)))         --(1, 1) =  3
ack   (S Z)                (S(S Z))         =               (S(S(S(S Z))))        --(1, 2) =  4
ack   (S Z)              (S(S(S Z)))        =             (S(S(S(S(S Z)))))       --(1, 3) =  5
ack   (S Z)            (S(S(S(S Z))))       =           (S(S(S(S(S(S Z))))))      --(1, 4) =  6
ack   (S Z)          (S(S(S(S(S Z)))))      =         (S(S(S(S(S(S(S Z)))))))     --(1, 5) =  7
ack   (S Z)        (S(S(S(S(S(S Z))))))     =       (S(S(S(S(S(S(S(S Z))))))))    --(1, 6) =  8
ack   (S Z)      (S(S(S(S(S(S(S Z)))))))    =     (S(S(S(S(S(S(S(S(S Z)))))))))   --(1, 7) =  9
ack   (S Z)    (S(S(S(S(S(S(S(S Z))))))))   =   (S(S(S(S(S(S(S(S(S(S Z))))))))))  --(1, 8) = 10
ack   (S Z)  (S(S(S(S(S(S(S(S(S Z)))))))))  = (S(S(S(S(S(S(S(S(S(S(S Z))))))))))) --(1, 9) = 11
ack (S(S Z))                    Z           =                 (S(S(S Z)))         --(2, 0) =  3
ack (S(S Z))                 (S Z)          =             (S(S(S(S(S Z)))))       --(2, 1) =  5
ack (S(S Z))               (S(S Z))         =         (S(S(S(S(S(S(S Z)))))))     --(2, 2) =  7
ack (S(S Z))             (S(S(S Z)))        =     (S(S(S(S(S(S(S(S(S Z)))))))))   --(2, 3) =  9
ack (S(S Z))           (S(S(S(S Z))))       = (S(S(S(S(S(S(S(S(S(S(S Z))))))))))) --(2, 4) = 11
