/export/starexec/sandbox2/solver/bin/starexec_run_standard /export/starexec/sandbox2/benchmark/theBenchmark.hs /export/starexec/sandbox2/output/output_files -------------------------------------------------------------------------------- MAYBE proof of /export/starexec/sandbox2/benchmark/theBenchmark.hs # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty H-Termination with start terms of the given HASKELL could not be shown: (0) HASKELL (1) BR [EQUIVALENT, 0 ms] (2) HASKELL (3) COR [EQUIVALENT, 0 ms] (4) HASKELL ---------------------------------------- (0) Obligation: mainModule Main module Main where { import qualified Prelude; data Double = Double MyInt MyInt ; data MyBool = MyTrue | MyFalse ; data MyInt = Pos Main.Nat | Neg Main.Nat ; data Main.Nat = Succ Main.Nat | Zero ; data Ordering = LT | EQ | GT ; data Ratio a = CnPc a a ; absMyInt :: MyInt -> MyInt; absMyInt = absReal; absReal x = absReal2 x; absReal0 x MyTrue = negateMyInt x; absReal1 x MyTrue = x; absReal1 x MyFalse = absReal0 x otherwise; absReal2 x = absReal1 x (gtEsMyInt x (fromIntMyInt (Main.Pos Main.Zero))); compareMyInt :: MyInt -> MyInt -> Ordering; compareMyInt = primCmpInt; doubleToRatio (Double x y) = pc (fromIntMyInt x) (fromIntMyInt y); error :: a; error = stop MyTrue; esEsMyInt :: MyInt -> MyInt -> MyBool; esEsMyInt = primEqInt; esEsOrdering :: Ordering -> Ordering -> MyBool; esEsOrdering LT LT = MyTrue; esEsOrdering LT EQ = MyFalse; esEsOrdering LT GT = MyFalse; esEsOrdering EQ LT = MyFalse; esEsOrdering EQ EQ = MyTrue; esEsOrdering EQ GT = MyFalse; esEsOrdering GT LT = MyFalse; esEsOrdering GT EQ = MyFalse; esEsOrdering GT GT = MyTrue; fromDoubleRatio :: Double -> Ratio MyInt; fromDoubleRatio = doubleToRatio; fromIntMyInt :: MyInt -> MyInt; fromIntMyInt x = x; fsEsOrdering :: Ordering -> Ordering -> MyBool; fsEsOrdering x y = not (esEsOrdering x y); gcd yx yy = gcd3 yx yy; gcd x y = gcd0 x y; gcd0 x y = gcd0Gcd' (absMyInt x) (absMyInt y); gcd0Gcd' x xx = gcd0Gcd'2 x xx; gcd0Gcd' x y = gcd0Gcd'0 x y; gcd0Gcd'0 x y = gcd0Gcd' y (remMyInt x y); gcd0Gcd'1 MyTrue x xx = x; gcd0Gcd'1 xy xz yu = gcd0Gcd'0 xz yu; gcd0Gcd'2 x xx = gcd0Gcd'1 (esEsMyInt xx (fromIntMyInt (Main.Pos Main.Zero))) x xx; gcd0Gcd'2 yv yw = gcd0Gcd'0 yv yw; gcd1 MyTrue yx yy = Main.error; gcd1 yz zu zv = gcd0 zu zv; gcd2 MyTrue yx yy = gcd1 (esEsMyInt yy (fromIntMyInt (Main.Pos Main.Zero))) yx yy; gcd2 zw zx zy = gcd0 zx zy; gcd3 yx yy = gcd2 (esEsMyInt yx (fromIntMyInt (Main.Pos Main.Zero))) yx yy; gcd3 zz vuu = gcd0 zz vuu; gtEsMyInt :: MyInt -> MyInt -> MyBool; gtEsMyInt x y = fsEsOrdering (compareMyInt x y) LT; gtMyInt :: MyInt -> MyInt -> MyBool; gtMyInt x y = esEsOrdering (compareMyInt x y) GT; negateMyInt :: MyInt -> MyInt; negateMyInt = primNegInt; not :: MyBool -> MyBool; not MyTrue = MyFalse; not MyFalse = MyTrue; otherwise :: MyBool; otherwise = MyTrue; pc x y = reduce (srMyInt x (signumMyInt y)) (absMyInt y); primCmpInt :: MyInt -> MyInt -> Ordering; primCmpInt (Main.Pos Main.Zero) (Main.Pos Main.Zero) = EQ; primCmpInt (Main.Pos Main.Zero) (Main.Neg Main.Zero) = EQ; primCmpInt (Main.Neg Main.Zero) (Main.Pos Main.Zero) = EQ; primCmpInt (Main.Neg Main.Zero) (Main.Neg Main.Zero) = EQ; primCmpInt (Main.Pos x) (Main.Pos y) = primCmpNat x y; primCmpInt (Main.Pos x) (Main.Neg y) = GT; primCmpInt (Main.Neg x) (Main.Pos y) = LT; primCmpInt (Main.Neg x) (Main.Neg y) = primCmpNat y x; primCmpNat :: Main.Nat -> Main.Nat -> Ordering; primCmpNat Main.Zero Main.Zero = EQ; primCmpNat Main.Zero (Main.Succ y) = LT; primCmpNat (Main.Succ x) Main.Zero = GT; primCmpNat (Main.Succ x) (Main.Succ y) = primCmpNat x y; primDivNatS :: Main.Nat -> Main.Nat -> Main.Nat; primDivNatS Main.Zero Main.Zero = Main.error; primDivNatS (Main.Succ x) Main.Zero = Main.error; primDivNatS (Main.Succ x) (Main.Succ y) = primDivNatS0 x y (primGEqNatS x y); primDivNatS Main.Zero (Main.Succ x) = Main.Zero; primDivNatS0 x y MyTrue = Main.Succ (primDivNatS (primMinusNatS x y) (Main.Succ y)); primDivNatS0 x y MyFalse = Main.Zero; primEqInt :: MyInt -> MyInt -> MyBool; primEqInt (Main.Pos (Main.Succ x)) (Main.Pos (Main.Succ y)) = primEqNat x y; primEqInt (Main.Neg (Main.Succ x)) (Main.Neg (Main.Succ y)) = primEqNat x y; primEqInt (Main.Pos Main.Zero) (Main.Neg Main.Zero) = MyTrue; primEqInt (Main.Neg Main.Zero) (Main.Pos Main.Zero) = MyTrue; primEqInt (Main.Neg Main.Zero) (Main.Neg Main.Zero) = MyTrue; primEqInt (Main.Pos Main.Zero) (Main.Pos Main.Zero) = MyTrue; primEqInt xv xw = MyFalse; primEqNat :: Main.Nat -> Main.Nat -> MyBool; primEqNat Main.Zero Main.Zero = MyTrue; primEqNat Main.Zero (Main.Succ y) = MyFalse; primEqNat (Main.Succ x) Main.Zero = MyFalse; primEqNat (Main.Succ x) (Main.Succ y) = primEqNat x y; primGEqNatS :: Main.Nat -> Main.Nat -> MyBool; primGEqNatS (Main.Succ x) Main.Zero = MyTrue; primGEqNatS (Main.Succ x) (Main.Succ y) = primGEqNatS x y; primGEqNatS Main.Zero (Main.Succ x) = MyFalse; primGEqNatS Main.Zero Main.Zero = MyTrue; primMinusNatS :: Main.Nat -> Main.Nat -> Main.Nat; primMinusNatS (Main.Succ x) (Main.Succ y) = primMinusNatS x y; primMinusNatS Main.Zero (Main.Succ y) = Main.Zero; primMinusNatS x Main.Zero = x; primModNatS :: Main.Nat -> Main.Nat -> Main.Nat; primModNatS Main.Zero Main.Zero = Main.error; primModNatS Main.Zero (Main.Succ x) = Main.Zero; primModNatS (Main.Succ x) Main.Zero = Main.error; primModNatS (Main.Succ x) (Main.Succ Main.Zero) = Main.Zero; primModNatS (Main.Succ x) (Main.Succ (Main.Succ y)) = primModNatS0 x y (primGEqNatS x (Main.Succ y)); primModNatS0 x y MyTrue = primModNatS (primMinusNatS x (Main.Succ y)) (Main.Succ (Main.Succ y)); primModNatS0 x y MyFalse = Main.Succ x; primMulInt :: MyInt -> MyInt -> MyInt; primMulInt (Main.Pos x) (Main.Pos y) = Main.Pos (primMulNat x y); primMulInt (Main.Pos x) (Main.Neg y) = Main.Neg (primMulNat x y); primMulInt (Main.Neg x) (Main.Pos y) = Main.Neg (primMulNat x y); primMulInt (Main.Neg x) (Main.Neg y) = Main.Pos (primMulNat x y); primMulNat :: Main.Nat -> Main.Nat -> Main.Nat; primMulNat Main.Zero Main.Zero = Main.Zero; primMulNat Main.Zero (Main.Succ y) = Main.Zero; primMulNat (Main.Succ x) Main.Zero = Main.Zero; primMulNat (Main.Succ x) (Main.Succ y) = primPlusNat (primMulNat x (Main.Succ y)) (Main.Succ y); primNegInt :: MyInt -> MyInt; primNegInt (Main.Pos x) = Main.Neg x; primNegInt (Main.Neg x) = Main.Pos x; primPlusNat :: Main.Nat -> Main.Nat -> Main.Nat; primPlusNat Main.Zero Main.Zero = Main.Zero; primPlusNat Main.Zero (Main.Succ y) = Main.Succ y; primPlusNat (Main.Succ x) Main.Zero = Main.Succ x; primPlusNat (Main.Succ x) (Main.Succ y) = Main.Succ (Main.Succ (primPlusNat x y)); primQuotInt :: MyInt -> MyInt -> MyInt; primQuotInt (Main.Pos x) (Main.Pos (Main.Succ y)) = Main.Pos (primDivNatS x (Main.Succ y)); primQuotInt (Main.Pos x) (Main.Neg (Main.Succ y)) = Main.Neg (primDivNatS x (Main.Succ y)); primQuotInt (Main.Neg x) (Main.Pos (Main.Succ y)) = Main.Neg (primDivNatS x (Main.Succ y)); primQuotInt (Main.Neg x) (Main.Neg (Main.Succ y)) = Main.Pos (primDivNatS x (Main.Succ y)); primQuotInt wz xu = Main.error; primRemInt :: MyInt -> MyInt -> MyInt; primRemInt (Main.Pos x) (Main.Pos (Main.Succ y)) = Main.Pos (primModNatS x (Main.Succ y)); primRemInt (Main.Pos x) (Main.Neg (Main.Succ y)) = Main.Pos (primModNatS x (Main.Succ y)); primRemInt (Main.Neg x) (Main.Pos (Main.Succ y)) = Main.Neg (primModNatS x (Main.Succ y)); primRemInt (Main.Neg x) (Main.Neg (Main.Succ y)) = Main.Neg (primModNatS x (Main.Succ y)); primRemInt wx wy = Main.error; quotMyInt :: MyInt -> MyInt -> MyInt; quotMyInt = primQuotInt; reduce x y = reduce2 x y; reduce2 x y = reduce2Reduce1 x y x y (esEsMyInt y (fromIntMyInt (Main.Pos Main.Zero))); reduce2D vuv vuw = gcd vuv vuw; reduce2Reduce0 vuv vuw x y MyTrue = CnPc (quotMyInt x (reduce2D vuv vuw)) (quotMyInt y (reduce2D vuv vuw)); reduce2Reduce1 vuv vuw x y MyTrue = Main.error; reduce2Reduce1 vuv vuw x y MyFalse = reduce2Reduce0 vuv vuw x y otherwise; remMyInt :: MyInt -> MyInt -> MyInt; remMyInt = primRemInt; signumMyInt :: MyInt -> MyInt; signumMyInt = signumReal; signumReal x = signumReal3 x; signumReal0 x MyTrue = fromIntMyInt (Main.Neg (Main.Succ Main.Zero)); signumReal1 x MyTrue = fromIntMyInt (Main.Pos (Main.Succ Main.Zero)); signumReal1 x MyFalse = signumReal0 x otherwise; signumReal2 x MyTrue = fromIntMyInt (Main.Pos Main.Zero); signumReal2 x MyFalse = signumReal1 x (gtMyInt x (fromIntMyInt (Main.Pos Main.Zero))); signumReal3 x = signumReal2 x (esEsMyInt x (fromIntMyInt (Main.Pos Main.Zero))); srMyInt :: MyInt -> MyInt -> MyInt; srMyInt = primMulInt; stop :: MyBool -> a; stop MyFalse = stop MyFalse; } ---------------------------------------- (1) BR (EQUIVALENT) Replaced joker patterns by fresh variables and removed binding patterns. ---------------------------------------- (2) Obligation: mainModule Main module Main where { import qualified Prelude; data Double = Double MyInt MyInt ; data MyBool = MyTrue | MyFalse ; data MyInt = Pos Main.Nat | Neg Main.Nat ; data Main.Nat = Succ Main.Nat | Zero ; data Ordering = LT | EQ | GT ; data Ratio a = CnPc a a ; absMyInt :: MyInt -> MyInt; absMyInt = absReal; absReal x = absReal2 x; absReal0 x MyTrue = negateMyInt x; absReal1 x MyTrue = x; absReal1 x MyFalse = absReal0 x otherwise; absReal2 x = absReal1 x (gtEsMyInt x (fromIntMyInt (Main.Pos Main.Zero))); compareMyInt :: MyInt -> MyInt -> Ordering; compareMyInt = primCmpInt; doubleToRatio (Double x y) = pc (fromIntMyInt x) (fromIntMyInt y); error :: a; error = stop MyTrue; esEsMyInt :: MyInt -> MyInt -> MyBool; esEsMyInt = primEqInt; esEsOrdering :: Ordering -> Ordering -> MyBool; esEsOrdering LT LT = MyTrue; esEsOrdering LT EQ = MyFalse; esEsOrdering LT GT = MyFalse; esEsOrdering EQ LT = MyFalse; esEsOrdering EQ EQ = MyTrue; esEsOrdering EQ GT = MyFalse; esEsOrdering GT LT = MyFalse; esEsOrdering GT EQ = MyFalse; esEsOrdering GT GT = MyTrue; fromDoubleRatio :: Double -> Ratio MyInt; fromDoubleRatio = doubleToRatio; fromIntMyInt :: MyInt -> MyInt; fromIntMyInt x = x; fsEsOrdering :: Ordering -> Ordering -> MyBool; fsEsOrdering x y = not (esEsOrdering x y); gcd yx yy = gcd3 yx yy; gcd x y = gcd0 x y; gcd0 x y = gcd0Gcd' (absMyInt x) (absMyInt y); gcd0Gcd' x xx = gcd0Gcd'2 x xx; gcd0Gcd' x y = gcd0Gcd'0 x y; gcd0Gcd'0 x y = gcd0Gcd' y (remMyInt x y); gcd0Gcd'1 MyTrue x xx = x; gcd0Gcd'1 xy xz yu = gcd0Gcd'0 xz yu; gcd0Gcd'2 x xx = gcd0Gcd'1 (esEsMyInt xx (fromIntMyInt (Main.Pos Main.Zero))) x xx; gcd0Gcd'2 yv yw = gcd0Gcd'0 yv yw; gcd1 MyTrue yx yy = Main.error; gcd1 yz zu zv = gcd0 zu zv; gcd2 MyTrue yx yy = gcd1 (esEsMyInt yy (fromIntMyInt (Main.Pos Main.Zero))) yx yy; gcd2 zw zx zy = gcd0 zx zy; gcd3 yx yy = gcd2 (esEsMyInt yx (fromIntMyInt (Main.Pos Main.Zero))) yx yy; gcd3 zz vuu = gcd0 zz vuu; gtEsMyInt :: MyInt -> MyInt -> MyBool; gtEsMyInt x y = fsEsOrdering (compareMyInt x y) LT; gtMyInt :: MyInt -> MyInt -> MyBool; gtMyInt x y = esEsOrdering (compareMyInt x y) GT; negateMyInt :: MyInt -> MyInt; negateMyInt = primNegInt; not :: MyBool -> MyBool; not MyTrue = MyFalse; not MyFalse = MyTrue; otherwise :: MyBool; otherwise = MyTrue; pc x y = reduce (srMyInt x (signumMyInt y)) (absMyInt y); primCmpInt :: MyInt -> MyInt -> Ordering; primCmpInt (Main.Pos Main.Zero) (Main.Pos Main.Zero) = EQ; primCmpInt (Main.Pos Main.Zero) (Main.Neg Main.Zero) = EQ; primCmpInt (Main.Neg Main.Zero) (Main.Pos Main.Zero) = EQ; primCmpInt (Main.Neg Main.Zero) (Main.Neg Main.Zero) = EQ; primCmpInt (Main.Pos x) (Main.Pos y) = primCmpNat x y; primCmpInt (Main.Pos x) (Main.Neg y) = GT; primCmpInt (Main.Neg x) (Main.Pos y) = LT; primCmpInt (Main.Neg x) (Main.Neg y) = primCmpNat y x; primCmpNat :: Main.Nat -> Main.Nat -> Ordering; primCmpNat Main.Zero Main.Zero = EQ; primCmpNat Main.Zero (Main.Succ y) = LT; primCmpNat (Main.Succ x) Main.Zero = GT; primCmpNat (Main.Succ x) (Main.Succ y) = primCmpNat x y; primDivNatS :: Main.Nat -> Main.Nat -> Main.Nat; primDivNatS Main.Zero Main.Zero = Main.error; primDivNatS (Main.Succ x) Main.Zero = Main.error; primDivNatS (Main.Succ x) (Main.Succ y) = primDivNatS0 x y (primGEqNatS x y); primDivNatS Main.Zero (Main.Succ x) = Main.Zero; primDivNatS0 x y MyTrue = Main.Succ (primDivNatS (primMinusNatS x y) (Main.Succ y)); primDivNatS0 x y MyFalse = Main.Zero; primEqInt :: MyInt -> MyInt -> MyBool; primEqInt (Main.Pos (Main.Succ x)) (Main.Pos (Main.Succ y)) = primEqNat x y; primEqInt (Main.Neg (Main.Succ x)) (Main.Neg (Main.Succ y)) = primEqNat x y; primEqInt (Main.Pos Main.Zero) (Main.Neg Main.Zero) = MyTrue; primEqInt (Main.Neg Main.Zero) (Main.Pos Main.Zero) = MyTrue; primEqInt (Main.Neg Main.Zero) (Main.Neg Main.Zero) = MyTrue; primEqInt (Main.Pos Main.Zero) (Main.Pos Main.Zero) = MyTrue; primEqInt xv xw = MyFalse; primEqNat :: Main.Nat -> Main.Nat -> MyBool; primEqNat Main.Zero Main.Zero = MyTrue; primEqNat Main.Zero (Main.Succ y) = MyFalse; primEqNat (Main.Succ x) Main.Zero = MyFalse; primEqNat (Main.Succ x) (Main.Succ y) = primEqNat x y; primGEqNatS :: Main.Nat -> Main.Nat -> MyBool; primGEqNatS (Main.Succ x) Main.Zero = MyTrue; primGEqNatS (Main.Succ x) (Main.Succ y) = primGEqNatS x y; primGEqNatS Main.Zero (Main.Succ x) = MyFalse; primGEqNatS Main.Zero Main.Zero = MyTrue; primMinusNatS :: Main.Nat -> Main.Nat -> Main.Nat; primMinusNatS (Main.Succ x) (Main.Succ y) = primMinusNatS x y; primMinusNatS Main.Zero (Main.Succ y) = Main.Zero; primMinusNatS x Main.Zero = x; primModNatS :: Main.Nat -> Main.Nat -> Main.Nat; primModNatS Main.Zero Main.Zero = Main.error; primModNatS Main.Zero (Main.Succ x) = Main.Zero; primModNatS (Main.Succ x) Main.Zero = Main.error; primModNatS (Main.Succ x) (Main.Succ Main.Zero) = Main.Zero; primModNatS (Main.Succ x) (Main.Succ (Main.Succ y)) = primModNatS0 x y (primGEqNatS x (Main.Succ y)); primModNatS0 x y MyTrue = primModNatS (primMinusNatS x (Main.Succ y)) (Main.Succ (Main.Succ y)); primModNatS0 x y MyFalse = Main.Succ x; primMulInt :: MyInt -> MyInt -> MyInt; primMulInt (Main.Pos x) (Main.Pos y) = Main.Pos (primMulNat x y); primMulInt (Main.Pos x) (Main.Neg y) = Main.Neg (primMulNat x y); primMulInt (Main.Neg x) (Main.Pos y) = Main.Neg (primMulNat x y); primMulInt (Main.Neg x) (Main.Neg y) = Main.Pos (primMulNat x y); primMulNat :: Main.Nat -> Main.Nat -> Main.Nat; primMulNat Main.Zero Main.Zero = Main.Zero; primMulNat Main.Zero (Main.Succ y) = Main.Zero; primMulNat (Main.Succ x) Main.Zero = Main.Zero; primMulNat (Main.Succ x) (Main.Succ y) = primPlusNat (primMulNat x (Main.Succ y)) (Main.Succ y); primNegInt :: MyInt -> MyInt; primNegInt (Main.Pos x) = Main.Neg x; primNegInt (Main.Neg x) = Main.Pos x; primPlusNat :: Main.Nat -> Main.Nat -> Main.Nat; primPlusNat Main.Zero Main.Zero = Main.Zero; primPlusNat Main.Zero (Main.Succ y) = Main.Succ y; primPlusNat (Main.Succ x) Main.Zero = Main.Succ x; primPlusNat (Main.Succ x) (Main.Succ y) = Main.Succ (Main.Succ (primPlusNat x y)); primQuotInt :: MyInt -> MyInt -> MyInt; primQuotInt (Main.Pos x) (Main.Pos (Main.Succ y)) = Main.Pos (primDivNatS x (Main.Succ y)); primQuotInt (Main.Pos x) (Main.Neg (Main.Succ y)) = Main.Neg (primDivNatS x (Main.Succ y)); primQuotInt (Main.Neg x) (Main.Pos (Main.Succ y)) = Main.Neg (primDivNatS x (Main.Succ y)); primQuotInt (Main.Neg x) (Main.Neg (Main.Succ y)) = Main.Pos (primDivNatS x (Main.Succ y)); primQuotInt wz xu = Main.error; primRemInt :: MyInt -> MyInt -> MyInt; primRemInt (Main.Pos x) (Main.Pos (Main.Succ y)) = Main.Pos (primModNatS x (Main.Succ y)); primRemInt (Main.Pos x) (Main.Neg (Main.Succ y)) = Main.Pos (primModNatS x (Main.Succ y)); primRemInt (Main.Neg x) (Main.Pos (Main.Succ y)) = Main.Neg (primModNatS x (Main.Succ y)); primRemInt (Main.Neg x) (Main.Neg (Main.Succ y)) = Main.Neg (primModNatS x (Main.Succ y)); primRemInt wx wy = Main.error; quotMyInt :: MyInt -> MyInt -> MyInt; quotMyInt = primQuotInt; reduce x y = reduce2 x y; reduce2 x y = reduce2Reduce1 x y x y (esEsMyInt y (fromIntMyInt (Main.Pos Main.Zero))); reduce2D vuv vuw = gcd vuv vuw; reduce2Reduce0 vuv vuw x y MyTrue = CnPc (quotMyInt x (reduce2D vuv vuw)) (quotMyInt y (reduce2D vuv vuw)); reduce2Reduce1 vuv vuw x y MyTrue = Main.error; reduce2Reduce1 vuv vuw x y MyFalse = reduce2Reduce0 vuv vuw x y otherwise; remMyInt :: MyInt -> MyInt -> MyInt; remMyInt = primRemInt; signumMyInt :: MyInt -> MyInt; signumMyInt = signumReal; signumReal x = signumReal3 x; signumReal0 x MyTrue = fromIntMyInt (Main.Neg (Main.Succ Main.Zero)); signumReal1 x MyTrue = fromIntMyInt (Main.Pos (Main.Succ Main.Zero)); signumReal1 x MyFalse = signumReal0 x otherwise; signumReal2 x MyTrue = fromIntMyInt (Main.Pos Main.Zero); signumReal2 x MyFalse = signumReal1 x (gtMyInt x (fromIntMyInt (Main.Pos Main.Zero))); signumReal3 x = signumReal2 x (esEsMyInt x (fromIntMyInt (Main.Pos Main.Zero))); srMyInt :: MyInt -> MyInt -> MyInt; srMyInt = primMulInt; stop :: MyBool -> a; stop MyFalse = stop MyFalse; } ---------------------------------------- (3) COR (EQUIVALENT) Cond Reductions: The following Function with conditions "undefined |Falseundefined; " is transformed to "undefined = undefined1; " "undefined0 True = undefined; " "undefined1 = undefined0 False; " ---------------------------------------- (4) Obligation: mainModule Main module Main where { import qualified Prelude; data Double = Double MyInt MyInt ; data MyBool = MyTrue | MyFalse ; data MyInt = Pos Main.Nat | Neg Main.Nat ; data Main.Nat = Succ Main.Nat | Zero ; data Ordering = LT | EQ | GT ; data Ratio a = CnPc a a ; absMyInt :: MyInt -> MyInt; absMyInt = absReal; absReal x = absReal2 x; absReal0 x MyTrue = negateMyInt x; absReal1 x MyTrue = x; absReal1 x MyFalse = absReal0 x otherwise; absReal2 x = absReal1 x (gtEsMyInt x (fromIntMyInt (Main.Pos Main.Zero))); compareMyInt :: MyInt -> MyInt -> Ordering; compareMyInt = primCmpInt; doubleToRatio (Double x y) = pc (fromIntMyInt x) (fromIntMyInt y); error :: a; error = stop MyTrue; esEsMyInt :: MyInt -> MyInt -> MyBool; esEsMyInt = primEqInt; esEsOrdering :: Ordering -> Ordering -> MyBool; esEsOrdering LT LT = MyTrue; esEsOrdering LT EQ = MyFalse; esEsOrdering LT GT = MyFalse; esEsOrdering EQ LT = MyFalse; esEsOrdering EQ EQ = MyTrue; esEsOrdering EQ GT = MyFalse; esEsOrdering GT LT = MyFalse; esEsOrdering GT EQ = MyFalse; esEsOrdering GT GT = MyTrue; fromDoubleRatio :: Double -> Ratio MyInt; fromDoubleRatio = doubleToRatio; fromIntMyInt :: MyInt -> MyInt; fromIntMyInt x = x; fsEsOrdering :: Ordering -> Ordering -> MyBool; fsEsOrdering x y = not (esEsOrdering x y); gcd yx yy = gcd3 yx yy; gcd x y = gcd0 x y; gcd0 x y = gcd0Gcd' (absMyInt x) (absMyInt y); gcd0Gcd' x xx = gcd0Gcd'2 x xx; gcd0Gcd' x y = gcd0Gcd'0 x y; gcd0Gcd'0 x y = gcd0Gcd' y (remMyInt x y); gcd0Gcd'1 MyTrue x xx = x; gcd0Gcd'1 xy xz yu = gcd0Gcd'0 xz yu; gcd0Gcd'2 x xx = gcd0Gcd'1 (esEsMyInt xx (fromIntMyInt (Main.Pos Main.Zero))) x xx; gcd0Gcd'2 yv yw = gcd0Gcd'0 yv yw; gcd1 MyTrue yx yy = Main.error; gcd1 yz zu zv = gcd0 zu zv; gcd2 MyTrue yx yy = gcd1 (esEsMyInt yy (fromIntMyInt (Main.Pos Main.Zero))) yx yy; gcd2 zw zx zy = gcd0 zx zy; gcd3 yx yy = gcd2 (esEsMyInt yx (fromIntMyInt (Main.Pos Main.Zero))) yx yy; gcd3 zz vuu = gcd0 zz vuu; gtEsMyInt :: MyInt -> MyInt -> MyBool; gtEsMyInt x y = fsEsOrdering (compareMyInt x y) LT; gtMyInt :: MyInt -> MyInt -> MyBool; gtMyInt x y = esEsOrdering (compareMyInt x y) GT; negateMyInt :: MyInt -> MyInt; negateMyInt = primNegInt; not :: MyBool -> MyBool; not MyTrue = MyFalse; not MyFalse = MyTrue; otherwise :: MyBool; otherwise = MyTrue; pc x y = reduce (srMyInt x (signumMyInt y)) (absMyInt y); primCmpInt :: MyInt -> MyInt -> Ordering; primCmpInt (Main.Pos Main.Zero) (Main.Pos Main.Zero) = EQ; primCmpInt (Main.Pos Main.Zero) (Main.Neg Main.Zero) = EQ; primCmpInt (Main.Neg Main.Zero) (Main.Pos Main.Zero) = EQ; primCmpInt (Main.Neg Main.Zero) (Main.Neg Main.Zero) = EQ; primCmpInt (Main.Pos x) (Main.Pos y) = primCmpNat x y; primCmpInt (Main.Pos x) (Main.Neg y) = GT; primCmpInt (Main.Neg x) (Main.Pos y) = LT; primCmpInt (Main.Neg x) (Main.Neg y) = primCmpNat y x; primCmpNat :: Main.Nat -> Main.Nat -> Ordering; primCmpNat Main.Zero Main.Zero = EQ; primCmpNat Main.Zero (Main.Succ y) = LT; primCmpNat (Main.Succ x) Main.Zero = GT; primCmpNat (Main.Succ x) (Main.Succ y) = primCmpNat x y; primDivNatS :: Main.Nat -> Main.Nat -> Main.Nat; primDivNatS Main.Zero Main.Zero = Main.error; primDivNatS (Main.Succ x) Main.Zero = Main.error; primDivNatS (Main.Succ x) (Main.Succ y) = primDivNatS0 x y (primGEqNatS x y); primDivNatS Main.Zero (Main.Succ x) = Main.Zero; primDivNatS0 x y MyTrue = Main.Succ (primDivNatS (primMinusNatS x y) (Main.Succ y)); primDivNatS0 x y MyFalse = Main.Zero; primEqInt :: MyInt -> MyInt -> MyBool; primEqInt (Main.Pos (Main.Succ x)) (Main.Pos (Main.Succ y)) = primEqNat x y; primEqInt (Main.Neg (Main.Succ x)) (Main.Neg (Main.Succ y)) = primEqNat x y; primEqInt (Main.Pos Main.Zero) (Main.Neg Main.Zero) = MyTrue; primEqInt (Main.Neg Main.Zero) (Main.Pos Main.Zero) = MyTrue; primEqInt (Main.Neg Main.Zero) (Main.Neg Main.Zero) = MyTrue; primEqInt (Main.Pos Main.Zero) (Main.Pos Main.Zero) = MyTrue; primEqInt xv xw = MyFalse; primEqNat :: Main.Nat -> Main.Nat -> MyBool; primEqNat Main.Zero Main.Zero = MyTrue; primEqNat Main.Zero (Main.Succ y) = MyFalse; primEqNat (Main.Succ x) Main.Zero = MyFalse; primEqNat (Main.Succ x) (Main.Succ y) = primEqNat x y; primGEqNatS :: Main.Nat -> Main.Nat -> MyBool; primGEqNatS (Main.Succ x) Main.Zero = MyTrue; primGEqNatS (Main.Succ x) (Main.Succ y) = primGEqNatS x y; primGEqNatS Main.Zero (Main.Succ x) = MyFalse; primGEqNatS Main.Zero Main.Zero = MyTrue; primMinusNatS :: Main.Nat -> Main.Nat -> Main.Nat; primMinusNatS (Main.Succ x) (Main.Succ y) = primMinusNatS x y; primMinusNatS Main.Zero (Main.Succ y) = Main.Zero; primMinusNatS x Main.Zero = x; primModNatS :: Main.Nat -> Main.Nat -> Main.Nat; primModNatS Main.Zero Main.Zero = Main.error; primModNatS Main.Zero (Main.Succ x) = Main.Zero; primModNatS (Main.Succ x) Main.Zero = Main.error; primModNatS (Main.Succ x) (Main.Succ Main.Zero) = Main.Zero; primModNatS (Main.Succ x) (Main.Succ (Main.Succ y)) = primModNatS0 x y (primGEqNatS x (Main.Succ y)); primModNatS0 x y MyTrue = primModNatS (primMinusNatS x (Main.Succ y)) (Main.Succ (Main.Succ y)); primModNatS0 x y MyFalse = Main.Succ x; primMulInt :: MyInt -> MyInt -> MyInt; primMulInt (Main.Pos x) (Main.Pos y) = Main.Pos (primMulNat x y); primMulInt (Main.Pos x) (Main.Neg y) = Main.Neg (primMulNat x y); primMulInt (Main.Neg x) (Main.Pos y) = Main.Neg (primMulNat x y); primMulInt (Main.Neg x) (Main.Neg y) = Main.Pos (primMulNat x y); primMulNat :: Main.Nat -> Main.Nat -> Main.Nat; primMulNat Main.Zero Main.Zero = Main.Zero; primMulNat Main.Zero (Main.Succ y) = Main.Zero; primMulNat (Main.Succ x) Main.Zero = Main.Zero; primMulNat (Main.Succ x) (Main.Succ y) = primPlusNat (primMulNat x (Main.Succ y)) (Main.Succ y); primNegInt :: MyInt -> MyInt; primNegInt (Main.Pos x) = Main.Neg x; primNegInt (Main.Neg x) = Main.Pos x; primPlusNat :: Main.Nat -> Main.Nat -> Main.Nat; primPlusNat Main.Zero Main.Zero = Main.Zero; primPlusNat Main.Zero (Main.Succ y) = Main.Succ y; primPlusNat (Main.Succ x) Main.Zero = Main.Succ x; primPlusNat (Main.Succ x) (Main.Succ y) = Main.Succ (Main.Succ (primPlusNat x y)); primQuotInt :: MyInt -> MyInt -> MyInt; primQuotInt (Main.Pos x) (Main.Pos (Main.Succ y)) = Main.Pos (primDivNatS x (Main.Succ y)); primQuotInt (Main.Pos x) (Main.Neg (Main.Succ y)) = Main.Neg (primDivNatS x (Main.Succ y)); primQuotInt (Main.Neg x) (Main.Pos (Main.Succ y)) = Main.Neg (primDivNatS x (Main.Succ y)); primQuotInt (Main.Neg x) (Main.Neg (Main.Succ y)) = Main.Pos (primDivNatS x (Main.Succ y)); primQuotInt wz xu = Main.error; primRemInt :: MyInt -> MyInt -> MyInt; primRemInt (Main.Pos x) (Main.Pos (Main.Succ y)) = Main.Pos (primModNatS x (Main.Succ y)); primRemInt (Main.Pos x) (Main.Neg (Main.Succ y)) = Main.Pos (primModNatS x (Main.Succ y)); primRemInt (Main.Neg x) (Main.Pos (Main.Succ y)) = Main.Neg (primModNatS x (Main.Succ y)); primRemInt (Main.Neg x) (Main.Neg (Main.Succ y)) = Main.Neg (primModNatS x (Main.Succ y)); primRemInt wx wy = Main.error; quotMyInt :: MyInt -> MyInt -> MyInt; quotMyInt = primQuotInt; reduce x y = reduce2 x y; reduce2 x y = reduce2Reduce1 x y x y (esEsMyInt y (fromIntMyInt (Main.Pos Main.Zero))); reduce2D vuv vuw = gcd vuv vuw; reduce2Reduce0 vuv vuw x y MyTrue = CnPc (quotMyInt x (reduce2D vuv vuw)) (quotMyInt y (reduce2D vuv vuw)); reduce2Reduce1 vuv vuw x y MyTrue = Main.error; reduce2Reduce1 vuv vuw x y MyFalse = reduce2Reduce0 vuv vuw x y otherwise; remMyInt :: MyInt -> MyInt -> MyInt; remMyInt = primRemInt; signumMyInt :: MyInt -> MyInt; signumMyInt = signumReal; signumReal x = signumReal3 x; signumReal0 x MyTrue = fromIntMyInt (Main.Neg (Main.Succ Main.Zero)); signumReal1 x MyTrue = fromIntMyInt (Main.Pos (Main.Succ Main.Zero)); signumReal1 x MyFalse = signumReal0 x otherwise; signumReal2 x MyTrue = fromIntMyInt (Main.Pos Main.Zero); signumReal2 x MyFalse = signumReal1 x (gtMyInt x (fromIntMyInt (Main.Pos Main.Zero))); signumReal3 x = signumReal2 x (esEsMyInt x (fromIntMyInt (Main.Pos Main.Zero))); srMyInt :: MyInt -> MyInt -> MyInt; srMyInt = primMulInt; stop :: MyBool -> a; stop MyFalse = stop MyFalse; }