10.42/4.61 YES 12.79/5.26 proof of /export/starexec/sandbox/benchmark/theBenchmark.hs 12.79/5.26 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 12.79/5.26 12.79/5.26 12.79/5.26 H-Termination with start terms of the given HASKELL could be proven: 12.79/5.26 12.79/5.26 (0) HASKELL 12.79/5.26 (1) CR [EQUIVALENT, 0 ms] 12.79/5.26 (2) HASKELL 12.79/5.26 (3) BR [EQUIVALENT, 0 ms] 12.79/5.26 (4) HASKELL 12.79/5.26 (5) COR [EQUIVALENT, 19 ms] 12.79/5.26 (6) HASKELL 12.79/5.26 (7) LetRed [EQUIVALENT, 0 ms] 12.79/5.26 (8) HASKELL 12.79/5.26 (9) NumRed [SOUND, 0 ms] 12.79/5.26 (10) HASKELL 12.79/5.26 (11) Narrow [SOUND, 0 ms] 12.79/5.26 (12) QDP 12.79/5.26 (13) QDPSizeChangeProof [EQUIVALENT, 0 ms] 12.79/5.26 (14) YES 12.79/5.26 12.79/5.26 12.79/5.26 ---------------------------------------- 12.79/5.26 12.79/5.26 (0) 12.79/5.26 Obligation: 12.79/5.26 mainModule Main 12.79/5.26 module FiniteMap where { 12.79/5.26 import qualified Main; 12.79/5.26 import qualified Maybe; 12.79/5.26 import qualified Prelude; 12.79/5.26 data FiniteMap b a = EmptyFM | Branch b a Int (FiniteMap b a) (FiniteMap b a) ; 12.79/5.26 12.79/5.26 instance (Eq a, Eq b) => Eq FiniteMap b a where { 12.79/5.26 } 12.79/5.26 addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b; 12.79/5.26 addListToFM_C combiner fm key_elt_pairs = foldl add fm key_elt_pairs where { 12.79/5.26 add fmap (key,elt) = addToFM_C combiner fmap key elt; 12.79/5.26 }; 12.79/5.26 12.79/5.26 addToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> a -> b -> FiniteMap a b; 12.79/5.26 addToFM_C combiner EmptyFM key elt = unitFM key elt; 12.79/5.26 addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt | new_key < key = mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r 12.79/5.26 | new_key > key = mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) 12.79/5.26 | otherwise = Branch new_key (combiner elt new_elt) size fm_l fm_r; 12.79/5.26 12.79/5.26 emptyFM :: FiniteMap a b; 12.79/5.26 emptyFM = EmptyFM; 12.79/5.26 12.79/5.26 findMax :: FiniteMap b a -> (b,a); 12.79/5.26 findMax (Branch key elt _ _ EmptyFM) = (key,elt); 12.79/5.26 findMax (Branch key elt _ _ fm_r) = findMax fm_r; 12.79/5.26 12.79/5.26 findMin :: FiniteMap a b -> (a,b); 12.79/5.26 findMin (Branch key elt _ EmptyFM _) = (key,elt); 12.79/5.26 findMin (Branch key elt _ fm_l _) = findMin fm_l; 12.79/5.26 12.79/5.26 mkBalBranch :: Ord b => b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; 12.79/5.26 mkBalBranch key elt fm_L fm_R | size_l + size_r < 2 = mkBranch 1 key elt fm_L fm_R 12.79/5.26 | size_r > sIZE_RATIO * size_l = case fm_R of { 12.79/5.26 Branch _ _ _ fm_rl fm_rr | sizeFM fm_rl < 2 * sizeFM fm_rr -> single_L fm_L fm_R 12.79/5.26 | otherwise -> double_L fm_L fm_R; 12.79/5.26 } 12.79/5.26 | size_l > sIZE_RATIO * size_r = case fm_L of { 12.79/5.26 Branch _ _ _ fm_ll fm_lr | sizeFM fm_lr < 2 * sizeFM fm_ll -> single_R fm_L fm_R 12.79/5.26 | otherwise -> double_R fm_L fm_R; 12.79/5.26 } 12.79/5.26 | otherwise = mkBranch 2 key elt fm_L fm_R where { 12.79/5.26 double_L fm_l (Branch key_r elt_r _ (Branch key_rl elt_rl _ fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 12.79/5.26 double_R (Branch key_l elt_l _ fm_ll (Branch key_lr elt_lr _ fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r); 12.79/5.26 single_L fm_l (Branch key_r elt_r _ fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; 12.79/5.26 single_R (Branch key_l elt_l _ fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); 12.79/5.26 size_l = sizeFM fm_L; 12.79/5.26 size_r = sizeFM fm_R; 12.79/5.26 }; 12.79/5.26 12.79/5.26 mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; 12.79/5.26 mkBranch which key elt fm_l fm_r = let { 12.79/5.26 result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; 12.79/5.26 } in result where { 12.79/5.26 balance_ok = True; 12.79/5.26 left_ok = case fm_l of { 12.79/5.26 EmptyFM-> True; 12.79/5.26 Branch left_key _ _ _ _-> let { 12.79/5.26 biggest_left_key = fst (findMax fm_l); 12.79/5.26 } in biggest_left_key < key; 12.79/5.26 } ; 12.79/5.26 left_size = sizeFM fm_l; 12.79/5.26 right_ok = case fm_r of { 12.79/5.26 EmptyFM-> True; 12.79/5.26 Branch right_key _ _ _ _-> let { 12.79/5.26 smallest_right_key = fst (findMin fm_r); 12.79/5.26 } in key < smallest_right_key; 12.79/5.26 } ; 12.79/5.26 right_size = sizeFM fm_r; 12.79/5.26 unbox :: Int -> Int; 12.79/5.26 unbox x = x; 12.79/5.26 }; 12.79/5.26 12.79/5.26 sIZE_RATIO :: Int; 12.79/5.26 sIZE_RATIO = 5; 12.79/5.26 12.79/5.26 sizeFM :: FiniteMap b a -> Int; 12.79/5.26 sizeFM EmptyFM = 0; 12.79/5.26 sizeFM (Branch _ _ size _ _) = size; 12.79/5.26 12.79/5.26 unitFM :: b -> a -> FiniteMap b a; 12.79/5.26 unitFM key elt = Branch key elt 1 emptyFM emptyFM; 12.79/5.26 12.79/5.26 } 12.79/5.26 module Maybe where { 12.79/5.26 import qualified FiniteMap; 12.79/5.26 import qualified Main; 12.79/5.26 import qualified Prelude; 12.79/5.26 } 12.79/5.26 module Main where { 12.79/5.26 import qualified FiniteMap; 12.79/5.26 import qualified Maybe; 12.79/5.26 import qualified Prelude; 12.79/5.26 } 12.79/5.26 12.79/5.26 ---------------------------------------- 12.79/5.26 12.79/5.26 (1) CR (EQUIVALENT) 12.79/5.26 Case Reductions: 12.79/5.26 The following Case expression 12.79/5.26 "case fm_r of { 12.79/5.26 EmptyFM -> True; 12.79/5.26 Branch right_key _ _ _ _ -> let { 12.79/5.26 smallest_right_key = fst (findMin fm_r); 12.79/5.26 } in key < smallest_right_key} 12.79/5.26 " 12.79/5.26 is transformed to 12.79/5.26 "right_ok0 fm_r key EmptyFM = True; 12.79/5.26 right_ok0 fm_r key (Branch right_key _ _ _ _) = let { 12.79/5.26 smallest_right_key = fst (findMin fm_r); 12.79/5.26 } in key < smallest_right_key; 12.79/5.26 " 12.79/5.26 The following Case expression 12.79/5.26 "case fm_l of { 12.79/5.26 EmptyFM -> True; 12.79/5.26 Branch left_key _ _ _ _ -> let { 12.79/5.26 biggest_left_key = fst (findMax fm_l); 12.79/5.26 } in biggest_left_key < key} 12.79/5.26 " 12.79/5.26 is transformed to 12.79/5.26 "left_ok0 fm_l key EmptyFM = True; 12.79/5.26 left_ok0 fm_l key (Branch left_key _ _ _ _) = let { 12.79/5.26 biggest_left_key = fst (findMax fm_l); 12.79/5.26 } in biggest_left_key < key; 12.79/5.26 " 12.79/5.26 The following Case expression 12.79/5.26 "case fm_R of { 12.79/5.26 Branch _ _ _ fm_rl fm_rr |sizeFM fm_rl < 2 * sizeFM fm_rrsingle_L fm_L fm_R|otherwisedouble_L fm_L fm_R} 12.79/5.26 " 12.79/5.26 is transformed to 12.79/5.26 "mkBalBranch0 fm_L fm_R (Branch _ _ _ fm_rl fm_rr)|sizeFM fm_rl < 2 * sizeFM fm_rrsingle_L fm_L fm_R|otherwisedouble_L fm_L fm_R; 12.79/5.26 " 12.79/5.26 The following Case expression 12.79/5.26 "case fm_L of { 12.79/5.26 Branch _ _ _ fm_ll fm_lr |sizeFM fm_lr < 2 * sizeFM fm_llsingle_R fm_L fm_R|otherwisedouble_R fm_L fm_R} 12.79/5.26 " 12.79/5.26 is transformed to 12.79/5.26 "mkBalBranch1 fm_L fm_R (Branch _ _ _ fm_ll fm_lr)|sizeFM fm_lr < 2 * sizeFM fm_llsingle_R fm_L fm_R|otherwisedouble_R fm_L fm_R; 12.79/5.26 " 12.79/5.26 12.79/5.26 ---------------------------------------- 12.79/5.26 12.79/5.26 (2) 12.79/5.26 Obligation: 12.79/5.26 mainModule Main 12.79/5.26 module FiniteMap where { 12.79/5.26 import qualified Main; 12.79/5.26 import qualified Maybe; 12.79/5.26 import qualified Prelude; 12.79/5.26 data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b) ; 12.79/5.26 12.79/5.26 instance (Eq a, Eq b) => Eq FiniteMap a b where { 12.79/5.26 } 12.79/5.26 addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b; 12.79/5.26 addListToFM_C combiner fm key_elt_pairs = foldl add fm key_elt_pairs where { 12.79/5.26 add fmap (key,elt) = addToFM_C combiner fmap key elt; 12.79/5.26 }; 12.79/5.26 12.79/5.26 addToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> a -> b -> FiniteMap a b; 12.79/5.26 addToFM_C combiner EmptyFM key elt = unitFM key elt; 12.79/5.26 addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt | new_key < key = mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r 12.79/5.26 | new_key > key = mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) 12.79/5.26 | otherwise = Branch new_key (combiner elt new_elt) size fm_l fm_r; 12.79/5.26 12.79/5.26 emptyFM :: FiniteMap b a; 12.79/5.26 emptyFM = EmptyFM; 12.79/5.26 12.79/5.26 findMax :: FiniteMap b a -> (b,a); 12.79/5.26 findMax (Branch key elt _ _ EmptyFM) = (key,elt); 12.79/5.26 findMax (Branch key elt _ _ fm_r) = findMax fm_r; 12.79/5.26 12.79/5.26 findMin :: FiniteMap b a -> (b,a); 12.79/5.26 findMin (Branch key elt _ EmptyFM _) = (key,elt); 12.79/5.26 findMin (Branch key elt _ fm_l _) = findMin fm_l; 12.79/5.26 12.79/5.26 mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; 12.79/5.26 mkBalBranch key elt fm_L fm_R | size_l + size_r < 2 = mkBranch 1 key elt fm_L fm_R 12.79/5.26 | size_r > sIZE_RATIO * size_l = mkBalBranch0 fm_L fm_R fm_R 12.79/5.26 | size_l > sIZE_RATIO * size_r = mkBalBranch1 fm_L fm_R fm_L 12.79/5.26 | otherwise = mkBranch 2 key elt fm_L fm_R where { 12.79/5.26 double_L fm_l (Branch key_r elt_r _ (Branch key_rl elt_rl _ fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 12.79/5.26 double_R (Branch key_l elt_l _ fm_ll (Branch key_lr elt_lr _ fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r); 12.79/5.26 mkBalBranch0 fm_L fm_R (Branch _ _ _ fm_rl fm_rr) | sizeFM fm_rl < 2 * sizeFM fm_rr = single_L fm_L fm_R 12.79/5.26 | otherwise = double_L fm_L fm_R; 12.79/5.26 mkBalBranch1 fm_L fm_R (Branch _ _ _ fm_ll fm_lr) | sizeFM fm_lr < 2 * sizeFM fm_ll = single_R fm_L fm_R 12.79/5.26 | otherwise = double_R fm_L fm_R; 12.79/5.26 single_L fm_l (Branch key_r elt_r _ fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; 12.79/5.26 single_R (Branch key_l elt_l _ fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); 12.79/5.26 size_l = sizeFM fm_L; 12.79/5.26 size_r = sizeFM fm_R; 12.79/5.26 }; 12.79/5.26 12.79/5.26 mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; 13.11/5.32 mkBranch which key elt fm_l fm_r = let { 13.11/5.32 result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; 13.11/5.32 } in result where { 13.11/5.32 balance_ok = True; 13.11/5.32 left_ok = left_ok0 fm_l key fm_l; 13.11/5.32 left_ok0 fm_l key EmptyFM = True; 13.11/5.32 left_ok0 fm_l key (Branch left_key _ _ _ _) = let { 13.11/5.32 biggest_left_key = fst (findMax fm_l); 13.11/5.32 } in biggest_left_key < key; 13.11/5.32 left_size = sizeFM fm_l; 13.11/5.32 right_ok = right_ok0 fm_r key fm_r; 13.11/5.32 right_ok0 fm_r key EmptyFM = True; 13.11/5.32 right_ok0 fm_r key (Branch right_key _ _ _ _) = let { 13.11/5.32 smallest_right_key = fst (findMin fm_r); 13.11/5.32 } in key < smallest_right_key; 13.11/5.32 right_size = sizeFM fm_r; 13.11/5.32 unbox :: Int -> Int; 13.11/5.32 unbox x = x; 13.11/5.32 }; 13.11/5.32 13.11/5.32 sIZE_RATIO :: Int; 13.11/5.32 sIZE_RATIO = 5; 13.11/5.32 13.11/5.32 sizeFM :: FiniteMap a b -> Int; 13.11/5.32 sizeFM EmptyFM = 0; 13.11/5.32 sizeFM (Branch _ _ size _ _) = size; 13.11/5.32 13.11/5.32 unitFM :: b -> a -> FiniteMap b a; 13.11/5.32 unitFM key elt = Branch key elt 1 emptyFM emptyFM; 13.11/5.32 13.11/5.32 } 13.11/5.32 module Maybe where { 13.11/5.32 import qualified FiniteMap; 13.11/5.32 import qualified Main; 13.11/5.32 import qualified Prelude; 13.11/5.32 } 13.11/5.32 module Main where { 13.11/5.32 import qualified FiniteMap; 13.11/5.32 import qualified Maybe; 13.11/5.32 import qualified Prelude; 13.11/5.32 } 13.11/5.32 13.11/5.32 ---------------------------------------- 13.11/5.32 13.11/5.32 (3) BR (EQUIVALENT) 13.11/5.32 Replaced joker patterns by fresh variables and removed binding patterns. 13.11/5.32 ---------------------------------------- 13.11/5.32 13.11/5.32 (4) 13.11/5.32 Obligation: 13.11/5.32 mainModule Main 13.11/5.32 module FiniteMap where { 13.11/5.32 import qualified Main; 13.11/5.32 import qualified Maybe; 13.11/5.32 import qualified Prelude; 13.11/5.32 data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b) ; 13.11/5.32 13.11/5.32 instance (Eq a, Eq b) => Eq FiniteMap b a where { 13.11/5.32 } 13.11/5.32 addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b; 13.11/5.32 addListToFM_C combiner fm key_elt_pairs = foldl add fm key_elt_pairs where { 13.11/5.32 add fmap (key,elt) = addToFM_C combiner fmap key elt; 13.11/5.32 }; 13.11/5.32 13.11/5.32 addToFM_C :: Ord b => (a -> a -> a) -> FiniteMap b a -> b -> a -> FiniteMap b a; 13.11/5.32 addToFM_C combiner EmptyFM key elt = unitFM key elt; 13.11/5.32 addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt | new_key < key = mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r 13.11/5.32 | new_key > key = mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) 13.11/5.32 | otherwise = Branch new_key (combiner elt new_elt) size fm_l fm_r; 13.11/5.32 13.11/5.32 emptyFM :: FiniteMap a b; 13.11/5.32 emptyFM = EmptyFM; 13.11/5.32 13.11/5.32 findMax :: FiniteMap b a -> (b,a); 13.11/5.32 findMax (Branch key elt yx yy EmptyFM) = (key,elt); 13.11/5.32 findMax (Branch key elt yz zu fm_r) = findMax fm_r; 13.11/5.32 13.11/5.32 findMin :: FiniteMap a b -> (a,b); 13.11/5.32 findMin (Branch key elt wx EmptyFM wy) = (key,elt); 13.11/5.32 findMin (Branch key elt wz fm_l xu) = findMin fm_l; 13.11/5.32 13.11/5.32 mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; 13.11/5.32 mkBalBranch key elt fm_L fm_R | size_l + size_r < 2 = mkBranch 1 key elt fm_L fm_R 13.11/5.32 | size_r > sIZE_RATIO * size_l = mkBalBranch0 fm_L fm_R fm_R 13.11/5.32 | size_l > sIZE_RATIO * size_r = mkBalBranch1 fm_L fm_R fm_L 13.11/5.32 | otherwise = mkBranch 2 key elt fm_L fm_R where { 13.11/5.32 double_L fm_l (Branch key_r elt_r vuv (Branch key_rl elt_rl vuw fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 13.11/5.32 double_R (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r); 13.11/5.32 mkBalBranch0 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) | sizeFM fm_rl < 2 * sizeFM fm_rr = single_L fm_L fm_R 13.11/5.32 | otherwise = double_L fm_L fm_R; 13.11/5.32 mkBalBranch1 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) | sizeFM fm_lr < 2 * sizeFM fm_ll = single_R fm_L fm_R 13.11/5.32 | otherwise = double_R fm_L fm_R; 13.11/5.32 single_L fm_l (Branch key_r elt_r vvu fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; 13.11/5.32 single_R (Branch key_l elt_l zv fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); 13.11/5.32 size_l = sizeFM fm_L; 13.11/5.32 size_r = sizeFM fm_R; 13.11/5.32 }; 13.11/5.32 13.11/5.32 mkBranch :: Ord b => Int -> b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; 13.11/5.32 mkBranch which key elt fm_l fm_r = let { 13.11/5.32 result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; 13.11/5.32 } in result where { 13.11/5.32 balance_ok = True; 13.11/5.32 left_ok = left_ok0 fm_l key fm_l; 13.11/5.32 left_ok0 fm_l key EmptyFM = True; 13.11/5.32 left_ok0 fm_l key (Branch left_key xv xw xx xy) = let { 13.11/5.32 biggest_left_key = fst (findMax fm_l); 13.11/5.32 } in biggest_left_key < key; 13.11/5.32 left_size = sizeFM fm_l; 13.11/5.32 right_ok = right_ok0 fm_r key fm_r; 13.11/5.32 right_ok0 fm_r key EmptyFM = True; 13.11/5.32 right_ok0 fm_r key (Branch right_key xz yu yv yw) = let { 13.11/5.32 smallest_right_key = fst (findMin fm_r); 13.11/5.32 } in key < smallest_right_key; 13.11/5.32 right_size = sizeFM fm_r; 13.11/5.32 unbox :: Int -> Int; 13.11/5.32 unbox x = x; 13.11/5.32 }; 13.11/5.32 13.11/5.32 sIZE_RATIO :: Int; 13.11/5.32 sIZE_RATIO = 5; 13.11/5.32 13.11/5.32 sizeFM :: FiniteMap b a -> Int; 13.11/5.32 sizeFM EmptyFM = 0; 13.11/5.32 sizeFM (Branch vz wu size wv ww) = size; 13.11/5.32 13.11/5.32 unitFM :: a -> b -> FiniteMap a b; 13.11/5.32 unitFM key elt = Branch key elt 1 emptyFM emptyFM; 13.11/5.32 13.11/5.32 } 13.11/5.32 module Maybe where { 13.11/5.32 import qualified FiniteMap; 13.11/5.32 import qualified Main; 13.11/5.32 import qualified Prelude; 13.11/5.32 } 13.11/5.32 module Main where { 13.11/5.32 import qualified FiniteMap; 13.11/5.32 import qualified Maybe; 13.11/5.32 import qualified Prelude; 13.11/5.32 } 13.11/5.32 13.11/5.32 ---------------------------------------- 13.11/5.32 13.11/5.32 (5) COR (EQUIVALENT) 13.11/5.32 Cond Reductions: 13.11/5.32 The following Function with conditions 13.11/5.32 "undefined |Falseundefined; 13.11/5.33 " 13.11/5.33 is transformed to 13.11/5.33 "undefined = undefined1; 13.11/5.33 " 13.11/5.33 "undefined0 True = undefined; 13.11/5.33 " 13.11/5.33 "undefined1 = undefined0 False; 13.11/5.33 " 13.11/5.33 The following Function with conditions 13.11/5.33 "addToFM_C combiner EmptyFM key elt = unitFM key elt; 13.11/5.33 addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt|new_key < keymkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r|new_key > keymkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt)|otherwiseBranch new_key (combiner elt new_elt) size fm_l fm_r; 13.11/5.33 " 13.11/5.33 is transformed to 13.11/5.33 "addToFM_C combiner EmptyFM key elt = addToFM_C4 combiner EmptyFM key elt; 13.11/5.33 addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt = addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt; 13.11/5.33 " 13.11/5.33 "addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt True = Branch new_key (combiner elt new_elt) size fm_l fm_r; 13.11/5.33 " 13.11/5.33 "addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt True = mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt); 13.11/5.33 addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt False = addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt otherwise; 13.11/5.33 " 13.11/5.33 "addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt True = mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r; 13.11/5.33 addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt False = addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt (new_key > key); 13.11/5.33 " 13.11/5.33 "addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt = addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt (new_key < key); 13.11/5.33 " 13.11/5.33 "addToFM_C4 combiner EmptyFM key elt = unitFM key elt; 13.11/5.33 addToFM_C4 vvx vvy vvz vwu = addToFM_C3 vvx vvy vvz vwu; 13.11/5.33 " 13.11/5.33 The following Function with conditions 13.11/5.33 "mkBalBranch1 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr)|sizeFM fm_lr < 2 * sizeFM fm_llsingle_R fm_L fm_R|otherwisedouble_R fm_L fm_R; 13.11/5.33 " 13.11/5.33 is transformed to 13.11/5.33 "mkBalBranch1 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch12 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr); 13.11/5.33 " 13.11/5.33 "mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr True = single_R fm_L fm_R; 13.11/5.33 mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr False = mkBalBranch10 fm_L fm_R zy zz vuu fm_ll fm_lr otherwise; 13.11/5.33 " 13.11/5.33 "mkBalBranch10 fm_L fm_R zy zz vuu fm_ll fm_lr True = double_R fm_L fm_R; 13.11/5.33 " 13.11/5.33 "mkBalBranch12 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); 13.11/5.33 " 13.11/5.33 The following Function with conditions 13.11/5.33 "mkBalBranch0 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr)|sizeFM fm_rl < 2 * sizeFM fm_rrsingle_L fm_L fm_R|otherwisedouble_L fm_L fm_R; 13.11/5.33 " 13.11/5.33 is transformed to 13.11/5.33 "mkBalBranch0 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch02 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr); 13.11/5.33 " 13.11/5.33 "mkBalBranch00 fm_L fm_R vux vuy vuz fm_rl fm_rr True = double_L fm_L fm_R; 13.11/5.33 " 13.11/5.33 "mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr True = single_L fm_L fm_R; 13.11/5.33 mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr False = mkBalBranch00 fm_L fm_R vux vuy vuz fm_rl fm_rr otherwise; 13.11/5.33 " 13.11/5.33 "mkBalBranch02 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); 13.11/5.33 " 13.11/5.33 The following Function with conditions 13.11/5.33 "mkBalBranch key elt fm_L fm_R|size_l + size_r < 2mkBranch 1 key elt fm_L fm_R|size_r > sIZE_RATIO * size_lmkBalBranch0 fm_L fm_R fm_R|size_l > sIZE_RATIO * size_rmkBalBranch1 fm_L fm_R fm_L|otherwisemkBranch 2 key elt fm_L fm_R where { 13.11/5.33 double_L fm_l (Branch key_r elt_r vuv (Branch key_rl elt_rl vuw fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 13.11/5.33 ; 13.11/5.33 double_R (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r); 13.11/5.33 ; 13.11/5.33 mkBalBranch0 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr)|sizeFM fm_rl < 2 * sizeFM fm_rrsingle_L fm_L fm_R|otherwisedouble_L fm_L fm_R; 13.11/5.33 ; 13.11/5.33 mkBalBranch1 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr)|sizeFM fm_lr < 2 * sizeFM fm_llsingle_R fm_L fm_R|otherwisedouble_R fm_L fm_R; 13.11/5.33 ; 13.11/5.33 single_L fm_l (Branch key_r elt_r vvu fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; 13.11/5.33 ; 13.11/5.33 single_R (Branch key_l elt_l zv fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); 13.11/5.33 ; 13.11/5.33 size_l = sizeFM fm_L; 13.11/5.33 ; 13.11/5.33 size_r = sizeFM fm_R; 13.11/5.33 } 13.11/5.33 ; 13.11/5.33 " 13.11/5.33 is transformed to 13.11/5.33 "mkBalBranch key elt fm_L fm_R = mkBalBranch6 key elt fm_L fm_R; 13.11/5.33 " 13.11/5.33 "mkBalBranch6 key elt fm_L fm_R = mkBalBranch5 key elt fm_L fm_R (size_l + size_r < 2) where { 13.11/5.33 double_L fm_l (Branch key_r elt_r vuv (Branch key_rl elt_rl vuw fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 13.11/5.33 ; 13.11/5.33 double_R (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r); 13.11/5.33 ; 13.11/5.33 mkBalBranch0 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch02 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr); 13.11/5.33 ; 13.11/5.33 mkBalBranch00 fm_L fm_R vux vuy vuz fm_rl fm_rr True = double_L fm_L fm_R; 13.11/5.33 ; 13.11/5.33 mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr True = single_L fm_L fm_R; 13.11/5.33 mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr False = mkBalBranch00 fm_L fm_R vux vuy vuz fm_rl fm_rr otherwise; 13.11/5.33 ; 13.11/5.33 mkBalBranch02 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); 13.11/5.33 ; 13.11/5.33 mkBalBranch1 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch12 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr); 13.11/5.33 ; 13.11/5.33 mkBalBranch10 fm_L fm_R zy zz vuu fm_ll fm_lr True = double_R fm_L fm_R; 13.11/5.33 ; 13.11/5.33 mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr True = single_R fm_L fm_R; 13.11/5.33 mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr False = mkBalBranch10 fm_L fm_R zy zz vuu fm_ll fm_lr otherwise; 13.11/5.33 ; 13.11/5.33 mkBalBranch12 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); 13.11/5.33 ; 13.11/5.33 mkBalBranch2 key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; 13.11/5.33 ; 13.11/5.33 mkBalBranch3 key elt fm_L fm_R True = mkBalBranch1 fm_L fm_R fm_L; 13.11/5.33 mkBalBranch3 key elt fm_L fm_R False = mkBalBranch2 key elt fm_L fm_R otherwise; 13.11/5.33 ; 13.11/5.33 mkBalBranch4 key elt fm_L fm_R True = mkBalBranch0 fm_L fm_R fm_R; 13.11/5.33 mkBalBranch4 key elt fm_L fm_R False = mkBalBranch3 key elt fm_L fm_R (size_l > sIZE_RATIO * size_r); 13.11/5.33 ; 13.11/5.33 mkBalBranch5 key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; 13.11/5.33 mkBalBranch5 key elt fm_L fm_R False = mkBalBranch4 key elt fm_L fm_R (size_r > sIZE_RATIO * size_l); 13.11/5.33 ; 13.11/5.33 single_L fm_l (Branch key_r elt_r vvu fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; 13.11/5.33 ; 13.11/5.33 single_R (Branch key_l elt_l zv fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); 13.11/5.33 ; 13.11/5.33 size_l = sizeFM fm_L; 13.11/5.33 ; 13.11/5.33 size_r = sizeFM fm_R; 13.11/5.33 } 13.11/5.33 ; 13.11/5.33 " 13.11/5.33 13.11/5.33 ---------------------------------------- 13.11/5.33 13.11/5.33 (6) 13.11/5.33 Obligation: 13.11/5.33 mainModule Main 13.11/5.33 module FiniteMap where { 13.11/5.33 import qualified Main; 13.11/5.33 import qualified Maybe; 13.11/5.33 import qualified Prelude; 13.11/5.33 data FiniteMap b a = EmptyFM | Branch b a Int (FiniteMap b a) (FiniteMap b a) ; 13.11/5.33 13.11/5.33 instance (Eq a, Eq b) => Eq FiniteMap a b where { 13.11/5.33 } 13.11/5.33 addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b; 13.11/5.33 addListToFM_C combiner fm key_elt_pairs = foldl add fm key_elt_pairs where { 13.11/5.33 add fmap (key,elt) = addToFM_C combiner fmap key elt; 13.11/5.33 }; 13.11/5.33 13.11/5.33 addToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> a -> b -> FiniteMap a b; 13.11/5.33 addToFM_C combiner EmptyFM key elt = addToFM_C4 combiner EmptyFM key elt; 13.11/5.33 addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt = addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt; 13.11/5.33 13.11/5.33 addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt True = Branch new_key (combiner elt new_elt) size fm_l fm_r; 13.11/5.33 13.11/5.33 addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt True = mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt); 13.11/5.33 addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt False = addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt otherwise; 13.11/5.33 13.11/5.33 addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt True = mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r; 13.11/5.33 addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt False = addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt (new_key > key); 13.11/5.33 13.11/5.33 addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt = addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt (new_key < key); 13.11/5.33 13.11/5.33 addToFM_C4 combiner EmptyFM key elt = unitFM key elt; 13.11/5.33 addToFM_C4 vvx vvy vvz vwu = addToFM_C3 vvx vvy vvz vwu; 13.11/5.33 13.11/5.33 emptyFM :: FiniteMap a b; 13.11/5.33 emptyFM = EmptyFM; 13.11/5.33 13.11/5.33 findMax :: FiniteMap a b -> (a,b); 13.11/5.33 findMax (Branch key elt yx yy EmptyFM) = (key,elt); 13.11/5.33 findMax (Branch key elt yz zu fm_r) = findMax fm_r; 13.11/5.33 13.11/5.33 findMin :: FiniteMap b a -> (b,a); 13.11/5.33 findMin (Branch key elt wx EmptyFM wy) = (key,elt); 13.11/5.33 findMin (Branch key elt wz fm_l xu) = findMin fm_l; 13.11/5.33 13.11/5.33 mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; 13.11/5.33 mkBalBranch key elt fm_L fm_R = mkBalBranch6 key elt fm_L fm_R; 13.11/5.33 13.11/5.33 mkBalBranch6 key elt fm_L fm_R = mkBalBranch5 key elt fm_L fm_R (size_l + size_r < 2) where { 13.11/5.33 double_L fm_l (Branch key_r elt_r vuv (Branch key_rl elt_rl vuw fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 13.11/5.33 double_R (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r); 13.11/5.33 mkBalBranch0 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch02 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr); 13.11/5.33 mkBalBranch00 fm_L fm_R vux vuy vuz fm_rl fm_rr True = double_L fm_L fm_R; 13.11/5.33 mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr True = single_L fm_L fm_R; 13.11/5.33 mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr False = mkBalBranch00 fm_L fm_R vux vuy vuz fm_rl fm_rr otherwise; 13.11/5.33 mkBalBranch02 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); 13.11/5.33 mkBalBranch1 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch12 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr); 13.11/5.33 mkBalBranch10 fm_L fm_R zy zz vuu fm_ll fm_lr True = double_R fm_L fm_R; 13.11/5.33 mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr True = single_R fm_L fm_R; 13.11/5.33 mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr False = mkBalBranch10 fm_L fm_R zy zz vuu fm_ll fm_lr otherwise; 13.11/5.33 mkBalBranch12 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); 13.11/5.33 mkBalBranch2 key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; 13.11/5.33 mkBalBranch3 key elt fm_L fm_R True = mkBalBranch1 fm_L fm_R fm_L; 13.11/5.33 mkBalBranch3 key elt fm_L fm_R False = mkBalBranch2 key elt fm_L fm_R otherwise; 13.11/5.33 mkBalBranch4 key elt fm_L fm_R True = mkBalBranch0 fm_L fm_R fm_R; 13.11/5.33 mkBalBranch4 key elt fm_L fm_R False = mkBalBranch3 key elt fm_L fm_R (size_l > sIZE_RATIO * size_r); 13.11/5.33 mkBalBranch5 key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; 13.11/5.33 mkBalBranch5 key elt fm_L fm_R False = mkBalBranch4 key elt fm_L fm_R (size_r > sIZE_RATIO * size_l); 13.11/5.33 single_L fm_l (Branch key_r elt_r vvu fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; 13.11/5.33 single_R (Branch key_l elt_l zv fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); 13.41/5.41 size_l = sizeFM fm_L; 13.41/5.41 size_r = sizeFM fm_R; 13.41/5.41 }; 13.41/5.41 13.41/5.41 mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; 13.41/5.41 mkBranch which key elt fm_l fm_r = let { 13.41/5.41 result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; 13.41/5.41 } in result where { 13.41/5.41 balance_ok = True; 13.41/5.41 left_ok = left_ok0 fm_l key fm_l; 13.41/5.41 left_ok0 fm_l key EmptyFM = True; 13.41/5.41 left_ok0 fm_l key (Branch left_key xv xw xx xy) = let { 13.41/5.41 biggest_left_key = fst (findMax fm_l); 13.41/5.41 } in biggest_left_key < key; 13.41/5.41 left_size = sizeFM fm_l; 13.41/5.41 right_ok = right_ok0 fm_r key fm_r; 13.41/5.41 right_ok0 fm_r key EmptyFM = True; 13.41/5.41 right_ok0 fm_r key (Branch right_key xz yu yv yw) = let { 13.41/5.41 smallest_right_key = fst (findMin fm_r); 13.41/5.41 } in key < smallest_right_key; 13.41/5.41 right_size = sizeFM fm_r; 13.41/5.41 unbox :: Int -> Int; 13.41/5.41 unbox x = x; 13.41/5.41 }; 13.41/5.41 13.41/5.41 sIZE_RATIO :: Int; 13.41/5.41 sIZE_RATIO = 5; 13.41/5.41 13.41/5.41 sizeFM :: FiniteMap b a -> Int; 13.41/5.41 sizeFM EmptyFM = 0; 13.41/5.41 sizeFM (Branch vz wu size wv ww) = size; 13.41/5.41 13.41/5.41 unitFM :: a -> b -> FiniteMap a b; 13.41/5.41 unitFM key elt = Branch key elt 1 emptyFM emptyFM; 13.41/5.41 13.41/5.41 } 13.41/5.41 module Maybe where { 13.41/5.41 import qualified FiniteMap; 13.41/5.41 import qualified Main; 13.41/5.41 import qualified Prelude; 13.41/5.41 } 13.41/5.41 module Main where { 13.41/5.41 import qualified FiniteMap; 13.41/5.41 import qualified Maybe; 13.41/5.41 import qualified Prelude; 13.41/5.41 } 13.41/5.41 13.41/5.41 ---------------------------------------- 13.41/5.41 13.41/5.41 (7) LetRed (EQUIVALENT) 13.41/5.41 Let/Where Reductions: 13.41/5.41 The bindings of the following Let/Where expression 13.41/5.41 "mkBalBranch5 key elt fm_L fm_R (size_l + size_r < 2) where { 13.41/5.41 double_L fm_l (Branch key_r elt_r vuv (Branch key_rl elt_rl vuw fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 13.41/5.41 ; 13.41/5.41 double_R (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r); 13.41/5.41 ; 13.41/5.41 mkBalBranch0 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch02 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr); 13.41/5.41 ; 13.41/5.41 mkBalBranch00 fm_L fm_R vux vuy vuz fm_rl fm_rr True = double_L fm_L fm_R; 13.41/5.41 ; 13.41/5.41 mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr True = single_L fm_L fm_R; 13.41/5.41 mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr False = mkBalBranch00 fm_L fm_R vux vuy vuz fm_rl fm_rr otherwise; 13.41/5.41 ; 13.41/5.41 mkBalBranch02 fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch01 fm_L fm_R vux vuy vuz fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); 13.41/5.41 ; 13.41/5.41 mkBalBranch1 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch12 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr); 13.41/5.41 ; 13.41/5.41 mkBalBranch10 fm_L fm_R zy zz vuu fm_ll fm_lr True = double_R fm_L fm_R; 13.41/5.41 ; 13.41/5.41 mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr True = single_R fm_L fm_R; 13.41/5.41 mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr False = mkBalBranch10 fm_L fm_R zy zz vuu fm_ll fm_lr otherwise; 13.41/5.41 ; 13.41/5.41 mkBalBranch12 fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch11 fm_L fm_R zy zz vuu fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); 13.41/5.41 ; 13.41/5.41 mkBalBranch2 key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; 13.41/5.41 ; 13.41/5.41 mkBalBranch3 key elt fm_L fm_R True = mkBalBranch1 fm_L fm_R fm_L; 13.41/5.41 mkBalBranch3 key elt fm_L fm_R False = mkBalBranch2 key elt fm_L fm_R otherwise; 13.41/5.41 ; 13.41/5.41 mkBalBranch4 key elt fm_L fm_R True = mkBalBranch0 fm_L fm_R fm_R; 13.41/5.41 mkBalBranch4 key elt fm_L fm_R False = mkBalBranch3 key elt fm_L fm_R (size_l > sIZE_RATIO * size_r); 13.41/5.41 ; 13.41/5.41 mkBalBranch5 key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; 13.41/5.41 mkBalBranch5 key elt fm_L fm_R False = mkBalBranch4 key elt fm_L fm_R (size_r > sIZE_RATIO * size_l); 13.41/5.41 ; 13.41/5.41 single_L fm_l (Branch key_r elt_r vvu fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; 13.41/5.41 ; 13.41/5.41 single_R (Branch key_l elt_l zv fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); 13.41/5.41 ; 13.41/5.41 size_l = sizeFM fm_L; 13.41/5.41 ; 13.41/5.41 size_r = sizeFM fm_R; 13.41/5.41 } 13.41/5.41 " 13.41/5.41 are unpacked to the following functions on top level 13.41/5.41 "mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R True = mkBalBranch6MkBalBranch1 vwx vwy vwz vxu fm_L fm_R fm_L; 13.41/5.41 mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch2 vwx vwy vwz vxu key elt fm_L fm_R otherwise; 13.41/5.41 " 13.41/5.41 "mkBalBranch6Single_R vwx vwy vwz vxu (Branch key_l elt_l zv fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 vwx vwy fm_lr fm_r); 13.41/5.41 " 13.41/5.41 "mkBalBranch6Double_L vwx vwy vwz vxu fm_l (Branch key_r elt_r vuv (Branch key_rl elt_rl vuw fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 vwx vwy fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 13.41/5.41 " 13.41/5.41 "mkBalBranch6Double_R vwx vwy vwz vxu (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 vwx vwy fm_lrr fm_r); 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch12 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R True = mkBalBranch6MkBalBranch0 vwx vwy vwz vxu fm_L fm_R fm_R; 13.41/5.41 mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R (mkBalBranch6Size_l vwx vwy vwz vxu > sIZE_RATIO * mkBalBranch6Size_r vwx vwy vwz vxu); 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch0 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch6MkBalBranch02 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr); 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr True = mkBalBranch6Single_L vwx vwy vwz vxu fm_L fm_R; 13.41/5.41 mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr False = mkBalBranch6MkBalBranch00 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr otherwise; 13.41/5.41 " 13.41/5.41 "mkBalBranch6Single_L vwx vwy vwz vxu fm_l (Branch key_r elt_r vvu fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 vwx vwy fm_l fm_rl) fm_rr; 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch00 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr True = mkBalBranch6Double_L vwx vwy vwz vxu fm_L fm_R; 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch10 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr True = mkBalBranch6Double_R vwx vwy vwz vxu fm_L fm_R; 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch5 vwx vwy vwz vxu key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; 13.41/5.41 mkBalBranch6MkBalBranch5 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R (mkBalBranch6Size_r vwx vwy vwz vxu > sIZE_RATIO * mkBalBranch6Size_l vwx vwy vwz vxu); 13.41/5.41 " 13.41/5.41 "mkBalBranch6Size_r vwx vwy vwz vxu = sizeFM vwz; 13.41/5.41 " 13.41/5.41 "mkBalBranch6Size_l vwx vwy vwz vxu = sizeFM vxu; 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch2 vwx vwy vwz vxu key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch1 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch6MkBalBranch12 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr); 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch02 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); 13.41/5.41 " 13.41/5.41 "mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr True = mkBalBranch6Single_R vwx vwy vwz vxu fm_L fm_R; 13.41/5.41 mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr False = mkBalBranch6MkBalBranch10 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr otherwise; 13.41/5.41 " 13.41/5.41 The bindings of the following Let/Where expression 13.41/5.41 "foldl add fm key_elt_pairs where { 13.41/5.41 add fmap (key,elt) = addToFM_C combiner fmap key elt; 13.41/5.41 } 13.41/5.41 " 13.41/5.41 are unpacked to the following functions on top level 13.41/5.41 "addListToFM_CAdd vxv fmap (key,elt) = addToFM_C vxv fmap key elt; 13.41/5.41 " 13.41/5.41 The bindings of the following Let/Where expression 13.41/5.41 "let { 13.41/5.41 result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; 13.41/5.41 } in result where { 13.41/5.41 balance_ok = True; 13.41/5.41 ; 13.41/5.41 left_ok = left_ok0 fm_l key fm_l; 13.41/5.41 ; 13.41/5.41 left_ok0 fm_l key EmptyFM = True; 13.41/5.41 left_ok0 fm_l key (Branch left_key xv xw xx xy) = let { 13.41/5.41 biggest_left_key = fst (findMax fm_l); 13.41/5.41 } in biggest_left_key < key; 13.41/5.41 ; 13.41/5.41 left_size = sizeFM fm_l; 13.41/5.41 ; 13.41/5.41 right_ok = right_ok0 fm_r key fm_r; 13.41/5.41 ; 13.41/5.41 right_ok0 fm_r key EmptyFM = True; 13.41/5.41 right_ok0 fm_r key (Branch right_key xz yu yv yw) = let { 13.41/5.41 smallest_right_key = fst (findMin fm_r); 13.41/5.41 } in key < smallest_right_key; 13.41/5.41 ; 13.41/5.41 right_size = sizeFM fm_r; 13.41/5.41 ; 13.41/5.41 unbox x = x; 13.41/5.41 } 13.41/5.41 " 13.41/5.41 are unpacked to the following functions on top level 13.41/5.46 "mkBranchUnbox vxw vxx vxy x = x; 13.41/5.46 " 13.41/5.46 "mkBranchRight_size vxw vxx vxy = sizeFM vxw; 13.41/5.46 " 13.41/5.46 "mkBranchBalance_ok vxw vxx vxy = True; 13.41/5.46 " 13.41/5.46 "mkBranchLeft_size vxw vxx vxy = sizeFM vxx; 13.41/5.46 " 13.41/5.46 "mkBranchRight_ok vxw vxx vxy = mkBranchRight_ok0 vxw vxx vxy vxw vxy vxw; 13.41/5.46 " 13.41/5.46 "mkBranchRight_ok0 vxw vxx vxy fm_r key EmptyFM = True; 13.41/5.46 mkBranchRight_ok0 vxw vxx vxy fm_r key (Branch right_key xz yu yv yw) = key < mkBranchRight_ok0Smallest_right_key fm_r; 13.41/5.46 " 13.41/5.46 "mkBranchLeft_ok vxw vxx vxy = mkBranchLeft_ok0 vxw vxx vxy vxx vxy vxx; 13.41/5.46 " 13.41/5.46 "mkBranchLeft_ok0 vxw vxx vxy fm_l key EmptyFM = True; 13.41/5.46 mkBranchLeft_ok0 vxw vxx vxy fm_l key (Branch left_key xv xw xx xy) = mkBranchLeft_ok0Biggest_left_key fm_l < key; 13.41/5.46 " 13.41/5.46 The bindings of the following Let/Where expression 13.41/5.46 "let { 13.41/5.46 result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; 13.41/5.46 } in result" 13.41/5.46 are unpacked to the following functions on top level 13.41/5.46 "mkBranchResult vxz vyu vyv vyw = Branch vxz vyu (mkBranchUnbox vyv vyw vxz (1 + mkBranchLeft_size vyv vyw vxz + mkBranchRight_size vyv vyw vxz)) vyw vyv; 13.41/5.46 " 13.41/5.46 The bindings of the following Let/Where expression 13.41/5.46 "let { 13.41/5.46 smallest_right_key = fst (findMin fm_r); 13.41/5.46 } in key < smallest_right_key" 13.41/5.46 are unpacked to the following functions on top level 13.41/5.46 "mkBranchRight_ok0Smallest_right_key vyx = fst (findMin vyx); 13.41/5.46 " 13.41/5.46 The bindings of the following Let/Where expression 13.41/5.46 "let { 13.41/5.46 biggest_left_key = fst (findMax fm_l); 13.41/5.46 } in biggest_left_key < key" 13.41/5.46 are unpacked to the following functions on top level 13.41/5.46 "mkBranchLeft_ok0Biggest_left_key vyy = fst (findMax vyy); 13.41/5.46 " 13.41/5.46 13.41/5.46 ---------------------------------------- 13.41/5.46 13.41/5.46 (8) 13.41/5.46 Obligation: 13.41/5.46 mainModule Main 13.41/5.46 module FiniteMap where { 13.41/5.46 import qualified Main; 13.41/5.46 import qualified Maybe; 13.41/5.46 import qualified Prelude; 13.41/5.46 data FiniteMap b a = EmptyFM | Branch b a Int (FiniteMap b a) (FiniteMap b a) ; 13.41/5.46 13.41/5.46 instance (Eq a, Eq b) => Eq FiniteMap b a where { 13.41/5.46 } 13.41/5.46 addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b; 13.41/5.46 addListToFM_C combiner fm key_elt_pairs = foldl (addListToFM_CAdd combiner) fm key_elt_pairs; 13.41/5.46 13.41/5.46 addListToFM_CAdd vxv fmap (key,elt) = addToFM_C vxv fmap key elt; 13.41/5.46 13.41/5.46 addToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> a -> b -> FiniteMap a b; 13.41/5.46 addToFM_C combiner EmptyFM key elt = addToFM_C4 combiner EmptyFM key elt; 13.41/5.46 addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt = addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt; 13.41/5.46 13.41/5.46 addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt True = Branch new_key (combiner elt new_elt) size fm_l fm_r; 13.41/5.46 13.41/5.46 addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt True = mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt); 13.41/5.46 addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt False = addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt otherwise; 13.41/5.46 13.41/5.46 addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt True = mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r; 13.41/5.46 addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt False = addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt (new_key > key); 13.41/5.46 13.41/5.46 addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt = addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt (new_key < key); 13.41/5.46 13.41/5.46 addToFM_C4 combiner EmptyFM key elt = unitFM key elt; 13.41/5.46 addToFM_C4 vvx vvy vvz vwu = addToFM_C3 vvx vvy vvz vwu; 13.41/5.46 13.41/5.46 emptyFM :: FiniteMap b a; 13.41/5.46 emptyFM = EmptyFM; 13.41/5.46 13.41/5.46 findMax :: FiniteMap a b -> (a,b); 13.41/5.46 findMax (Branch key elt yx yy EmptyFM) = (key,elt); 13.41/5.46 findMax (Branch key elt yz zu fm_r) = findMax fm_r; 13.41/5.46 13.41/5.46 findMin :: FiniteMap b a -> (b,a); 13.41/5.46 findMin (Branch key elt wx EmptyFM wy) = (key,elt); 13.41/5.46 findMin (Branch key elt wz fm_l xu) = findMin fm_l; 13.41/5.46 13.41/5.46 mkBalBranch :: Ord b => b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; 13.41/5.46 mkBalBranch key elt fm_L fm_R = mkBalBranch6 key elt fm_L fm_R; 13.41/5.46 13.41/5.46 mkBalBranch6 key elt fm_L fm_R = mkBalBranch6MkBalBranch5 key elt fm_R fm_L key elt fm_L fm_R (mkBalBranch6Size_l key elt fm_R fm_L + mkBalBranch6Size_r key elt fm_R fm_L < 2); 13.41/5.46 13.41/5.46 mkBalBranch6Double_L vwx vwy vwz vxu fm_l (Branch key_r elt_r vuv (Branch key_rl elt_rl vuw fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 vwx vwy fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); 13.41/5.46 13.41/5.46 mkBalBranch6Double_R vwx vwy vwz vxu (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 vwx vwy fm_lrr fm_r); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch0 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch6MkBalBranch02 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch00 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr True = mkBalBranch6Double_L vwx vwy vwz vxu fm_L fm_R; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr True = mkBalBranch6Single_L vwx vwy vwz vxu fm_L fm_R; 13.41/5.46 mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr False = mkBalBranch6MkBalBranch00 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr otherwise; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch02 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch1 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch6MkBalBranch12 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch10 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr True = mkBalBranch6Double_R vwx vwy vwz vxu fm_L fm_R; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr True = mkBalBranch6Single_R vwx vwy vwz vxu fm_L fm_R; 13.41/5.46 mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr False = mkBalBranch6MkBalBranch10 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr otherwise; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch12 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch2 vwx vwy vwz vxu key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R True = mkBalBranch6MkBalBranch1 vwx vwy vwz vxu fm_L fm_R fm_L; 13.41/5.46 mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch2 vwx vwy vwz vxu key elt fm_L fm_R otherwise; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R True = mkBalBranch6MkBalBranch0 vwx vwy vwz vxu fm_L fm_R fm_R; 13.41/5.46 mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R (mkBalBranch6Size_l vwx vwy vwz vxu > sIZE_RATIO * mkBalBranch6Size_r vwx vwy vwz vxu); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch5 vwx vwy vwz vxu key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; 13.41/5.46 mkBalBranch6MkBalBranch5 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R (mkBalBranch6Size_r vwx vwy vwz vxu > sIZE_RATIO * mkBalBranch6Size_l vwx vwy vwz vxu); 13.41/5.46 13.41/5.46 mkBalBranch6Single_L vwx vwy vwz vxu fm_l (Branch key_r elt_r vvu fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 vwx vwy fm_l fm_rl) fm_rr; 13.41/5.46 13.41/5.46 mkBalBranch6Single_R vwx vwy vwz vxu (Branch key_l elt_l zv fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 vwx vwy fm_lr fm_r); 13.41/5.46 13.41/5.46 mkBalBranch6Size_l vwx vwy vwz vxu = sizeFM vxu; 13.41/5.46 13.41/5.46 mkBalBranch6Size_r vwx vwy vwz vxu = sizeFM vwz; 13.41/5.46 13.41/5.46 mkBranch :: Ord b => Int -> b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; 13.41/5.46 mkBranch which key elt fm_l fm_r = mkBranchResult key elt fm_r fm_l; 13.41/5.46 13.41/5.46 mkBranchBalance_ok vxw vxx vxy = True; 13.41/5.46 13.41/5.46 mkBranchLeft_ok vxw vxx vxy = mkBranchLeft_ok0 vxw vxx vxy vxx vxy vxx; 13.41/5.46 13.41/5.46 mkBranchLeft_ok0 vxw vxx vxy fm_l key EmptyFM = True; 13.41/5.46 mkBranchLeft_ok0 vxw vxx vxy fm_l key (Branch left_key xv xw xx xy) = mkBranchLeft_ok0Biggest_left_key fm_l < key; 13.41/5.46 13.41/5.46 mkBranchLeft_ok0Biggest_left_key vyy = fst (findMax vyy); 13.41/5.46 13.41/5.46 mkBranchLeft_size vxw vxx vxy = sizeFM vxx; 13.41/5.46 13.41/5.46 mkBranchResult vxz vyu vyv vyw = Branch vxz vyu (mkBranchUnbox vyv vyw vxz (1 + mkBranchLeft_size vyv vyw vxz + mkBranchRight_size vyv vyw vxz)) vyw vyv; 13.41/5.46 13.41/5.46 mkBranchRight_ok vxw vxx vxy = mkBranchRight_ok0 vxw vxx vxy vxw vxy vxw; 13.41/5.46 13.41/5.46 mkBranchRight_ok0 vxw vxx vxy fm_r key EmptyFM = True; 13.41/5.46 mkBranchRight_ok0 vxw vxx vxy fm_r key (Branch right_key xz yu yv yw) = key < mkBranchRight_ok0Smallest_right_key fm_r; 13.41/5.46 13.41/5.46 mkBranchRight_ok0Smallest_right_key vyx = fst (findMin vyx); 13.41/5.46 13.41/5.46 mkBranchRight_size vxw vxx vxy = sizeFM vxw; 13.41/5.46 13.41/5.46 mkBranchUnbox :: Ord a => -> (FiniteMap a b) ( -> (FiniteMap a b) ( -> a (Int -> Int))); 13.41/5.46 mkBranchUnbox vxw vxx vxy x = x; 13.41/5.46 13.41/5.46 sIZE_RATIO :: Int; 13.41/5.46 sIZE_RATIO = 5; 13.41/5.46 13.41/5.46 sizeFM :: FiniteMap b a -> Int; 13.41/5.46 sizeFM EmptyFM = 0; 13.41/5.46 sizeFM (Branch vz wu size wv ww) = size; 13.41/5.46 13.41/5.46 unitFM :: b -> a -> FiniteMap b a; 13.41/5.46 unitFM key elt = Branch key elt 1 emptyFM emptyFM; 13.41/5.46 13.41/5.46 } 13.41/5.46 module Maybe where { 13.41/5.46 import qualified FiniteMap; 13.41/5.46 import qualified Main; 13.41/5.46 import qualified Prelude; 13.41/5.46 } 13.41/5.46 module Main where { 13.41/5.46 import qualified FiniteMap; 13.41/5.46 import qualified Maybe; 13.41/5.46 import qualified Prelude; 13.41/5.46 } 13.41/5.46 13.41/5.46 ---------------------------------------- 13.41/5.46 13.41/5.46 (9) NumRed (SOUND) 13.41/5.46 Num Reduction:All numbers are transformed to their corresponding representation with Succ, Pred and Zero. 13.41/5.46 ---------------------------------------- 13.41/5.46 13.41/5.46 (10) 13.41/5.46 Obligation: 13.41/5.46 mainModule Main 13.41/5.46 module FiniteMap where { 13.41/5.46 import qualified Main; 13.41/5.46 import qualified Maybe; 13.41/5.46 import qualified Prelude; 13.41/5.46 data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b) ; 13.41/5.46 13.41/5.46 instance (Eq a, Eq b) => Eq FiniteMap b a where { 13.41/5.46 } 13.41/5.46 addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b; 13.41/5.46 addListToFM_C combiner fm key_elt_pairs = foldl (addListToFM_CAdd combiner) fm key_elt_pairs; 13.41/5.46 13.41/5.46 addListToFM_CAdd vxv fmap (key,elt) = addToFM_C vxv fmap key elt; 13.41/5.46 13.41/5.46 addToFM_C :: Ord b => (a -> a -> a) -> FiniteMap b a -> b -> a -> FiniteMap b a; 13.41/5.46 addToFM_C combiner EmptyFM key elt = addToFM_C4 combiner EmptyFM key elt; 13.41/5.46 addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt = addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt; 13.41/5.46 13.41/5.46 addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt True = Branch new_key (combiner elt new_elt) size fm_l fm_r; 13.41/5.46 13.41/5.46 addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt True = mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt); 13.41/5.46 addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt False = addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt otherwise; 13.41/5.46 13.41/5.46 addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt True = mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r; 13.41/5.46 addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt False = addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt (new_key > key); 13.41/5.46 13.41/5.46 addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt = addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt (new_key < key); 13.41/5.46 13.41/5.46 addToFM_C4 combiner EmptyFM key elt = unitFM key elt; 13.41/5.46 addToFM_C4 vvx vvy vvz vwu = addToFM_C3 vvx vvy vvz vwu; 13.41/5.46 13.41/5.46 emptyFM :: FiniteMap b a; 13.41/5.46 emptyFM = EmptyFM; 13.41/5.46 13.41/5.46 findMax :: FiniteMap b a -> (b,a); 13.41/5.46 findMax (Branch key elt yx yy EmptyFM) = (key,elt); 13.41/5.46 findMax (Branch key elt yz zu fm_r) = findMax fm_r; 13.41/5.46 13.41/5.46 findMin :: FiniteMap b a -> (b,a); 13.41/5.46 findMin (Branch key elt wx EmptyFM wy) = (key,elt); 13.41/5.46 findMin (Branch key elt wz fm_l xu) = findMin fm_l; 13.41/5.46 13.41/5.46 mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; 13.41/5.46 mkBalBranch key elt fm_L fm_R = mkBalBranch6 key elt fm_L fm_R; 13.41/5.46 13.41/5.46 mkBalBranch6 key elt fm_L fm_R = mkBalBranch6MkBalBranch5 key elt fm_R fm_L key elt fm_L fm_R (mkBalBranch6Size_l key elt fm_R fm_L + mkBalBranch6Size_r key elt fm_R fm_L < Pos (Succ (Succ Zero))); 13.41/5.46 13.41/5.46 mkBalBranch6Double_L vwx vwy vwz vxu fm_l (Branch key_r elt_r vuv (Branch key_rl elt_rl vuw fm_rll fm_rlr) fm_rr) = mkBranch (Pos (Succ (Succ (Succ (Succ (Succ Zero)))))) key_rl elt_rl (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))) vwx vwy fm_l fm_rll) (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))) key_r elt_r fm_rlr fm_rr); 13.41/5.46 13.41/5.46 mkBalBranch6Double_R vwx vwy vwz vxu (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r = mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))))))) key_lr elt_lr (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))) key_l elt_l fm_ll fm_lrl) (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))))))))) vwx vwy fm_lrr fm_r); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch0 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch6MkBalBranch02 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch00 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr True = mkBalBranch6Double_L vwx vwy vwz vxu fm_L fm_R; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr True = mkBalBranch6Single_L vwx vwy vwz vxu fm_L fm_R; 13.41/5.46 mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr False = mkBalBranch6MkBalBranch00 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr otherwise; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch02 vwx vwy vwz vxu fm_L fm_R (Branch vux vuy vuz fm_rl fm_rr) = mkBalBranch6MkBalBranch01 vwx vwy vwz vxu fm_L fm_R vux vuy vuz fm_rl fm_rr (sizeFM fm_rl < Pos (Succ (Succ Zero)) * sizeFM fm_rr); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch1 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch6MkBalBranch12 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch10 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr True = mkBalBranch6Double_R vwx vwy vwz vxu fm_L fm_R; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr True = mkBalBranch6Single_R vwx vwy vwz vxu fm_L fm_R; 13.41/5.46 mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr False = mkBalBranch6MkBalBranch10 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr otherwise; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch12 vwx vwy vwz vxu fm_L fm_R (Branch zy zz vuu fm_ll fm_lr) = mkBalBranch6MkBalBranch11 vwx vwy vwz vxu fm_L fm_R zy zz vuu fm_ll fm_lr (sizeFM fm_lr < Pos (Succ (Succ Zero)) * sizeFM fm_ll); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch2 vwx vwy vwz vxu key elt fm_L fm_R True = mkBranch (Pos (Succ (Succ Zero))) key elt fm_L fm_R; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R True = mkBalBranch6MkBalBranch1 vwx vwy vwz vxu fm_L fm_R fm_L; 13.41/5.46 mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch2 vwx vwy vwz vxu key elt fm_L fm_R otherwise; 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R True = mkBalBranch6MkBalBranch0 vwx vwy vwz vxu fm_L fm_R fm_R; 13.41/5.46 mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch3 vwx vwy vwz vxu key elt fm_L fm_R (mkBalBranch6Size_l vwx vwy vwz vxu > sIZE_RATIO * mkBalBranch6Size_r vwx vwy vwz vxu); 13.41/5.46 13.41/5.46 mkBalBranch6MkBalBranch5 vwx vwy vwz vxu key elt fm_L fm_R True = mkBranch (Pos (Succ Zero)) key elt fm_L fm_R; 13.41/5.46 mkBalBranch6MkBalBranch5 vwx vwy vwz vxu key elt fm_L fm_R False = mkBalBranch6MkBalBranch4 vwx vwy vwz vxu key elt fm_L fm_R (mkBalBranch6Size_r vwx vwy vwz vxu > sIZE_RATIO * mkBalBranch6Size_l vwx vwy vwz vxu); 13.41/5.46 13.41/5.46 mkBalBranch6Single_L vwx vwy vwz vxu fm_l (Branch key_r elt_r vvu fm_rl fm_rr) = mkBranch (Pos (Succ (Succ (Succ Zero)))) key_r elt_r (mkBranch (Pos (Succ (Succ (Succ (Succ Zero))))) vwx vwy fm_l fm_rl) fm_rr; 13.41/5.46 13.41/5.46 mkBalBranch6Single_R vwx vwy vwz vxu (Branch key_l elt_l zv fm_ll fm_lr) fm_r = mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))))) key_l elt_l fm_ll (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))) vwx vwy fm_lr fm_r); 13.41/5.46 13.41/5.46 mkBalBranch6Size_l vwx vwy vwz vxu = sizeFM vxu; 13.41/5.46 13.41/5.46 mkBalBranch6Size_r vwx vwy vwz vxu = sizeFM vwz; 13.41/5.46 13.41/5.46 mkBranch :: Ord b => Int -> b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; 13.41/5.46 mkBranch which key elt fm_l fm_r = mkBranchResult key elt fm_r fm_l; 13.41/5.46 13.41/5.46 mkBranchBalance_ok vxw vxx vxy = True; 13.41/5.46 13.41/5.46 mkBranchLeft_ok vxw vxx vxy = mkBranchLeft_ok0 vxw vxx vxy vxx vxy vxx; 13.41/5.46 13.41/5.46 mkBranchLeft_ok0 vxw vxx vxy fm_l key EmptyFM = True; 13.41/5.46 mkBranchLeft_ok0 vxw vxx vxy fm_l key (Branch left_key xv xw xx xy) = mkBranchLeft_ok0Biggest_left_key fm_l < key; 13.41/5.46 13.41/5.46 mkBranchLeft_ok0Biggest_left_key vyy = fst (findMax vyy); 13.41/5.46 13.41/5.46 mkBranchLeft_size vxw vxx vxy = sizeFM vxx; 13.41/5.46 13.41/5.46 mkBranchResult vxz vyu vyv vyw = Branch vxz vyu (mkBranchUnbox vyv vyw vxz (Pos (Succ Zero) + mkBranchLeft_size vyv vyw vxz + mkBranchRight_size vyv vyw vxz)) vyw vyv; 13.41/5.46 13.41/5.46 mkBranchRight_ok vxw vxx vxy = mkBranchRight_ok0 vxw vxx vxy vxw vxy vxw; 13.41/5.46 13.41/5.46 mkBranchRight_ok0 vxw vxx vxy fm_r key EmptyFM = True; 13.41/5.46 mkBranchRight_ok0 vxw vxx vxy fm_r key (Branch right_key xz yu yv yw) = key < mkBranchRight_ok0Smallest_right_key fm_r; 13.41/5.46 13.41/5.46 mkBranchRight_ok0Smallest_right_key vyx = fst (findMin vyx); 13.41/5.46 13.41/5.46 mkBranchRight_size vxw vxx vxy = sizeFM vxw; 13.41/5.46 13.41/5.46 mkBranchUnbox :: Ord a => -> (FiniteMap a b) ( -> (FiniteMap a b) ( -> a (Int -> Int))); 13.41/5.46 mkBranchUnbox vxw vxx vxy x = x; 13.41/5.46 13.41/5.46 sIZE_RATIO :: Int; 13.41/5.46 sIZE_RATIO = Pos (Succ (Succ (Succ (Succ (Succ Zero))))); 13.41/5.46 13.41/5.46 sizeFM :: FiniteMap a b -> Int; 13.41/5.46 sizeFM EmptyFM = Pos Zero; 13.41/5.46 sizeFM (Branch vz wu size wv ww) = size; 13.41/5.46 13.41/5.46 unitFM :: b -> a -> FiniteMap b a; 13.41/5.46 unitFM key elt = Branch key elt (Pos (Succ Zero)) emptyFM emptyFM; 13.41/5.46 13.41/5.46 } 13.41/5.46 module Maybe where { 13.41/5.46 import qualified FiniteMap; 13.41/5.46 import qualified Main; 13.41/5.46 import qualified Prelude; 13.41/5.46 } 13.41/5.46 module Main where { 13.41/5.46 import qualified FiniteMap; 13.41/5.46 import qualified Maybe; 13.41/5.46 import qualified Prelude; 13.41/5.46 } 13.41/5.46 13.41/5.46 ---------------------------------------- 13.41/5.46 13.41/5.46 (11) Narrow (SOUND) 13.41/5.46 Haskell To QDPs 13.41/5.46 13.41/5.46 digraph dp_graph { 13.41/5.46 node [outthreshold=100, inthreshold=100];1[label="FiniteMap.addListToFM_C",fontsize=16,color="grey",shape="box"];1 -> 3[label="",style="dashed", color="grey", weight=3]; 13.41/5.46 3[label="FiniteMap.addListToFM_C vyz3",fontsize=16,color="grey",shape="box"];3 -> 4[label="",style="dashed", color="grey", weight=3]; 13.41/5.46 4[label="FiniteMap.addListToFM_C vyz3 vyz4",fontsize=16,color="grey",shape="box"];4 -> 5[label="",style="dashed", color="grey", weight=3]; 13.41/5.46 5[label="FiniteMap.addListToFM_C vyz3 vyz4 vyz5",fontsize=16,color="black",shape="triangle"];5 -> 6[label="",style="solid", color="black", weight=3]; 13.41/5.46 6[label="foldl (FiniteMap.addListToFM_CAdd vyz3) vyz4 vyz5",fontsize=16,color="burlywood",shape="triangle"];40[label="vyz5/vyz50 : vyz51",fontsize=10,color="white",style="solid",shape="box"];6 -> 40[label="",style="solid", color="burlywood", weight=9]; 13.41/5.46 40 -> 7[label="",style="solid", color="burlywood", weight=3]; 13.41/5.46 41[label="vyz5/[]",fontsize=10,color="white",style="solid",shape="box"];6 -> 41[label="",style="solid", color="burlywood", weight=9]; 13.41/5.46 41 -> 8[label="",style="solid", color="burlywood", weight=3]; 13.41/5.46 7[label="foldl (FiniteMap.addListToFM_CAdd vyz3) vyz4 (vyz50 : vyz51)",fontsize=16,color="black",shape="box"];7 -> 9[label="",style="solid", color="black", weight=3]; 13.41/5.46 8[label="foldl (FiniteMap.addListToFM_CAdd vyz3) vyz4 []",fontsize=16,color="black",shape="box"];8 -> 10[label="",style="solid", color="black", weight=3]; 13.41/5.46 9 -> 6[label="",style="dashed", color="red", weight=0]; 13.41/5.46 9[label="foldl (FiniteMap.addListToFM_CAdd vyz3) (FiniteMap.addListToFM_CAdd vyz3 vyz4 vyz50) vyz51",fontsize=16,color="magenta"];9 -> 11[label="",style="dashed", color="magenta", weight=3]; 13.41/5.46 9 -> 12[label="",style="dashed", color="magenta", weight=3]; 13.41/5.46 10[label="vyz4",fontsize=16,color="green",shape="box"];11[label="FiniteMap.addListToFM_CAdd vyz3 vyz4 vyz50",fontsize=16,color="burlywood",shape="box"];42[label="vyz50/(vyz500,vyz501)",fontsize=10,color="white",style="solid",shape="box"];11 -> 42[label="",style="solid", color="burlywood", weight=9]; 13.41/5.46 42 -> 13[label="",style="solid", color="burlywood", weight=3]; 13.41/5.46 12[label="vyz51",fontsize=16,color="green",shape="box"];13[label="FiniteMap.addListToFM_CAdd vyz3 vyz4 (vyz500,vyz501)",fontsize=16,color="black",shape="box"];13 -> 14[label="",style="solid", color="black", weight=3]; 13.41/5.46 14[label="FiniteMap.addToFM_C vyz3 vyz4 vyz500 vyz501",fontsize=16,color="burlywood",shape="box"];43[label="vyz4/FiniteMap.EmptyFM",fontsize=10,color="white",style="solid",shape="box"];14 -> 43[label="",style="solid", color="burlywood", weight=9]; 13.41/5.46 43 -> 15[label="",style="solid", color="burlywood", weight=3]; 13.41/5.46 44[label="vyz4/FiniteMap.Branch vyz40 vyz41 vyz42 vyz43 vyz44",fontsize=10,color="white",style="solid",shape="box"];14 -> 44[label="",style="solid", color="burlywood", weight=9]; 13.41/5.46 44 -> 16[label="",style="solid", color="burlywood", weight=3]; 13.41/5.46 15[label="FiniteMap.addToFM_C vyz3 FiniteMap.EmptyFM vyz500 vyz501",fontsize=16,color="black",shape="box"];15 -> 17[label="",style="solid", color="black", weight=3]; 13.41/5.46 16[label="FiniteMap.addToFM_C vyz3 (FiniteMap.Branch vyz40 vyz41 vyz42 vyz43 vyz44) vyz500 vyz501",fontsize=16,color="black",shape="box"];16 -> 18[label="",style="solid", color="black", weight=3]; 13.41/5.46 17[label="FiniteMap.addToFM_C4 vyz3 FiniteMap.EmptyFM vyz500 vyz501",fontsize=16,color="black",shape="box"];17 -> 19[label="",style="solid", color="black", weight=3]; 13.41/5.46 18[label="FiniteMap.addToFM_C3 vyz3 (FiniteMap.Branch vyz40 vyz41 vyz42 vyz43 vyz44) vyz500 vyz501",fontsize=16,color="black",shape="box"];18 -> 20[label="",style="solid", color="black", weight=3]; 13.41/5.46 19[label="FiniteMap.unitFM vyz500 vyz501",fontsize=16,color="black",shape="box"];19 -> 21[label="",style="solid", color="black", weight=3]; 13.41/5.46 20[label="FiniteMap.addToFM_C2 vyz3 vyz40 vyz41 vyz42 vyz43 vyz44 vyz500 vyz501 (vyz500 < vyz40)",fontsize=16,color="black",shape="box"];20 -> 22[label="",style="solid", color="black", weight=3]; 13.41/5.46 21[label="FiniteMap.Branch vyz500 vyz501 (Pos (Succ Zero)) FiniteMap.emptyFM FiniteMap.emptyFM",fontsize=16,color="green",shape="box"];21 -> 23[label="",style="dashed", color="green", weight=3]; 13.41/5.46 21 -> 24[label="",style="dashed", color="green", weight=3]; 13.41/5.46 22[label="FiniteMap.addToFM_C2 vyz3 vyz40 vyz41 vyz42 vyz43 vyz44 vyz500 vyz501 (compare vyz500 vyz40 == LT)",fontsize=16,color="burlywood",shape="box"];45[label="vyz500/()",fontsize=10,color="white",style="solid",shape="box"];22 -> 45[label="",style="solid", color="burlywood", weight=9]; 13.41/5.46 45 -> 25[label="",style="solid", color="burlywood", weight=3]; 13.41/5.46 23[label="FiniteMap.emptyFM",fontsize=16,color="black",shape="triangle"];23 -> 26[label="",style="solid", color="black", weight=3]; 13.41/5.46 24 -> 23[label="",style="dashed", color="red", weight=0]; 13.41/5.46 24[label="FiniteMap.emptyFM",fontsize=16,color="magenta"];25[label="FiniteMap.addToFM_C2 vyz3 vyz40 vyz41 vyz42 vyz43 vyz44 () vyz501 (compare () vyz40 == LT)",fontsize=16,color="burlywood",shape="box"];46[label="vyz40/()",fontsize=10,color="white",style="solid",shape="box"];25 -> 46[label="",style="solid", color="burlywood", weight=9]; 13.41/5.46 46 -> 27[label="",style="solid", color="burlywood", weight=3]; 13.41/5.46 26[label="FiniteMap.EmptyFM",fontsize=16,color="green",shape="box"];27[label="FiniteMap.addToFM_C2 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 (compare () () == LT)",fontsize=16,color="black",shape="box"];27 -> 28[label="",style="solid", color="black", weight=3]; 13.41/5.46 28[label="FiniteMap.addToFM_C2 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 (EQ == LT)",fontsize=16,color="black",shape="box"];28 -> 29[label="",style="solid", color="black", weight=3]; 13.41/5.46 29[label="FiniteMap.addToFM_C2 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 False",fontsize=16,color="black",shape="box"];29 -> 30[label="",style="solid", color="black", weight=3]; 13.41/5.46 30[label="FiniteMap.addToFM_C1 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 (() > ())",fontsize=16,color="black",shape="box"];30 -> 31[label="",style="solid", color="black", weight=3]; 13.41/5.46 31[label="FiniteMap.addToFM_C1 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 (compare () () == GT)",fontsize=16,color="black",shape="box"];31 -> 32[label="",style="solid", color="black", weight=3]; 13.41/5.46 32[label="FiniteMap.addToFM_C1 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 (EQ == GT)",fontsize=16,color="black",shape="box"];32 -> 33[label="",style="solid", color="black", weight=3]; 13.41/5.46 33[label="FiniteMap.addToFM_C1 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 False",fontsize=16,color="black",shape="box"];33 -> 34[label="",style="solid", color="black", weight=3]; 13.41/5.46 34[label="FiniteMap.addToFM_C0 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 otherwise",fontsize=16,color="black",shape="box"];34 -> 35[label="",style="solid", color="black", weight=3]; 13.41/5.46 35[label="FiniteMap.addToFM_C0 vyz3 () vyz41 vyz42 vyz43 vyz44 () vyz501 True",fontsize=16,color="black",shape="box"];35 -> 36[label="",style="solid", color="black", weight=3]; 13.41/5.46 36[label="FiniteMap.Branch () (vyz3 vyz41 vyz501) vyz42 vyz43 vyz44",fontsize=16,color="green",shape="box"];36 -> 37[label="",style="dashed", color="green", weight=3]; 13.41/5.46 37[label="vyz3 vyz41 vyz501",fontsize=16,color="green",shape="box"];37 -> 38[label="",style="dashed", color="green", weight=3]; 13.41/5.46 37 -> 39[label="",style="dashed", color="green", weight=3]; 13.41/5.46 38[label="vyz41",fontsize=16,color="green",shape="box"];39[label="vyz501",fontsize=16,color="green",shape="box"];} 13.41/5.46 13.41/5.46 ---------------------------------------- 13.41/5.46 13.41/5.46 (12) 13.41/5.46 Obligation: 13.41/5.46 Q DP problem: 13.41/5.46 The TRS P consists of the following rules: 13.41/5.46 13.41/5.46 new_foldl(vyz3, :(vyz50, vyz51), h) -> new_foldl(vyz3, vyz51, h) 13.41/5.46 13.41/5.46 R is empty. 13.41/5.46 Q is empty. 13.41/5.46 We have to consider all minimal (P,Q,R)-chains. 13.41/5.46 ---------------------------------------- 13.41/5.46 13.41/5.46 (13) QDPSizeChangeProof (EQUIVALENT) 13.41/5.46 By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem. 13.41/5.46 13.41/5.46 From the DPs we obtained the following set of size-change graphs: 13.41/5.46 *new_foldl(vyz3, :(vyz50, vyz51), h) -> new_foldl(vyz3, vyz51, h) 13.41/5.46 The graph contains the following edges 1 >= 1, 2 > 2, 3 >= 3 13.41/5.46 13.41/5.46 13.41/5.46 ---------------------------------------- 13.41/5.46 13.41/5.46 (14) 13.41/5.46 YES 13.72/5.51 EOF