data Tree a
= Val a
| Ack
(Tree a
) (Tree a
) deriving Show
ack_next (Val a) = Val a
ack_next (Ack (Val 0) (Val b)) = Val (b+1)
ack_next (Ack (Val a) (Val 0)) = Ack (Val (a-1)) (Val 1)
ack_next (Ack (Val a) (Val b)) = Ack (Val (a-1)) (Ack (Val a) (Val (b-1)))
ack_next (Ack a b) = Ack a (ack_next b)
ack_loop (Val a) = do
ack_loop a = do
ack_loop (ack_next a)
main = do
ack_loop (Ack (Val 2) (Val 2))
ZGF0YSBUcmVlIGEgPSBWYWwgYSB8IEFjayAoVHJlZSBhKSAoVHJlZSBhKSBkZXJpdmluZyBTaG93CgphY2tfbmV4dCAoVmFsIGEpID0gVmFsIGEKYWNrX25leHQgKEFjayAoVmFsIDApIChWYWwgYikpID0gVmFsIChiKzEpCmFja19uZXh0IChBY2sgKFZhbCBhKSAoVmFsIDApKSA9IEFjayAoVmFsIChhLTEpKSAoVmFsIDEpCmFja19uZXh0IChBY2sgKFZhbCBhKSAoVmFsIGIpKSA9IEFjayAoVmFsIChhLTEpKSAoQWNrIChWYWwgYSkgKFZhbCAoYi0xKSkpCmFja19uZXh0IChBY2sgYSBiKSA9IEFjayBhIChhY2tfbmV4dCBiKQoKYWNrX2xvb3AgKFZhbCBhKSA9IGRvCglwcmludCBhCgkKYWNrX2xvb3AgYSA9IGRvCglwcmludCBhCglhY2tfbG9vcCAoYWNrX25leHQgYSkKCm1haW4gPSBkbwoJYWNrX2xvb3AgKEFjayAoVmFsIDIpIChWYWwgMikpCg==