/export/starexec/sandbox/solver/bin/starexec_run_standard /export/starexec/sandbox/benchmark/theBenchmark.hs /export/starexec/sandbox/output/output_files -------------------------------------------------------------------------------- MAYBE proof of /export/starexec/sandbox/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) LR [EQUIVALENT, 0 ms] (2) HASKELL (3) CR [EQUIVALENT, 0 ms] (4) HASKELL (5) BR [EQUIVALENT, 0 ms] (6) HASKELL (7) COR [EQUIVALENT, 12 ms] (8) HASKELL (9) LetRed [EQUIVALENT, 0 ms] (10) HASKELL (11) NumRed [SOUND, 0 ms] (12) HASKELL ---------------------------------------- (0) Obligation: mainModule Main module FiniteMap where { import qualified Main; import qualified Maybe; import qualified Prelude; data FiniteMap b a = EmptyFM | Branch b a Int (FiniteMap b a) (FiniteMap b a) ; instance (Eq a, Eq b) => Eq FiniteMap a b where { } delFromFM :: Ord b => FiniteMap b a -> b -> FiniteMap b a; delFromFM EmptyFM del_key = emptyFM; delFromFM (Branch key elt size fm_l fm_r) del_key | del_key > key = mkBalBranch key elt fm_l (delFromFM fm_r del_key) | del_key < key = mkBalBranch key elt (delFromFM fm_l del_key) fm_r | key == del_key = glueBal fm_l fm_r; delListFromFM :: Ord a => FiniteMap a b -> [a] -> FiniteMap a b; delListFromFM fm keys = foldl delFromFM fm keys; deleteMax :: Ord b => FiniteMap b a -> FiniteMap b a; deleteMax (Branch key elt _ fm_l EmptyFM) = fm_l; deleteMax (Branch key elt _ fm_l fm_r) = mkBalBranch key elt fm_l (deleteMax fm_r); deleteMin :: Ord b => FiniteMap b a -> FiniteMap b a; deleteMin (Branch key elt _ EmptyFM fm_r) = fm_r; deleteMin (Branch key elt _ fm_l fm_r) = mkBalBranch key elt (deleteMin fm_l) fm_r; emptyFM :: FiniteMap b a; emptyFM = EmptyFM; findMax :: FiniteMap a b -> (a,b); findMax (Branch key elt _ _ EmptyFM) = (key,elt); findMax (Branch key elt _ _ fm_r) = findMax fm_r; findMin :: FiniteMap b a -> (b,a); findMin (Branch key elt _ EmptyFM _) = (key,elt); findMin (Branch key elt _ fm_l _) = findMin fm_l; glueBal :: Ord b => FiniteMap b a -> FiniteMap b a -> FiniteMap b a; glueBal EmptyFM fm2 = fm2; glueBal fm1 EmptyFM = fm1; glueBal fm1 fm2 | sizeFM fm2 > sizeFM fm1 = mkBalBranch mid_key2 mid_elt2 fm1 (deleteMin fm2) | otherwise = mkBalBranch mid_key1 mid_elt1 (deleteMax fm1) fm2 where { mid_elt1 = (\(_,mid_elt1) ->mid_elt1) vv2; mid_elt2 = (\(_,mid_elt2) ->mid_elt2) vv3; mid_key1 = (\(mid_key1,_) ->mid_key1) vv2; mid_key2 = (\(mid_key2,_) ->mid_key2) vv3; vv2 = findMax fm1; vv3 = findMin fm2; }; mkBalBranch :: Ord b => b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; mkBalBranch key elt fm_L fm_R | size_l + size_r < 2 = mkBranch 1 key elt fm_L fm_R | size_r > sIZE_RATIO * size_l = case fm_R of { Branch _ _ _ fm_rl fm_rr | sizeFM fm_rl < 2 * sizeFM fm_rr -> single_L fm_L fm_R | otherwise -> double_L fm_L fm_R; } | size_l > sIZE_RATIO * size_r = case fm_L of { Branch _ _ _ fm_ll fm_lr | sizeFM fm_lr < 2 * sizeFM fm_ll -> single_R fm_L fm_R | otherwise -> double_R fm_L fm_R; } | otherwise = mkBranch 2 key elt fm_L fm_R where { 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); 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); 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; 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); size_l = sizeFM fm_L; size_r = sizeFM fm_R; }; mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; mkBranch which key elt fm_l fm_r = let { result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; } in result where { balance_ok = True; left_ok = case fm_l of { EmptyFM-> True; Branch left_key _ _ _ _-> let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key; } ; left_size = sizeFM fm_l; right_ok = case fm_r of { EmptyFM-> True; Branch right_key _ _ _ _-> let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key; } ; right_size = sizeFM fm_r; unbox :: Int -> Int; unbox x = x; }; sIZE_RATIO :: Int; sIZE_RATIO = 5; sizeFM :: FiniteMap a b -> Int; sizeFM EmptyFM = 0; sizeFM (Branch _ _ size _ _) = size; } module Maybe where { import qualified FiniteMap; import qualified Main; import qualified Prelude; } module Main where { import qualified FiniteMap; import qualified Maybe; import qualified Prelude; } ---------------------------------------- (1) LR (EQUIVALENT) Lambda Reductions: The following Lambda expression "\(_,mid_elt2)->mid_elt2" is transformed to "mid_elt20 (_,mid_elt2) = mid_elt2; " The following Lambda expression "\(mid_key2,_)->mid_key2" is transformed to "mid_key20 (mid_key2,_) = mid_key2; " The following Lambda expression "\(mid_key1,_)->mid_key1" is transformed to "mid_key10 (mid_key1,_) = mid_key1; " The following Lambda expression "\(_,mid_elt1)->mid_elt1" is transformed to "mid_elt10 (_,mid_elt1) = mid_elt1; " ---------------------------------------- (2) Obligation: mainModule Main module FiniteMap where { import qualified Main; import qualified Maybe; import qualified Prelude; data FiniteMap b a = EmptyFM | Branch b a Int (FiniteMap b a) (FiniteMap b a) ; instance (Eq a, Eq b) => Eq FiniteMap b a where { } delFromFM :: Ord b => FiniteMap b a -> b -> FiniteMap b a; delFromFM EmptyFM del_key = emptyFM; delFromFM (Branch key elt size fm_l fm_r) del_key | del_key > key = mkBalBranch key elt fm_l (delFromFM fm_r del_key) | del_key < key = mkBalBranch key elt (delFromFM fm_l del_key) fm_r | key == del_key = glueBal fm_l fm_r; delListFromFM :: Ord a => FiniteMap a b -> [a] -> FiniteMap a b; delListFromFM fm keys = foldl delFromFM fm keys; deleteMax :: Ord a => FiniteMap a b -> FiniteMap a b; deleteMax (Branch key elt _ fm_l EmptyFM) = fm_l; deleteMax (Branch key elt _ fm_l fm_r) = mkBalBranch key elt fm_l (deleteMax fm_r); deleteMin :: Ord b => FiniteMap b a -> FiniteMap b a; deleteMin (Branch key elt _ EmptyFM fm_r) = fm_r; deleteMin (Branch key elt _ fm_l fm_r) = mkBalBranch key elt (deleteMin fm_l) fm_r; emptyFM :: FiniteMap b a; emptyFM = EmptyFM; findMax :: FiniteMap a b -> (a,b); findMax (Branch key elt _ _ EmptyFM) = (key,elt); findMax (Branch key elt _ _ fm_r) = findMax fm_r; findMin :: FiniteMap a b -> (a,b); findMin (Branch key elt _ EmptyFM _) = (key,elt); findMin (Branch key elt _ fm_l _) = findMin fm_l; glueBal :: Ord a => FiniteMap a b -> FiniteMap a b -> FiniteMap a b; glueBal EmptyFM fm2 = fm2; glueBal fm1 EmptyFM = fm1; glueBal fm1 fm2 | sizeFM fm2 > sizeFM fm1 = mkBalBranch mid_key2 mid_elt2 fm1 (deleteMin fm2) | otherwise = mkBalBranch mid_key1 mid_elt1 (deleteMax fm1) fm2 where { mid_elt1 = mid_elt10 vv2; mid_elt10 (_,mid_elt1) = mid_elt1; mid_elt2 = mid_elt20 vv3; mid_elt20 (_,mid_elt2) = mid_elt2; mid_key1 = mid_key10 vv2; mid_key10 (mid_key1,_) = mid_key1; mid_key2 = mid_key20 vv3; mid_key20 (mid_key2,_) = mid_key2; vv2 = findMax fm1; vv3 = findMin fm2; }; mkBalBranch :: Ord b => b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; mkBalBranch key elt fm_L fm_R | size_l + size_r < 2 = mkBranch 1 key elt fm_L fm_R | size_r > sIZE_RATIO * size_l = case fm_R of { Branch _ _ _ fm_rl fm_rr | sizeFM fm_rl < 2 * sizeFM fm_rr -> single_L fm_L fm_R | otherwise -> double_L fm_L fm_R; } | size_l > sIZE_RATIO * size_r = case fm_L of { Branch _ _ _ fm_ll fm_lr | sizeFM fm_lr < 2 * sizeFM fm_ll -> single_R fm_L fm_R | otherwise -> double_R fm_L fm_R; } | otherwise = mkBranch 2 key elt fm_L fm_R where { 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); 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); 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; 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); size_l = sizeFM fm_L; size_r = sizeFM fm_R; }; mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; mkBranch which key elt fm_l fm_r = let { result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; } in result where { balance_ok = True; left_ok = case fm_l of { EmptyFM-> True; Branch left_key _ _ _ _-> let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key; } ; left_size = sizeFM fm_l; right_ok = case fm_r of { EmptyFM-> True; Branch right_key _ _ _ _-> let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key; } ; right_size = sizeFM fm_r; unbox :: Int -> Int; unbox x = x; }; sIZE_RATIO :: Int; sIZE_RATIO = 5; sizeFM :: FiniteMap b a -> Int; sizeFM EmptyFM = 0; sizeFM (Branch _ _ size _ _) = size; } module Maybe where { import qualified FiniteMap; import qualified Main; import qualified Prelude; } module Main where { import qualified FiniteMap; import qualified Maybe; import qualified Prelude; } ---------------------------------------- (3) CR (EQUIVALENT) Case Reductions: The following Case expression "case fm_r of { EmptyFM -> True; Branch right_key _ _ _ _ -> let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key} " is transformed to "right_ok0 fm_r key EmptyFM = True; right_ok0 fm_r key (Branch right_key _ _ _ _) = let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key; " The following Case expression "case fm_l of { EmptyFM -> True; Branch left_key _ _ _ _ -> let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key} " is transformed to "left_ok0 fm_l key EmptyFM = True; left_ok0 fm_l key (Branch left_key _ _ _ _) = let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key; " The following Case expression "case fm_R of { Branch _ _ _ fm_rl fm_rr |sizeFM fm_rl < 2 * sizeFM fm_rrsingle_L fm_L fm_R|otherwisedouble_L fm_L fm_R} " is transformed to "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; " The following Case expression "case fm_L of { Branch _ _ _ fm_ll fm_lr |sizeFM fm_lr < 2 * sizeFM fm_llsingle_R fm_L fm_R|otherwisedouble_R fm_L fm_R} " is transformed to "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; " ---------------------------------------- (4) Obligation: mainModule Main module FiniteMap where { import qualified Main; import qualified Maybe; import qualified Prelude; data FiniteMap b a = EmptyFM | Branch b a Int (FiniteMap b a) (FiniteMap b a) ; instance (Eq a, Eq b) => Eq FiniteMap b a where { } delFromFM :: Ord b => FiniteMap b a -> b -> FiniteMap b a; delFromFM EmptyFM del_key = emptyFM; delFromFM (Branch key elt size fm_l fm_r) del_key | del_key > key = mkBalBranch key elt fm_l (delFromFM fm_r del_key) | del_key < key = mkBalBranch key elt (delFromFM fm_l del_key) fm_r | key == del_key = glueBal fm_l fm_r; delListFromFM :: Ord a => FiniteMap a b -> [a] -> FiniteMap a b; delListFromFM fm keys = foldl delFromFM fm keys; deleteMax :: Ord b => FiniteMap b a -> FiniteMap b a; deleteMax (Branch key elt _ fm_l EmptyFM) = fm_l; deleteMax (Branch key elt _ fm_l fm_r) = mkBalBranch key elt fm_l (deleteMax fm_r); deleteMin :: Ord a => FiniteMap a b -> FiniteMap a b; deleteMin (Branch key elt _ EmptyFM fm_r) = fm_r; deleteMin (Branch key elt _ fm_l fm_r) = mkBalBranch key elt (deleteMin fm_l) fm_r; emptyFM :: FiniteMap b a; emptyFM = EmptyFM; findMax :: FiniteMap b a -> (b,a); findMax (Branch key elt _ _ EmptyFM) = (key,elt); findMax (Branch key elt _ _ fm_r) = findMax fm_r; findMin :: FiniteMap a b -> (a,b); findMin (Branch key elt _ EmptyFM _) = (key,elt); findMin (Branch key elt _ fm_l _) = findMin fm_l; glueBal :: Ord a => FiniteMap a b -> FiniteMap a b -> FiniteMap a b; glueBal EmptyFM fm2 = fm2; glueBal fm1 EmptyFM = fm1; glueBal fm1 fm2 | sizeFM fm2 > sizeFM fm1 = mkBalBranch mid_key2 mid_elt2 fm1 (deleteMin fm2) | otherwise = mkBalBranch mid_key1 mid_elt1 (deleteMax fm1) fm2 where { mid_elt1 = mid_elt10 vv2; mid_elt10 (_,mid_elt1) = mid_elt1; mid_elt2 = mid_elt20 vv3; mid_elt20 (_,mid_elt2) = mid_elt2; mid_key1 = mid_key10 vv2; mid_key10 (mid_key1,_) = mid_key1; mid_key2 = mid_key20 vv3; mid_key20 (mid_key2,_) = mid_key2; vv2 = findMax fm1; vv3 = findMin fm2; }; mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; mkBalBranch key elt fm_L fm_R | size_l + size_r < 2 = mkBranch 1 key elt fm_L fm_R | size_r > sIZE_RATIO * size_l = mkBalBranch0 fm_L fm_R fm_R | size_l > sIZE_RATIO * size_r = mkBalBranch1 fm_L fm_R fm_L | otherwise = mkBranch 2 key elt fm_L fm_R where { 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); 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); mkBalBranch0 fm_L fm_R (Branch _ _ _ fm_rl fm_rr) | sizeFM fm_rl < 2 * sizeFM fm_rr = single_L fm_L fm_R | otherwise = double_L fm_L fm_R; mkBalBranch1 fm_L fm_R (Branch _ _ _ fm_ll fm_lr) | sizeFM fm_lr < 2 * sizeFM fm_ll = single_R fm_L fm_R | otherwise = double_R fm_L fm_R; 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; 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); size_l = sizeFM fm_L; size_r = sizeFM fm_R; }; mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; mkBranch which key elt fm_l fm_r = let { result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; } in result where { balance_ok = True; left_ok = left_ok0 fm_l key fm_l; left_ok0 fm_l key EmptyFM = True; left_ok0 fm_l key (Branch left_key _ _ _ _) = let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key; left_size = sizeFM fm_l; right_ok = right_ok0 fm_r key fm_r; right_ok0 fm_r key EmptyFM = True; right_ok0 fm_r key (Branch right_key _ _ _ _) = let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key; right_size = sizeFM fm_r; unbox :: Int -> Int; unbox x = x; }; sIZE_RATIO :: Int; sIZE_RATIO = 5; sizeFM :: FiniteMap b a -> Int; sizeFM EmptyFM = 0; sizeFM (Branch _ _ size _ _) = size; } module Maybe where { import qualified FiniteMap; import qualified Main; import qualified Prelude; } module Main where { import qualified FiniteMap; import qualified Maybe; import qualified Prelude; } ---------------------------------------- (5) BR (EQUIVALENT) Replaced joker patterns by fresh variables and removed binding patterns. ---------------------------------------- (6) Obligation: mainModule Main module FiniteMap where { import qualified Main; import qualified Maybe; import qualified Prelude; data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b) ; instance (Eq a, Eq b) => Eq FiniteMap b a where { } delFromFM :: Ord a => FiniteMap a b -> a -> FiniteMap a b; delFromFM EmptyFM del_key = emptyFM; delFromFM (Branch key elt size fm_l fm_r) del_key | del_key > key = mkBalBranch key elt fm_l (delFromFM fm_r del_key) | del_key < key = mkBalBranch key elt (delFromFM fm_l del_key) fm_r | key == del_key = glueBal fm_l fm_r; delListFromFM :: Ord a => FiniteMap a b -> [a] -> FiniteMap a b; delListFromFM fm keys = foldl delFromFM fm keys; deleteMax :: Ord a => FiniteMap a b -> FiniteMap a b; deleteMax (Branch key elt xx fm_l EmptyFM) = fm_l; deleteMax (Branch key elt xy fm_l fm_r) = mkBalBranch key elt fm_l (deleteMax fm_r); deleteMin :: Ord b => FiniteMap b a -> FiniteMap b a; deleteMin (Branch key elt xz EmptyFM fm_r) = fm_r; deleteMin (Branch key elt yu fm_l fm_r) = mkBalBranch key elt (deleteMin fm_l) fm_r; emptyFM :: FiniteMap b a; emptyFM = EmptyFM; findMax :: FiniteMap b a -> (b,a); findMax (Branch key elt vuv vuw EmptyFM) = (key,elt); findMax (Branch key elt vux vuy fm_r) = findMax fm_r; findMin :: FiniteMap b a -> (b,a); findMin (Branch key elt yv EmptyFM yw) = (key,elt); findMin (Branch key elt yx fm_l yy) = findMin fm_l; glueBal :: Ord b => FiniteMap b a -> FiniteMap b a -> FiniteMap b a; glueBal EmptyFM fm2 = fm2; glueBal fm1 EmptyFM = fm1; glueBal fm1 fm2 | sizeFM fm2 > sizeFM fm1 = mkBalBranch mid_key2 mid_elt2 fm1 (deleteMin fm2) | otherwise = mkBalBranch mid_key1 mid_elt1 (deleteMax fm1) fm2 where { mid_elt1 = mid_elt10 vv2; mid_elt10 (ww,mid_elt1) = mid_elt1; mid_elt2 = mid_elt20 vv3; mid_elt20 (wv,mid_elt2) = mid_elt2; mid_key1 = mid_key10 vv2; mid_key10 (mid_key1,wx) = mid_key1; mid_key2 = mid_key20 vv3; mid_key20 (mid_key2,wy) = mid_key2; vv2 = findMax fm1; vv3 = findMin fm2; }; mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; mkBalBranch key elt fm_L fm_R | size_l + size_r < 2 = mkBranch 1 key elt fm_L fm_R | size_r > sIZE_RATIO * size_l = mkBalBranch0 fm_L fm_R fm_R | size_l > sIZE_RATIO * size_r = mkBalBranch1 fm_L fm_R fm_L | otherwise = mkBranch 2 key elt fm_L fm_R where { double_L fm_l (Branch key_r elt_r vvz (Branch key_rl elt_rl vwu 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); double_R (Branch key_l elt_l vvu fm_ll (Branch key_lr elt_lr vvv 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); mkBalBranch0 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) | sizeFM fm_rl < 2 * sizeFM fm_rr = single_L fm_L fm_R | otherwise = double_L fm_L fm_R; mkBalBranch1 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) | sizeFM fm_lr < 2 * sizeFM fm_ll = single_R fm_L fm_R | otherwise = double_R fm_L fm_R; single_L fm_l (Branch key_r elt_r vwy fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; single_R (Branch key_l elt_l vuz fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); size_l = sizeFM fm_L; size_r = sizeFM fm_R; }; mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; mkBranch which key elt fm_l fm_r = let { result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; } in result where { balance_ok = True; left_ok = left_ok0 fm_l key fm_l; left_ok0 fm_l key EmptyFM = True; left_ok0 fm_l key (Branch left_key yz zu zv zw) = let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key; left_size = sizeFM fm_l; right_ok = right_ok0 fm_r key fm_r; right_ok0 fm_r key EmptyFM = True; right_ok0 fm_r key (Branch right_key zx zy zz vuu) = let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key; right_size = sizeFM fm_r; unbox :: Int -> Int; unbox x = x; }; sIZE_RATIO :: Int; sIZE_RATIO = 5; sizeFM :: FiniteMap b a -> Int; sizeFM EmptyFM = 0; sizeFM (Branch wz xu size xv xw) = size; } module Maybe where { import qualified FiniteMap; import qualified Main; import qualified Prelude; } module Main where { import qualified FiniteMap; import qualified Maybe; import qualified Prelude; } ---------------------------------------- (7) COR (EQUIVALENT) Cond Reductions: The following Function with conditions "undefined |Falseundefined; " is transformed to "undefined = undefined1; " "undefined0 True = undefined; " "undefined1 = undefined0 False; " The following Function with conditions "glueBal EmptyFM fm2 = fm2; glueBal fm1 EmptyFM = fm1; glueBal fm1 fm2|sizeFM fm2 > sizeFM fm1mkBalBranch mid_key2 mid_elt2 fm1 (deleteMin fm2)|otherwisemkBalBranch mid_key1 mid_elt1 (deleteMax fm1) fm2 where { mid_elt1 = mid_elt10 vv2; ; mid_elt10 (ww,mid_elt1) = mid_elt1; ; mid_elt2 = mid_elt20 vv3; ; mid_elt20 (wv,mid_elt2) = mid_elt2; ; mid_key1 = mid_key10 vv2; ; mid_key10 (mid_key1,wx) = mid_key1; ; mid_key2 = mid_key20 vv3; ; mid_key20 (mid_key2,wy) = mid_key2; ; vv2 = findMax fm1; ; vv3 = findMin fm2; } ; " is transformed to "glueBal EmptyFM fm2 = glueBal4 EmptyFM fm2; glueBal fm1 EmptyFM = glueBal3 fm1 EmptyFM; glueBal fm1 fm2 = glueBal2 fm1 fm2; " "glueBal2 fm1 fm2 = glueBal1 fm1 fm2 (sizeFM fm2 > sizeFM fm1) where { glueBal0 fm1 fm2 True = mkBalBranch mid_key1 mid_elt1 (deleteMax fm1) fm2; ; glueBal1 fm1 fm2 True = mkBalBranch mid_key2 mid_elt2 fm1 (deleteMin fm2); glueBal1 fm1 fm2 False = glueBal0 fm1 fm2 otherwise; ; mid_elt1 = mid_elt10 vv2; ; mid_elt10 (ww,mid_elt1) = mid_elt1; ; mid_elt2 = mid_elt20 vv3; ; mid_elt20 (wv,mid_elt2) = mid_elt2; ; mid_key1 = mid_key10 vv2; ; mid_key10 (mid_key1,wx) = mid_key1; ; mid_key2 = mid_key20 vv3; ; mid_key20 (mid_key2,wy) = mid_key2; ; vv2 = findMax fm1; ; vv3 = findMin fm2; } ; " "glueBal3 fm1 EmptyFM = fm1; glueBal3 vxu vxv = glueBal2 vxu vxv; " "glueBal4 EmptyFM fm2 = fm2; glueBal4 vxx vxy = glueBal3 vxx vxy; " The following Function with conditions "delFromFM EmptyFM del_key = emptyFM; delFromFM (Branch key elt size fm_l fm_r) del_key|del_key > keymkBalBranch key elt fm_l (delFromFM fm_r del_key)|del_key < keymkBalBranch key elt (delFromFM fm_l del_key) fm_r|key == del_keyglueBal fm_l fm_r; " is transformed to "delFromFM EmptyFM del_key = delFromFM4 EmptyFM del_key; delFromFM (Branch key elt size fm_l fm_r) del_key = delFromFM3 (Branch key elt size fm_l fm_r) del_key; " "delFromFM0 key elt size fm_l fm_r del_key True = glueBal fm_l fm_r; " "delFromFM1 key elt size fm_l fm_r del_key True = mkBalBranch key elt (delFromFM fm_l del_key) fm_r; delFromFM1 key elt size fm_l fm_r del_key False = delFromFM0 key elt size fm_l fm_r del_key (key == del_key); " "delFromFM2 key elt size fm_l fm_r del_key True = mkBalBranch key elt fm_l (delFromFM fm_r del_key); delFromFM2 key elt size fm_l fm_r del_key False = delFromFM1 key elt size fm_l fm_r del_key (del_key < key); " "delFromFM3 (Branch key elt size fm_l fm_r) del_key = delFromFM2 key elt size fm_l fm_r del_key (del_key > key); " "delFromFM4 EmptyFM del_key = emptyFM; delFromFM4 vyv vyw = delFromFM3 vyv vyw; " The following Function with conditions "mkBalBranch1 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr)|sizeFM fm_lr < 2 * sizeFM fm_llsingle_R fm_L fm_R|otherwisedouble_R fm_L fm_R; " is transformed to "mkBalBranch1 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch12 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr); " "mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr True = single_R fm_L fm_R; mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr False = mkBalBranch10 fm_L fm_R vvw vvx vvy fm_ll fm_lr otherwise; " "mkBalBranch10 fm_L fm_R vvw vvx vvy fm_ll fm_lr True = double_R fm_L fm_R; " "mkBalBranch12 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); " The following Function with conditions "mkBalBranch0 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr)|sizeFM fm_rl < 2 * sizeFM fm_rrsingle_L fm_L fm_R|otherwisedouble_L fm_L fm_R; " is transformed to "mkBalBranch0 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch02 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr); " "mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr True = single_L fm_L fm_R; mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr False = mkBalBranch00 fm_L fm_R vwv vww vwx fm_rl fm_rr otherwise; " "mkBalBranch00 fm_L fm_R vwv vww vwx fm_rl fm_rr True = double_L fm_L fm_R; " "mkBalBranch02 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); " The following Function with conditions "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 { double_L fm_l (Branch key_r elt_r vvz (Branch key_rl elt_rl vwu 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); ; double_R (Branch key_l elt_l vvu fm_ll (Branch key_lr elt_lr vvv 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); ; mkBalBranch0 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr)|sizeFM fm_rl < 2 * sizeFM fm_rrsingle_L fm_L fm_R|otherwisedouble_L fm_L fm_R; ; mkBalBranch1 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr)|sizeFM fm_lr < 2 * sizeFM fm_llsingle_R fm_L fm_R|otherwisedouble_R fm_L fm_R; ; single_L fm_l (Branch key_r elt_r vwy fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; ; single_R (Branch key_l elt_l vuz fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); ; size_l = sizeFM fm_L; ; size_r = sizeFM fm_R; } ; " is transformed to "mkBalBranch key elt fm_L fm_R = mkBalBranch6 key elt fm_L fm_R; " "mkBalBranch6 key elt fm_L fm_R = mkBalBranch5 key elt fm_L fm_R (size_l + size_r < 2) where { double_L fm_l (Branch key_r elt_r vvz (Branch key_rl elt_rl vwu 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); ; double_R (Branch key_l elt_l vvu fm_ll (Branch key_lr elt_lr vvv 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); ; mkBalBranch0 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch02 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr); ; mkBalBranch00 fm_L fm_R vwv vww vwx fm_rl fm_rr True = double_L fm_L fm_R; ; mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr True = single_L fm_L fm_R; mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr False = mkBalBranch00 fm_L fm_R vwv vww vwx fm_rl fm_rr otherwise; ; mkBalBranch02 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); ; mkBalBranch1 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch12 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr); ; mkBalBranch10 fm_L fm_R vvw vvx vvy fm_ll fm_lr True = double_R fm_L fm_R; ; mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr True = single_R fm_L fm_R; mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr False = mkBalBranch10 fm_L fm_R vvw vvx vvy fm_ll fm_lr otherwise; ; mkBalBranch12 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); ; mkBalBranch2 key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; ; mkBalBranch3 key elt fm_L fm_R True = mkBalBranch1 fm_L fm_R fm_L; mkBalBranch3 key elt fm_L fm_R False = mkBalBranch2 key elt fm_L fm_R otherwise; ; mkBalBranch4 key elt fm_L fm_R True = mkBalBranch0 fm_L fm_R fm_R; mkBalBranch4 key elt fm_L fm_R False = mkBalBranch3 key elt fm_L fm_R (size_l > sIZE_RATIO * size_r); ; mkBalBranch5 key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; mkBalBranch5 key elt fm_L fm_R False = mkBalBranch4 key elt fm_L fm_R (size_r > sIZE_RATIO * size_l); ; single_L fm_l (Branch key_r elt_r vwy fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; ; single_R (Branch key_l elt_l vuz fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); ; size_l = sizeFM fm_L; ; size_r = sizeFM fm_R; } ; " ---------------------------------------- (8) Obligation: mainModule Main module FiniteMap where { import qualified Main; import qualified Maybe; import qualified Prelude; data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b) ; instance (Eq a, Eq b) => Eq FiniteMap b a where { } delFromFM :: Ord b => FiniteMap b a -> b -> FiniteMap b a; delFromFM EmptyFM del_key = delFromFM4 EmptyFM del_key; delFromFM (Branch key elt size fm_l fm_r) del_key = delFromFM3 (Branch key elt size fm_l fm_r) del_key; delFromFM0 key elt size fm_l fm_r del_key True = glueBal fm_l fm_r; delFromFM1 key elt size fm_l fm_r del_key True = mkBalBranch key elt (delFromFM fm_l del_key) fm_r; delFromFM1 key elt size fm_l fm_r del_key False = delFromFM0 key elt size fm_l fm_r del_key (key == del_key); delFromFM2 key elt size fm_l fm_r del_key True = mkBalBranch key elt fm_l (delFromFM fm_r del_key); delFromFM2 key elt size fm_l fm_r del_key False = delFromFM1 key elt size fm_l fm_r del_key (del_key < key); delFromFM3 (Branch key elt size fm_l fm_r) del_key = delFromFM2 key elt size fm_l fm_r del_key (del_key > key); delFromFM4 EmptyFM del_key = emptyFM; delFromFM4 vyv vyw = delFromFM3 vyv vyw; delListFromFM :: Ord b => FiniteMap b a -> [b] -> FiniteMap b a; delListFromFM fm keys = foldl delFromFM fm keys; deleteMax :: Ord a => FiniteMap a b -> FiniteMap a b; deleteMax (Branch key elt xx fm_l EmptyFM) = fm_l; deleteMax (Branch key elt xy fm_l fm_r) = mkBalBranch key elt fm_l (deleteMax fm_r); deleteMin :: Ord b => FiniteMap b a -> FiniteMap b a; deleteMin (Branch key elt xz EmptyFM fm_r) = fm_r; deleteMin (Branch key elt yu fm_l fm_r) = mkBalBranch key elt (deleteMin fm_l) fm_r; emptyFM :: FiniteMap a b; emptyFM = EmptyFM; findMax :: FiniteMap b a -> (b,a); findMax (Branch key elt vuv vuw EmptyFM) = (key,elt); findMax (Branch key elt vux vuy fm_r) = findMax fm_r; findMin :: FiniteMap a b -> (a,b); findMin (Branch key elt yv EmptyFM yw) = (key,elt); findMin (Branch key elt yx fm_l yy) = findMin fm_l; glueBal :: Ord b => FiniteMap b a -> FiniteMap b a -> FiniteMap b a; glueBal EmptyFM fm2 = glueBal4 EmptyFM fm2; glueBal fm1 EmptyFM = glueBal3 fm1 EmptyFM; glueBal fm1 fm2 = glueBal2 fm1 fm2; glueBal2 fm1 fm2 = glueBal1 fm1 fm2 (sizeFM fm2 > sizeFM fm1) where { glueBal0 fm1 fm2 True = mkBalBranch mid_key1 mid_elt1 (deleteMax fm1) fm2; glueBal1 fm1 fm2 True = mkBalBranch mid_key2 mid_elt2 fm1 (deleteMin fm2); glueBal1 fm1 fm2 False = glueBal0 fm1 fm2 otherwise; mid_elt1 = mid_elt10 vv2; mid_elt10 (ww,mid_elt1) = mid_elt1; mid_elt2 = mid_elt20 vv3; mid_elt20 (wv,mid_elt2) = mid_elt2; mid_key1 = mid_key10 vv2; mid_key10 (mid_key1,wx) = mid_key1; mid_key2 = mid_key20 vv3; mid_key20 (mid_key2,wy) = mid_key2; vv2 = findMax fm1; vv3 = findMin fm2; }; glueBal3 fm1 EmptyFM = fm1; glueBal3 vxu vxv = glueBal2 vxu vxv; glueBal4 EmptyFM fm2 = fm2; glueBal4 vxx vxy = glueBal3 vxx vxy; mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; mkBalBranch key elt fm_L fm_R = mkBalBranch6 key elt fm_L fm_R; mkBalBranch6 key elt fm_L fm_R = mkBalBranch5 key elt fm_L fm_R (size_l + size_r < 2) where { double_L fm_l (Branch key_r elt_r vvz (Branch key_rl elt_rl vwu 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); double_R (Branch key_l elt_l vvu fm_ll (Branch key_lr elt_lr vvv 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); mkBalBranch0 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch02 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr); mkBalBranch00 fm_L fm_R vwv vww vwx fm_rl fm_rr True = double_L fm_L fm_R; mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr True = single_L fm_L fm_R; mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr False = mkBalBranch00 fm_L fm_R vwv vww vwx fm_rl fm_rr otherwise; mkBalBranch02 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); mkBalBranch1 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch12 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr); mkBalBranch10 fm_L fm_R vvw vvx vvy fm_ll fm_lr True = double_R fm_L fm_R; mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr True = single_R fm_L fm_R; mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr False = mkBalBranch10 fm_L fm_R vvw vvx vvy fm_ll fm_lr otherwise; mkBalBranch12 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); mkBalBranch2 key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; mkBalBranch3 key elt fm_L fm_R True = mkBalBranch1 fm_L fm_R fm_L; mkBalBranch3 key elt fm_L fm_R False = mkBalBranch2 key elt fm_L fm_R otherwise; mkBalBranch4 key elt fm_L fm_R True = mkBalBranch0 fm_L fm_R fm_R; mkBalBranch4 key elt fm_L fm_R False = mkBalBranch3 key elt fm_L fm_R (size_l > sIZE_RATIO * size_r); mkBalBranch5 key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; mkBalBranch5 key elt fm_L fm_R False = mkBalBranch4 key elt fm_L fm_R (size_r > sIZE_RATIO * size_l); single_L fm_l (Branch key_r elt_r vwy fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; single_R (Branch key_l elt_l vuz fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); size_l = sizeFM fm_L; size_r = sizeFM fm_R; }; mkBranch :: Ord b => Int -> b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; mkBranch which key elt fm_l fm_r = let { result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; } in result where { balance_ok = True; left_ok = left_ok0 fm_l key fm_l; left_ok0 fm_l key EmptyFM = True; left_ok0 fm_l key (Branch left_key yz zu zv zw) = let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key; left_size = sizeFM fm_l; right_ok = right_ok0 fm_r key fm_r; right_ok0 fm_r key EmptyFM = True; right_ok0 fm_r key (Branch right_key zx zy zz vuu) = let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key; right_size = sizeFM fm_r; unbox :: Int -> Int; unbox x = x; }; sIZE_RATIO :: Int; sIZE_RATIO = 5; sizeFM :: FiniteMap a b -> Int; sizeFM EmptyFM = 0; sizeFM (Branch wz xu size xv xw) = size; } module Maybe where { import qualified FiniteMap; import qualified Main; import qualified Prelude; } module Main where { import qualified FiniteMap; import qualified Maybe; import qualified Prelude; } ---------------------------------------- (9) LetRed (EQUIVALENT) Let/Where Reductions: The bindings of the following Let/Where expression "mkBalBranch5 key elt fm_L fm_R (size_l + size_r < 2) where { double_L fm_l (Branch key_r elt_r vvz (Branch key_rl elt_rl vwu 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); ; double_R (Branch key_l elt_l vvu fm_ll (Branch key_lr elt_lr vvv 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); ; mkBalBranch0 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch02 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr); ; mkBalBranch00 fm_L fm_R vwv vww vwx fm_rl fm_rr True = double_L fm_L fm_R; ; mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr True = single_L fm_L fm_R; mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr False = mkBalBranch00 fm_L fm_R vwv vww vwx fm_rl fm_rr otherwise; ; mkBalBranch02 fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch01 fm_L fm_R vwv vww vwx fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); ; mkBalBranch1 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch12 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr); ; mkBalBranch10 fm_L fm_R vvw vvx vvy fm_ll fm_lr True = double_R fm_L fm_R; ; mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr True = single_R fm_L fm_R; mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr False = mkBalBranch10 fm_L fm_R vvw vvx vvy fm_ll fm_lr otherwise; ; mkBalBranch12 fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch11 fm_L fm_R vvw vvx vvy fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); ; mkBalBranch2 key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; ; mkBalBranch3 key elt fm_L fm_R True = mkBalBranch1 fm_L fm_R fm_L; mkBalBranch3 key elt fm_L fm_R False = mkBalBranch2 key elt fm_L fm_R otherwise; ; mkBalBranch4 key elt fm_L fm_R True = mkBalBranch0 fm_L fm_R fm_R; mkBalBranch4 key elt fm_L fm_R False = mkBalBranch3 key elt fm_L fm_R (size_l > sIZE_RATIO * size_r); ; mkBalBranch5 key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; mkBalBranch5 key elt fm_L fm_R False = mkBalBranch4 key elt fm_L fm_R (size_r > sIZE_RATIO * size_l); ; single_L fm_l (Branch key_r elt_r vwy fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr; ; single_R (Branch key_l elt_l vuz fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r); ; size_l = sizeFM fm_L; ; size_r = sizeFM fm_R; } " are unpacked to the following functions on top level "mkBalBranch6MkBalBranch2 vyz vzu vzv vzw key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; " "mkBalBranch6MkBalBranch1 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch6MkBalBranch12 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr); " "mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R True = mkBalBranch6MkBalBranch0 vyz vzu vzv vzw fm_L fm_R fm_R; mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R (mkBalBranch6Size_l vyz vzu vzv vzw > sIZE_RATIO * mkBalBranch6Size_r vyz vzu vzv vzw); " "mkBalBranch6MkBalBranch00 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr True = mkBalBranch6Double_L vyz vzu vzv vzw fm_L fm_R; " "mkBalBranch6MkBalBranch0 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch6MkBalBranch02 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr); " "mkBalBranch6MkBalBranch12 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); " "mkBalBranch6Size_r vyz vzu vzv vzw = sizeFM vyz; " "mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr True = mkBalBranch6Single_R vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr False = mkBalBranch6MkBalBranch10 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr otherwise; " "mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr True = mkBalBranch6Single_L vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr False = mkBalBranch6MkBalBranch00 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr otherwise; " "mkBalBranch6Single_R vyz vzu vzv vzw (Branch key_l elt_l vuz fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 vzu vzv fm_lr fm_r); " "mkBalBranch6MkBalBranch5 vyz vzu vzv vzw key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; mkBalBranch6MkBalBranch5 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R (mkBalBranch6Size_r vyz vzu vzv vzw > sIZE_RATIO * mkBalBranch6Size_l vyz vzu vzv vzw); " "mkBalBranch6Single_L vyz vzu vzv vzw fm_l (Branch key_r elt_r vwy fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 vzu vzv fm_l fm_rl) fm_rr; " "mkBalBranch6Double_L vyz vzu vzv vzw fm_l (Branch key_r elt_r vvz (Branch key_rl elt_rl vwu fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 vzu vzv fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); " "mkBalBranch6Size_l vyz vzu vzv vzw = sizeFM vzw; " "mkBalBranch6MkBalBranch10 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr True = mkBalBranch6Double_R vyz vzu vzv vzw fm_L fm_R; " "mkBalBranch6Double_R vyz vzu vzv vzw (Branch key_l elt_l vvu fm_ll (Branch key_lr elt_lr vvv fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 vzu vzv fm_lrr fm_r); " "mkBalBranch6MkBalBranch02 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); " "mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R True = mkBalBranch6MkBalBranch1 vyz vzu vzv vzw fm_L fm_R fm_L; mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch2 vyz vzu vzv vzw key elt fm_L fm_R otherwise; " The bindings of the following Let/Where expression "let { result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; } in result where { balance_ok = True; ; left_ok = left_ok0 fm_l key fm_l; ; left_ok0 fm_l key EmptyFM = True; left_ok0 fm_l key (Branch left_key yz zu zv zw) = let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key; ; left_size = sizeFM fm_l; ; right_ok = right_ok0 fm_r key fm_r; ; right_ok0 fm_r key EmptyFM = True; right_ok0 fm_r key (Branch right_key zx zy zz vuu) = let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key; ; right_size = sizeFM fm_r; ; unbox x = x; } " are unpacked to the following functions on top level "mkBranchRight_ok0 vzx vzy vzz fm_r key EmptyFM = True; mkBranchRight_ok0 vzx vzy vzz fm_r key (Branch right_key zx zy zz vuu) = key < mkBranchRight_ok0Smallest_right_key fm_r; " "mkBranchRight_size vzx vzy vzz = sizeFM vzx; " "mkBranchLeft_ok vzx vzy vzz = mkBranchLeft_ok0 vzx vzy vzz vzy vzz vzy; " "mkBranchLeft_size vzx vzy vzz = sizeFM vzy; " "mkBranchRight_ok vzx vzy vzz = mkBranchRight_ok0 vzx vzy vzz vzx vzz vzx; " "mkBranchLeft_ok0 vzx vzy vzz fm_l key EmptyFM = True; mkBranchLeft_ok0 vzx vzy vzz fm_l key (Branch left_key yz zu zv zw) = mkBranchLeft_ok0Biggest_left_key fm_l < key; " "mkBranchBalance_ok vzx vzy vzz = True; " "mkBranchUnbox vzx vzy vzz x = x; " The bindings of the following Let/Where expression "let { result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r; } in result" are unpacked to the following functions on top level "mkBranchResult wuu wuv wuw wux = Branch wuu wuv (mkBranchUnbox wuw wux wuu (1 + mkBranchLeft_size wuw wux wuu + mkBranchRight_size wuw wux wuu)) wux wuw; " The bindings of the following Let/Where expression "glueBal1 fm1 fm2 (sizeFM fm2 > sizeFM fm1) where { glueBal0 fm1 fm2 True = mkBalBranch mid_key1 mid_elt1 (deleteMax fm1) fm2; ; glueBal1 fm1 fm2 True = mkBalBranch mid_key2 mid_elt2 fm1 (deleteMin fm2); glueBal1 fm1 fm2 False = glueBal0 fm1 fm2 otherwise; ; mid_elt1 = mid_elt10 vv2; ; mid_elt10 (ww,mid_elt1) = mid_elt1; ; mid_elt2 = mid_elt20 vv3; ; mid_elt20 (wv,mid_elt2) = mid_elt2; ; mid_key1 = mid_key10 vv2; ; mid_key10 (mid_key1,wx) = mid_key1; ; mid_key2 = mid_key20 vv3; ; mid_key20 (mid_key2,wy) = mid_key2; ; vv2 = findMax fm1; ; vv3 = findMin fm2; } " are unpacked to the following functions on top level "glueBal2Mid_elt2 wuy wuz = glueBal2Mid_elt20 wuy wuz (glueBal2Vv3 wuy wuz); " "glueBal2Mid_elt1 wuy wuz = glueBal2Mid_elt10 wuy wuz (glueBal2Vv2 wuy wuz); " "glueBal2Mid_elt20 wuy wuz (wv,mid_elt2) = mid_elt2; " "glueBal2GlueBal1 wuy wuz fm1 fm2 True = mkBalBranch (glueBal2Mid_key2 wuy wuz) (glueBal2Mid_elt2 wuy wuz) fm1 (deleteMin fm2); glueBal2GlueBal1 wuy wuz fm1 fm2 False = glueBal2GlueBal0 wuy wuz fm1 fm2 otherwise; " "glueBal2GlueBal0 wuy wuz fm1 fm2 True = mkBalBranch (glueBal2Mid_key1 wuy wuz) (glueBal2Mid_elt1 wuy wuz) (deleteMax fm1) fm2; " "glueBal2Mid_key10 wuy wuz (mid_key1,wx) = mid_key1; " "glueBal2Vv2 wuy wuz = findMax wuy; " "glueBal2Vv3 wuy wuz = findMin wuz; " "glueBal2Mid_key1 wuy wuz = glueBal2Mid_key10 wuy wuz (glueBal2Vv2 wuy wuz); " "glueBal2Mid_key2 wuy wuz = glueBal2Mid_key20 wuy wuz (glueBal2Vv3 wuy wuz); " "glueBal2Mid_elt10 wuy wuz (ww,mid_elt1) = mid_elt1; " "glueBal2Mid_key20 wuy wuz (mid_key2,wy) = mid_key2; " The bindings of the following Let/Where expression "let { smallest_right_key = fst (findMin fm_r); } in key < smallest_right_key" are unpacked to the following functions on top level "mkBranchRight_ok0Smallest_right_key wvu = fst (findMin wvu); " The bindings of the following Let/Where expression "let { biggest_left_key = fst (findMax fm_l); } in biggest_left_key < key" are unpacked to the following functions on top level "mkBranchLeft_ok0Biggest_left_key wvv = fst (findMax wvv); " ---------------------------------------- (10) Obligation: mainModule Main module FiniteMap where { import qualified Main; import qualified Maybe; import qualified Prelude; data FiniteMap b a = EmptyFM | Branch b a Int (FiniteMap b a) (FiniteMap b a) ; instance (Eq a, Eq b) => Eq FiniteMap a b where { } delFromFM :: Ord a => FiniteMap a b -> a -> FiniteMap a b; delFromFM EmptyFM del_key = delFromFM4 EmptyFM del_key; delFromFM (Branch key elt size fm_l fm_r) del_key = delFromFM3 (Branch key elt size fm_l fm_r) del_key; delFromFM0 key elt size fm_l fm_r del_key True = glueBal fm_l fm_r; delFromFM1 key elt size fm_l fm_r del_key True = mkBalBranch key elt (delFromFM fm_l del_key) fm_r; delFromFM1 key elt size fm_l fm_r del_key False = delFromFM0 key elt size fm_l fm_r del_key (key == del_key); delFromFM2 key elt size fm_l fm_r del_key True = mkBalBranch key elt fm_l (delFromFM fm_r del_key); delFromFM2 key elt size fm_l fm_r del_key False = delFromFM1 key elt size fm_l fm_r del_key (del_key < key); delFromFM3 (Branch key elt size fm_l fm_r) del_key = delFromFM2 key elt size fm_l fm_r del_key (del_key > key); delFromFM4 EmptyFM del_key = emptyFM; delFromFM4 vyv vyw = delFromFM3 vyv vyw; delListFromFM :: Ord a => FiniteMap a b -> [a] -> FiniteMap a b; delListFromFM fm keys = foldl delFromFM fm keys; deleteMax :: Ord a => FiniteMap a b -> FiniteMap a b; deleteMax (Branch key elt xx fm_l EmptyFM) = fm_l; deleteMax (Branch key elt xy fm_l fm_r) = mkBalBranch key elt fm_l (deleteMax fm_r); deleteMin :: Ord b => FiniteMap b a -> FiniteMap b a; deleteMin (Branch key elt xz EmptyFM fm_r) = fm_r; deleteMin (Branch key elt yu fm_l fm_r) = mkBalBranch key elt (deleteMin fm_l) fm_r; emptyFM :: FiniteMap a b; emptyFM = EmptyFM; findMax :: FiniteMap b a -> (b,a); findMax (Branch key elt vuv vuw EmptyFM) = (key,elt); findMax (Branch key elt vux vuy fm_r) = findMax fm_r; findMin :: FiniteMap a b -> (a,b); findMin (Branch key elt yv EmptyFM yw) = (key,elt); findMin (Branch key elt yx fm_l yy) = findMin fm_l; glueBal :: Ord b => FiniteMap b a -> FiniteMap b a -> FiniteMap b a; glueBal EmptyFM fm2 = glueBal4 EmptyFM fm2; glueBal fm1 EmptyFM = glueBal3 fm1 EmptyFM; glueBal fm1 fm2 = glueBal2 fm1 fm2; glueBal2 fm1 fm2 = glueBal2GlueBal1 fm1 fm2 fm1 fm2 (sizeFM fm2 > sizeFM fm1); glueBal2GlueBal0 wuy wuz fm1 fm2 True = mkBalBranch (glueBal2Mid_key1 wuy wuz) (glueBal2Mid_elt1 wuy wuz) (deleteMax fm1) fm2; glueBal2GlueBal1 wuy wuz fm1 fm2 True = mkBalBranch (glueBal2Mid_key2 wuy wuz) (glueBal2Mid_elt2 wuy wuz) fm1 (deleteMin fm2); glueBal2GlueBal1 wuy wuz fm1 fm2 False = glueBal2GlueBal0 wuy wuz fm1 fm2 otherwise; glueBal2Mid_elt1 wuy wuz = glueBal2Mid_elt10 wuy wuz (glueBal2Vv2 wuy wuz); glueBal2Mid_elt10 wuy wuz (ww,mid_elt1) = mid_elt1; glueBal2Mid_elt2 wuy wuz = glueBal2Mid_elt20 wuy wuz (glueBal2Vv3 wuy wuz); glueBal2Mid_elt20 wuy wuz (wv,mid_elt2) = mid_elt2; glueBal2Mid_key1 wuy wuz = glueBal2Mid_key10 wuy wuz (glueBal2Vv2 wuy wuz); glueBal2Mid_key10 wuy wuz (mid_key1,wx) = mid_key1; glueBal2Mid_key2 wuy wuz = glueBal2Mid_key20 wuy wuz (glueBal2Vv3 wuy wuz); glueBal2Mid_key20 wuy wuz (mid_key2,wy) = mid_key2; glueBal2Vv2 wuy wuz = findMax wuy; glueBal2Vv3 wuy wuz = findMin wuz; glueBal3 fm1 EmptyFM = fm1; glueBal3 vxu vxv = glueBal2 vxu vxv; glueBal4 EmptyFM fm2 = fm2; glueBal4 vxx vxy = glueBal3 vxx vxy; mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b; mkBalBranch key elt fm_L fm_R = mkBalBranch6 key elt fm_L fm_R; mkBalBranch6 key elt fm_L fm_R = mkBalBranch6MkBalBranch5 fm_R key elt fm_L key elt fm_L fm_R (mkBalBranch6Size_l fm_R key elt fm_L + mkBalBranch6Size_r fm_R key elt fm_L < 2); mkBalBranch6Double_L vyz vzu vzv vzw fm_l (Branch key_r elt_r vvz (Branch key_rl elt_rl vwu fm_rll fm_rlr) fm_rr) = mkBranch 5 key_rl elt_rl (mkBranch 6 vzu vzv fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr); mkBalBranch6Double_R vyz vzu vzv vzw (Branch key_l elt_l vvu fm_ll (Branch key_lr elt_lr vvv fm_lrl fm_lrr)) fm_r = mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 vzu vzv fm_lrr fm_r); mkBalBranch6MkBalBranch0 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch6MkBalBranch02 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr); mkBalBranch6MkBalBranch00 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr True = mkBalBranch6Double_L vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr True = mkBalBranch6Single_L vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr False = mkBalBranch6MkBalBranch00 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr otherwise; mkBalBranch6MkBalBranch02 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr); mkBalBranch6MkBalBranch1 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch6MkBalBranch12 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr); mkBalBranch6MkBalBranch10 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr True = mkBalBranch6Double_R vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr True = mkBalBranch6Single_R vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr False = mkBalBranch6MkBalBranch10 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr otherwise; mkBalBranch6MkBalBranch12 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll); mkBalBranch6MkBalBranch2 vyz vzu vzv vzw key elt fm_L fm_R True = mkBranch 2 key elt fm_L fm_R; mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R True = mkBalBranch6MkBalBranch1 vyz vzu vzv vzw fm_L fm_R fm_L; mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch2 vyz vzu vzv vzw key elt fm_L fm_R otherwise; mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R True = mkBalBranch6MkBalBranch0 vyz vzu vzv vzw fm_L fm_R fm_R; mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R (mkBalBranch6Size_l vyz vzu vzv vzw > sIZE_RATIO * mkBalBranch6Size_r vyz vzu vzv vzw); mkBalBranch6MkBalBranch5 vyz vzu vzv vzw key elt fm_L fm_R True = mkBranch 1 key elt fm_L fm_R; mkBalBranch6MkBalBranch5 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R (mkBalBranch6Size_r vyz vzu vzv vzw > sIZE_RATIO * mkBalBranch6Size_l vyz vzu vzv vzw); mkBalBranch6Single_L vyz vzu vzv vzw fm_l (Branch key_r elt_r vwy fm_rl fm_rr) = mkBranch 3 key_r elt_r (mkBranch 4 vzu vzv fm_l fm_rl) fm_rr; mkBalBranch6Single_R vyz vzu vzv vzw (Branch key_l elt_l vuz fm_ll fm_lr) fm_r = mkBranch 8 key_l elt_l fm_ll (mkBranch 9 vzu vzv fm_lr fm_r); mkBalBranch6Size_l vyz vzu vzv vzw = sizeFM vzw; mkBalBranch6Size_r vyz vzu vzv vzw = sizeFM vyz; mkBranch :: Ord b => Int -> b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; mkBranch which key elt fm_l fm_r = mkBranchResult key elt fm_r fm_l; mkBranchBalance_ok vzx vzy vzz = True; mkBranchLeft_ok vzx vzy vzz = mkBranchLeft_ok0 vzx vzy vzz vzy vzz vzy; mkBranchLeft_ok0 vzx vzy vzz fm_l key EmptyFM = True; mkBranchLeft_ok0 vzx vzy vzz fm_l key (Branch left_key yz zu zv zw) = mkBranchLeft_ok0Biggest_left_key fm_l < key; mkBranchLeft_ok0Biggest_left_key wvv = fst (findMax wvv); mkBranchLeft_size vzx vzy vzz = sizeFM vzy; mkBranchResult wuu wuv wuw wux = Branch wuu wuv (mkBranchUnbox wuw wux wuu (1 + mkBranchLeft_size wuw wux wuu + mkBranchRight_size wuw wux wuu)) wux wuw; mkBranchRight_ok vzx vzy vzz = mkBranchRight_ok0 vzx vzy vzz vzx vzz vzx; mkBranchRight_ok0 vzx vzy vzz fm_r key EmptyFM = True; mkBranchRight_ok0 vzx vzy vzz fm_r key (Branch right_key zx zy zz vuu) = key < mkBranchRight_ok0Smallest_right_key fm_r; mkBranchRight_ok0Smallest_right_key wvu = fst (findMin wvu); mkBranchRight_size vzx vzy vzz = sizeFM vzx; mkBranchUnbox :: Ord a => -> (FiniteMap a b) ( -> (FiniteMap a b) ( -> a (Int -> Int))); mkBranchUnbox vzx vzy vzz x = x; sIZE_RATIO :: Int; sIZE_RATIO = 5; sizeFM :: FiniteMap b a -> Int; sizeFM EmptyFM = 0; sizeFM (Branch wz xu size xv xw) = size; } module Maybe where { import qualified FiniteMap; import qualified Main; import qualified Prelude; } module Main where { import qualified FiniteMap; import qualified Maybe; import qualified Prelude; } ---------------------------------------- (11) NumRed (SOUND) Num Reduction:All numbers are transformed to their corresponding representation with Succ, Pred and Zero. ---------------------------------------- (12) Obligation: mainModule Main module FiniteMap where { import qualified Main; import qualified Maybe; import qualified Prelude; data FiniteMap b a = EmptyFM | Branch b a Int (FiniteMap b a) (FiniteMap b a) ; instance (Eq a, Eq b) => Eq FiniteMap b a where { } delFromFM :: Ord b => FiniteMap b a -> b -> FiniteMap b a; delFromFM EmptyFM del_key = delFromFM4 EmptyFM del_key; delFromFM (Branch key elt size fm_l fm_r) del_key = delFromFM3 (Branch key elt size fm_l fm_r) del_key; delFromFM0 key elt size fm_l fm_r del_key True = glueBal fm_l fm_r; delFromFM1 key elt size fm_l fm_r del_key True = mkBalBranch key elt (delFromFM fm_l del_key) fm_r; delFromFM1 key elt size fm_l fm_r del_key False = delFromFM0 key elt size fm_l fm_r del_key (key == del_key); delFromFM2 key elt size fm_l fm_r del_key True = mkBalBranch key elt fm_l (delFromFM fm_r del_key); delFromFM2 key elt size fm_l fm_r del_key False = delFromFM1 key elt size fm_l fm_r del_key (del_key < key); delFromFM3 (Branch key elt size fm_l fm_r) del_key = delFromFM2 key elt size fm_l fm_r del_key (del_key > key); delFromFM4 EmptyFM del_key = emptyFM; delFromFM4 vyv vyw = delFromFM3 vyv vyw; delListFromFM :: Ord a => FiniteMap a b -> [a] -> FiniteMap a b; delListFromFM fm keys = foldl delFromFM fm keys; deleteMax :: Ord a => FiniteMap a b -> FiniteMap a b; deleteMax (Branch key elt xx fm_l EmptyFM) = fm_l; deleteMax (Branch key elt xy fm_l fm_r) = mkBalBranch key elt fm_l (deleteMax fm_r); deleteMin :: Ord a => FiniteMap a b -> FiniteMap a b; deleteMin (Branch key elt xz EmptyFM fm_r) = fm_r; deleteMin (Branch key elt yu fm_l fm_r) = mkBalBranch key elt (deleteMin fm_l) fm_r; emptyFM :: FiniteMap a b; emptyFM = EmptyFM; findMax :: FiniteMap b a -> (b,a); findMax (Branch key elt vuv vuw EmptyFM) = (key,elt); findMax (Branch key elt vux vuy fm_r) = findMax fm_r; findMin :: FiniteMap a b -> (a,b); findMin (Branch key elt yv EmptyFM yw) = (key,elt); findMin (Branch key elt yx fm_l yy) = findMin fm_l; glueBal :: Ord b => FiniteMap b a -> FiniteMap b a -> FiniteMap b a; glueBal EmptyFM fm2 = glueBal4 EmptyFM fm2; glueBal fm1 EmptyFM = glueBal3 fm1 EmptyFM; glueBal fm1 fm2 = glueBal2 fm1 fm2; glueBal2 fm1 fm2 = glueBal2GlueBal1 fm1 fm2 fm1 fm2 (sizeFM fm2 > sizeFM fm1); glueBal2GlueBal0 wuy wuz fm1 fm2 True = mkBalBranch (glueBal2Mid_key1 wuy wuz) (glueBal2Mid_elt1 wuy wuz) (deleteMax fm1) fm2; glueBal2GlueBal1 wuy wuz fm1 fm2 True = mkBalBranch (glueBal2Mid_key2 wuy wuz) (glueBal2Mid_elt2 wuy wuz) fm1 (deleteMin fm2); glueBal2GlueBal1 wuy wuz fm1 fm2 False = glueBal2GlueBal0 wuy wuz fm1 fm2 otherwise; glueBal2Mid_elt1 wuy wuz = glueBal2Mid_elt10 wuy wuz (glueBal2Vv2 wuy wuz); glueBal2Mid_elt10 wuy wuz (ww,mid_elt1) = mid_elt1; glueBal2Mid_elt2 wuy wuz = glueBal2Mid_elt20 wuy wuz (glueBal2Vv3 wuy wuz); glueBal2Mid_elt20 wuy wuz (wv,mid_elt2) = mid_elt2; glueBal2Mid_key1 wuy wuz = glueBal2Mid_key10 wuy wuz (glueBal2Vv2 wuy wuz); glueBal2Mid_key10 wuy wuz (mid_key1,wx) = mid_key1; glueBal2Mid_key2 wuy wuz = glueBal2Mid_key20 wuy wuz (glueBal2Vv3 wuy wuz); glueBal2Mid_key20 wuy wuz (mid_key2,wy) = mid_key2; glueBal2Vv2 wuy wuz = findMax wuy; glueBal2Vv3 wuy wuz = findMin wuz; glueBal3 fm1 EmptyFM = fm1; glueBal3 vxu vxv = glueBal2 vxu vxv; glueBal4 EmptyFM fm2 = fm2; glueBal4 vxx vxy = glueBal3 vxx vxy; mkBalBranch :: Ord b => b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; mkBalBranch key elt fm_L fm_R = mkBalBranch6 key elt fm_L fm_R; mkBalBranch6 key elt fm_L fm_R = mkBalBranch6MkBalBranch5 fm_R key elt fm_L key elt fm_L fm_R (mkBalBranch6Size_l fm_R key elt fm_L + mkBalBranch6Size_r fm_R key elt fm_L < Pos (Succ (Succ Zero))); mkBalBranch6Double_L vyz vzu vzv vzw fm_l (Branch key_r elt_r vvz (Branch key_rl elt_rl vwu 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))))))) vzu vzv fm_l fm_rll) (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))) key_r elt_r fm_rlr fm_rr); mkBalBranch6Double_R vyz vzu vzv vzw (Branch key_l elt_l vvu fm_ll (Branch key_lr elt_lr vvv 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))))))))))))) vzu vzv fm_lrr fm_r); mkBalBranch6MkBalBranch0 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch6MkBalBranch02 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr); mkBalBranch6MkBalBranch00 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr True = mkBalBranch6Double_L vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr True = mkBalBranch6Single_L vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr False = mkBalBranch6MkBalBranch00 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr otherwise; mkBalBranch6MkBalBranch02 vyz vzu vzv vzw fm_L fm_R (Branch vwv vww vwx fm_rl fm_rr) = mkBalBranch6MkBalBranch01 vyz vzu vzv vzw fm_L fm_R vwv vww vwx fm_rl fm_rr (sizeFM fm_rl < Pos (Succ (Succ Zero)) * sizeFM fm_rr); mkBalBranch6MkBalBranch1 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch6MkBalBranch12 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr); mkBalBranch6MkBalBranch10 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr True = mkBalBranch6Double_R vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr True = mkBalBranch6Single_R vyz vzu vzv vzw fm_L fm_R; mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr False = mkBalBranch6MkBalBranch10 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr otherwise; mkBalBranch6MkBalBranch12 vyz vzu vzv vzw fm_L fm_R (Branch vvw vvx vvy fm_ll fm_lr) = mkBalBranch6MkBalBranch11 vyz vzu vzv vzw fm_L fm_R vvw vvx vvy fm_ll fm_lr (sizeFM fm_lr < Pos (Succ (Succ Zero)) * sizeFM fm_ll); mkBalBranch6MkBalBranch2 vyz vzu vzv vzw key elt fm_L fm_R True = mkBranch (Pos (Succ (Succ Zero))) key elt fm_L fm_R; mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R True = mkBalBranch6MkBalBranch1 vyz vzu vzv vzw fm_L fm_R fm_L; mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch2 vyz vzu vzv vzw key elt fm_L fm_R otherwise; mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R True = mkBalBranch6MkBalBranch0 vyz vzu vzv vzw fm_L fm_R fm_R; mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch3 vyz vzu vzv vzw key elt fm_L fm_R (mkBalBranch6Size_l vyz vzu vzv vzw > sIZE_RATIO * mkBalBranch6Size_r vyz vzu vzv vzw); mkBalBranch6MkBalBranch5 vyz vzu vzv vzw key elt fm_L fm_R True = mkBranch (Pos (Succ Zero)) key elt fm_L fm_R; mkBalBranch6MkBalBranch5 vyz vzu vzv vzw key elt fm_L fm_R False = mkBalBranch6MkBalBranch4 vyz vzu vzv vzw key elt fm_L fm_R (mkBalBranch6Size_r vyz vzu vzv vzw > sIZE_RATIO * mkBalBranch6Size_l vyz vzu vzv vzw); mkBalBranch6Single_L vyz vzu vzv vzw fm_l (Branch key_r elt_r vwy fm_rl fm_rr) = mkBranch (Pos (Succ (Succ (Succ Zero)))) key_r elt_r (mkBranch (Pos (Succ (Succ (Succ (Succ Zero))))) vzu vzv fm_l fm_rl) fm_rr; mkBalBranch6Single_R vyz vzu vzv vzw (Branch key_l elt_l vuz 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)))))))))) vzu vzv fm_lr fm_r); mkBalBranch6Size_l vyz vzu vzv vzw = sizeFM vzw; mkBalBranch6Size_r vyz vzu vzv vzw = sizeFM vyz; mkBranch :: Ord b => Int -> b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a; mkBranch which key elt fm_l fm_r = mkBranchResult key elt fm_r fm_l; mkBranchBalance_ok vzx vzy vzz = True; mkBranchLeft_ok vzx vzy vzz = mkBranchLeft_ok0 vzx vzy vzz vzy vzz vzy; mkBranchLeft_ok0 vzx vzy vzz fm_l key EmptyFM = True; mkBranchLeft_ok0 vzx vzy vzz fm_l key (Branch left_key yz zu zv zw) = mkBranchLeft_ok0Biggest_left_key fm_l < key; mkBranchLeft_ok0Biggest_left_key wvv = fst (findMax wvv); mkBranchLeft_size vzx vzy vzz = sizeFM vzy; mkBranchResult wuu wuv wuw wux = Branch wuu wuv (mkBranchUnbox wuw wux wuu (Pos (Succ Zero) + mkBranchLeft_size wuw wux wuu + mkBranchRight_size wuw wux wuu)) wux wuw; mkBranchRight_ok vzx vzy vzz = mkBranchRight_ok0 vzx vzy vzz vzx vzz vzx; mkBranchRight_ok0 vzx vzy vzz fm_r key EmptyFM = True; mkBranchRight_ok0 vzx vzy vzz fm_r key (Branch right_key zx zy zz vuu) = key < mkBranchRight_ok0Smallest_right_key fm_r; mkBranchRight_ok0Smallest_right_key wvu = fst (findMin wvu); mkBranchRight_size vzx vzy vzz = sizeFM vzx; mkBranchUnbox :: Ord a => -> (FiniteMap a b) ( -> (FiniteMap a b) ( -> a (Int -> Int))); mkBranchUnbox vzx vzy vzz x = x; sIZE_RATIO :: Int; sIZE_RATIO = Pos (Succ (Succ (Succ (Succ (Succ Zero))))); sizeFM :: FiniteMap a b -> Int; sizeFM EmptyFM = Pos Zero; sizeFM (Branch wz xu size xv xw) = size; } module Maybe where { import qualified FiniteMap; import qualified Main; import qualified Prelude; } module Main where { import qualified FiniteMap; import qualified Maybe; import qualified Prelude; }