{-# htermination (succRatio :: Ratio MyInt -> Ratio MyInt) #-} import qualified Prelude data MyBool = MyTrue | MyFalse data List a = Cons a (List a) | Nil data Tup2 a b = Tup2 a b ; data Double = Double MyInt MyInt ; data Float = Float MyInt MyInt ; data Integer = Integer MyInt ; data MyInt = Pos Nat | Neg Nat ; data Nat = Succ Nat | Zero ; data Ratio a = CnPc a a; truncateM0 xu (Tup2 m vv) = m; fromIntMyInt :: MyInt -> MyInt fromIntMyInt x = x; properFractionQ1 xv xw (Tup2 q vw) = q; stop :: MyBool -> a; stop MyFalse = stop MyFalse; error :: a; error = stop MyTrue; primMinusNatS :: Nat -> Nat -> Nat; primMinusNatS (Succ x) (Succ y) = primMinusNatS x y; primMinusNatS Zero (Succ y) = Zero; primMinusNatS x Zero = x; primDivNatS0 x y MyTrue = Succ (primDivNatS (primMinusNatS x y) (Succ y)); primDivNatS0 x y MyFalse = Zero; primGEqNatS :: Nat -> Nat -> MyBool; primGEqNatS (Succ x) Zero = MyTrue; primGEqNatS (Succ x) (Succ y) = primGEqNatS x y; primGEqNatS Zero (Succ x) = MyFalse; primGEqNatS Zero Zero = MyTrue; primDivNatS :: Nat -> Nat -> Nat; primDivNatS Zero Zero = error; primDivNatS (Succ x) Zero = error; primDivNatS (Succ x) (Succ y) = primDivNatS0 x y (primGEqNatS x y); primDivNatS Zero (Succ x) = Zero; primQuotInt :: MyInt -> MyInt -> MyInt; primQuotInt (Pos x) (Pos (Succ y)) = Pos (primDivNatS x (Succ y)); primQuotInt (Pos x) (Neg (Succ y)) = Neg (primDivNatS x (Succ y)); primQuotInt (Neg x) (Pos (Succ y)) = Neg (primDivNatS x (Succ y)); primQuotInt (Neg x) (Neg (Succ y)) = Pos (primDivNatS x (Succ y)); primQuotInt ww wx = error; primModNatS0 x y MyTrue = primModNatS (primMinusNatS x (Succ y)) (Succ (Succ y)); primModNatS0 x y MyFalse = Succ x; primModNatS :: Nat -> Nat -> Nat; primModNatS Zero Zero = error; primModNatS Zero (Succ x) = Zero; primModNatS (Succ x) Zero = error; primModNatS (Succ x) (Succ Zero) = Zero; primModNatS (Succ x) (Succ (Succ y)) = primModNatS0 x y (primGEqNatS x (Succ y)); primRemInt :: MyInt -> MyInt -> MyInt; primRemInt (Pos x) (Pos (Succ y)) = Pos (primModNatS x (Succ y)); primRemInt (Pos x) (Neg (Succ y)) = Pos (primModNatS x (Succ y)); primRemInt (Neg x) (Pos (Succ y)) = Neg (primModNatS x (Succ y)); primRemInt (Neg x) (Neg (Succ y)) = Neg (primModNatS x (Succ y)); primRemInt vy vz = error; primQrmInt :: MyInt -> MyInt -> Tup2 MyInt MyInt; primQrmInt x y = Tup2 (primQuotInt x y) (primRemInt x y); quotRemMyInt :: MyInt -> MyInt -> Tup2 MyInt MyInt quotRemMyInt = primQrmInt; properFractionVu30 xv xw = quotRemMyInt xv xw; properFractionQ xv xw = properFractionQ1 xv xw (properFractionVu30 xv xw); properFractionR0 xv xw (Tup2 vx r) = r; properFractionR xv xw = properFractionR0 xv xw (properFractionVu30 xv xw); properFractionRatio :: Ratio MyInt -> Tup2 MyInt (Ratio MyInt) properFractionRatio (CnPc x y) = Tup2 (fromIntMyInt (properFractionQ x y)) (CnPc (properFractionR x y) y); truncateVu6 xu = properFractionRatio xu; truncateM xu = truncateM0 xu (truncateVu6 xu); truncateRatio :: Ratio MyInt -> MyInt truncateRatio x = truncateM x; fromEnumRatio :: Ratio MyInt -> MyInt fromEnumRatio = truncateRatio; primMinusNat :: Nat -> Nat -> MyInt; primMinusNat Zero Zero = Pos Zero; primMinusNat Zero (Succ y) = Neg (Succ y); primMinusNat (Succ x) Zero = Pos (Succ x); primMinusNat (Succ x) (Succ y) = primMinusNat x y; primPlusNat :: Nat -> Nat -> Nat; primPlusNat Zero Zero = Zero; primPlusNat Zero (Succ y) = Succ y; primPlusNat (Succ x) Zero = Succ x; primPlusNat (Succ x) (Succ y) = Succ (Succ (primPlusNat x y)); primPlusInt :: MyInt -> MyInt -> MyInt; primPlusInt (Pos x) (Neg y) = primMinusNat x y; primPlusInt (Neg x) (Pos y) = primMinusNat y x; primPlusInt (Neg x) (Neg y) = Neg (primPlusNat x y); primPlusInt (Pos x) (Pos y) = Pos (primPlusNat x y); psMyInt :: MyInt -> MyInt -> MyInt psMyInt = primPlusInt; pt :: (a -> b) -> (c -> a) -> c -> b; pt f g x = f (g x); intToRatio x = CnPc (fromIntMyInt x) (fromIntMyInt (Pos (Succ Zero))); fromIntRatio :: MyInt -> Ratio MyInt fromIntRatio = intToRatio; toEnumRatio :: MyInt -> Ratio MyInt toEnumRatio = fromIntRatio; succRatio :: Ratio MyInt -> Ratio MyInt succRatio = pt toEnumRatio (pt (psMyInt (Pos (Succ Zero))) fromEnumRatio);