10.06/4.39 YES 12.18/4.99 proof of /export/starexec/sandbox/benchmark/theBenchmark.hs 12.18/4.99 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 12.18/4.99 12.18/4.99 12.18/4.99 H-Termination with start terms of the given HASKELL could be proven: 12.18/4.99 12.18/4.99 (0) HASKELL 12.18/4.99 (1) CR [EQUIVALENT, 0 ms] 12.18/4.99 (2) HASKELL 12.18/4.99 (3) BR [EQUIVALENT, 0 ms] 12.18/4.99 (4) HASKELL 12.18/4.99 (5) COR [EQUIVALENT, 0 ms] 12.18/4.99 (6) HASKELL 12.18/4.99 (7) LetRed [EQUIVALENT, 0 ms] 12.18/4.99 (8) HASKELL 12.18/4.99 (9) Narrow [SOUND, 0 ms] 12.18/4.99 (10) QDP 12.18/4.99 (11) QDPSizeChangeProof [EQUIVALENT, 0 ms] 12.18/4.99 (12) YES 12.18/4.99 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (0) 12.18/4.99 Obligation: 12.18/4.99 mainModule Main 12.18/4.99 module Maybe where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 module List where { 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 maximumBy :: (a -> a -> Ordering) -> [a] -> a; 12.18/4.99 maximumBy _ [] = error []; 12.18/4.99 maximumBy cmp xs = foldl1 max xs where { 12.18/4.99 max x y = case cmp x y of { 12.18/4.99 GT-> x; 12.18/4.99 _-> y; 12.18/4.99 } ; 12.18/4.99 }; 12.18/4.99 12.18/4.99 } 12.18/4.99 module Main where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (1) CR (EQUIVALENT) 12.18/4.99 Case Reductions: 12.18/4.99 The following Case expression 12.18/4.99 "case cmp x y of { 12.18/4.99 GT -> x; 12.18/4.99 _ -> y} 12.18/4.99 " 12.18/4.99 is transformed to 12.18/4.99 "max0 x y GT = x; 12.18/4.99 max0 x y _ = y; 12.18/4.99 " 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (2) 12.18/4.99 Obligation: 12.18/4.99 mainModule Main 12.18/4.99 module Maybe where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 module List where { 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 maximumBy :: (a -> a -> Ordering) -> [a] -> a; 12.18/4.99 maximumBy _ [] = error []; 12.18/4.99 maximumBy cmp xs = foldl1 max xs where { 12.18/4.99 max x y = max0 x y (cmp x y); 12.18/4.99 max0 x y GT = x; 12.18/4.99 max0 x y _ = y; 12.18/4.99 }; 12.18/4.99 12.18/4.99 } 12.18/4.99 module Main where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (3) BR (EQUIVALENT) 12.18/4.99 Replaced joker patterns by fresh variables and removed binding patterns. 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (4) 12.18/4.99 Obligation: 12.18/4.99 mainModule Main 12.18/4.99 module Maybe where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 module List where { 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 maximumBy :: (a -> a -> Ordering) -> [a] -> a; 12.18/4.99 maximumBy vy [] = error []; 12.18/4.99 maximumBy cmp xs = foldl1 max xs where { 12.18/4.99 max x y = max0 x y (cmp x y); 12.18/4.99 max0 x y GT = x; 12.18/4.99 max0 x y vz = y; 12.18/4.99 }; 12.18/4.99 12.18/4.99 } 12.18/4.99 module Main where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (5) COR (EQUIVALENT) 12.18/4.99 Cond Reductions: 12.18/4.99 The following Function with conditions 12.18/4.99 "undefined |Falseundefined; 12.18/4.99 " 12.18/4.99 is transformed to 12.18/4.99 "undefined = undefined1; 12.18/4.99 " 12.18/4.99 "undefined0 True = undefined; 12.18/4.99 " 12.18/4.99 "undefined1 = undefined0 False; 12.18/4.99 " 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (6) 12.18/4.99 Obligation: 12.18/4.99 mainModule Main 12.18/4.99 module Maybe where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 module List where { 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 maximumBy :: (a -> a -> Ordering) -> [a] -> a; 12.18/4.99 maximumBy vy [] = error []; 12.18/4.99 maximumBy cmp xs = foldl1 max xs where { 12.18/4.99 max x y = max0 x y (cmp x y); 12.18/4.99 max0 x y GT = x; 12.18/4.99 max0 x y vz = y; 12.18/4.99 }; 12.18/4.99 12.18/4.99 } 12.18/4.99 module Main where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (7) LetRed (EQUIVALENT) 12.18/4.99 Let/Where Reductions: 12.18/4.99 The bindings of the following Let/Where expression 12.18/4.99 "foldl1 max xs where { 12.18/4.99 max x y = max0 x y (cmp x y); 12.18/4.99 ; 12.18/4.99 max0 x y GT = x; 12.18/4.99 max0 x y vz = y; 12.18/4.99 } 12.18/4.99 " 12.18/4.99 are unpacked to the following functions on top level 12.18/4.99 "maximumByMax0 wu x y GT = x; 12.18/4.99 maximumByMax0 wu x y vz = y; 12.18/4.99 " 12.18/4.99 "maximumByMax wu x y = maximumByMax0 wu x y (wu x y); 12.18/4.99 " 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (8) 12.18/4.99 Obligation: 12.18/4.99 mainModule Main 12.18/4.99 module Maybe where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 module List where { 12.18/4.99 import qualified Main; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 maximumBy :: (a -> a -> Ordering) -> [a] -> a; 12.18/4.99 maximumBy vy [] = error []; 12.18/4.99 maximumBy cmp xs = foldl1 (maximumByMax cmp) xs; 12.18/4.99 12.18/4.99 maximumByMax wu x y = maximumByMax0 wu x y (wu x y); 12.18/4.99 12.18/4.99 maximumByMax0 wu x y GT = x; 12.18/4.99 maximumByMax0 wu x y vz = y; 12.18/4.99 12.18/4.99 } 12.18/4.99 module Main where { 12.18/4.99 import qualified List; 12.18/4.99 import qualified Maybe; 12.18/4.99 import qualified Prelude; 12.18/4.99 } 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (9) Narrow (SOUND) 12.18/4.99 Haskell To QDPs 12.18/4.99 12.18/4.99 digraph dp_graph { 12.18/4.99 node [outthreshold=100, inthreshold=100];1[label="List.maximumBy",fontsize=16,color="grey",shape="box"];1 -> 3[label="",style="dashed", color="grey", weight=3]; 12.18/4.99 3[label="List.maximumBy wv3",fontsize=16,color="grey",shape="box"];3 -> 4[label="",style="dashed", color="grey", weight=3]; 12.18/4.99 4[label="List.maximumBy wv3 wv4",fontsize=16,color="burlywood",shape="triangle"];30[label="wv4/wv40 : wv41",fontsize=10,color="white",style="solid",shape="box"];4 -> 30[label="",style="solid", color="burlywood", weight=9]; 12.18/4.99 30 -> 5[label="",style="solid", color="burlywood", weight=3]; 12.18/4.99 31[label="wv4/[]",fontsize=10,color="white",style="solid",shape="box"];4 -> 31[label="",style="solid", color="burlywood", weight=9]; 12.18/4.99 31 -> 6[label="",style="solid", color="burlywood", weight=3]; 12.18/4.99 5[label="List.maximumBy wv3 (wv40 : wv41)",fontsize=16,color="black",shape="box"];5 -> 7[label="",style="solid", color="black", weight=3]; 12.18/4.99 6[label="List.maximumBy wv3 []",fontsize=16,color="black",shape="box"];6 -> 8[label="",style="solid", color="black", weight=3]; 12.18/4.99 7[label="foldl1 (List.maximumByMax wv3) (wv40 : wv41)",fontsize=16,color="black",shape="box"];7 -> 9[label="",style="solid", color="black", weight=3]; 12.18/4.99 8[label="error []",fontsize=16,color="black",shape="box"];8 -> 10[label="",style="solid", color="black", weight=3]; 12.18/4.99 9[label="foldl (List.maximumByMax wv3) wv40 wv41",fontsize=16,color="burlywood",shape="triangle"];32[label="wv41/wv410 : wv411",fontsize=10,color="white",style="solid",shape="box"];9 -> 32[label="",style="solid", color="burlywood", weight=9]; 12.18/4.99 32 -> 11[label="",style="solid", color="burlywood", weight=3]; 12.18/4.99 33[label="wv41/[]",fontsize=10,color="white",style="solid",shape="box"];9 -> 33[label="",style="solid", color="burlywood", weight=9]; 12.18/4.99 33 -> 12[label="",style="solid", color="burlywood", weight=3]; 12.18/4.99 10[label="error []",fontsize=16,color="red",shape="box"];11[label="foldl (List.maximumByMax wv3) wv40 (wv410 : wv411)",fontsize=16,color="black",shape="box"];11 -> 13[label="",style="solid", color="black", weight=3]; 12.18/4.99 12[label="foldl (List.maximumByMax wv3) wv40 []",fontsize=16,color="black",shape="box"];12 -> 14[label="",style="solid", color="black", weight=3]; 12.18/4.99 13 -> 9[label="",style="dashed", color="red", weight=0]; 12.18/4.99 13[label="foldl (List.maximumByMax wv3) (List.maximumByMax wv3 wv40 wv410) wv411",fontsize=16,color="magenta"];13 -> 15[label="",style="dashed", color="magenta", weight=3]; 12.18/4.99 13 -> 16[label="",style="dashed", color="magenta", weight=3]; 12.18/4.99 14[label="wv40",fontsize=16,color="green",shape="box"];15[label="wv411",fontsize=16,color="green",shape="box"];16[label="List.maximumByMax wv3 wv40 wv410",fontsize=16,color="black",shape="box"];16 -> 17[label="",style="solid", color="black", weight=3]; 12.18/4.99 17 -> 18[label="",style="dashed", color="red", weight=0]; 12.18/4.99 17[label="List.maximumByMax0 wv3 wv40 wv410 (wv3 wv40 wv410)",fontsize=16,color="magenta"];17 -> 19[label="",style="dashed", color="magenta", weight=3]; 12.18/4.99 19[label="wv3 wv40 wv410",fontsize=16,color="green",shape="box"];19 -> 25[label="",style="dashed", color="green", weight=3]; 12.18/4.99 19 -> 26[label="",style="dashed", color="green", weight=3]; 12.18/4.99 18[label="List.maximumByMax0 wv3 wv40 wv410 wv5",fontsize=16,color="burlywood",shape="triangle"];34[label="wv5/LT",fontsize=10,color="white",style="solid",shape="box"];18 -> 34[label="",style="solid", color="burlywood", weight=9]; 12.18/4.99 34 -> 22[label="",style="solid", color="burlywood", weight=3]; 12.18/4.99 35[label="wv5/EQ",fontsize=10,color="white",style="solid",shape="box"];18 -> 35[label="",style="solid", color="burlywood", weight=9]; 12.18/4.99 35 -> 23[label="",style="solid", color="burlywood", weight=3]; 12.18/4.99 36[label="wv5/GT",fontsize=10,color="white",style="solid",shape="box"];18 -> 36[label="",style="solid", color="burlywood", weight=9]; 12.18/4.99 36 -> 24[label="",style="solid", color="burlywood", weight=3]; 12.18/4.99 25[label="wv40",fontsize=16,color="green",shape="box"];26[label="wv410",fontsize=16,color="green",shape="box"];22[label="List.maximumByMax0 wv3 wv40 wv410 LT",fontsize=16,color="black",shape="box"];22 -> 27[label="",style="solid", color="black", weight=3]; 12.18/4.99 23[label="List.maximumByMax0 wv3 wv40 wv410 EQ",fontsize=16,color="black",shape="box"];23 -> 28[label="",style="solid", color="black", weight=3]; 12.18/4.99 24[label="List.maximumByMax0 wv3 wv40 wv410 GT",fontsize=16,color="black",shape="box"];24 -> 29[label="",style="solid", color="black", weight=3]; 12.18/4.99 27[label="wv410",fontsize=16,color="green",shape="box"];28[label="wv410",fontsize=16,color="green",shape="box"];29[label="wv40",fontsize=16,color="green",shape="box"];} 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (10) 12.18/4.99 Obligation: 12.18/4.99 Q DP problem: 12.18/4.99 The TRS P consists of the following rules: 12.18/4.99 12.18/4.99 new_foldl(wv3, :(wv410, wv411), ba) -> new_foldl(wv3, wv411, ba) 12.18/4.99 12.18/4.99 R is empty. 12.18/4.99 Q is empty. 12.18/4.99 We have to consider all minimal (P,Q,R)-chains. 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (11) QDPSizeChangeProof (EQUIVALENT) 12.18/4.99 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. 12.18/4.99 12.18/4.99 From the DPs we obtained the following set of size-change graphs: 12.18/4.99 *new_foldl(wv3, :(wv410, wv411), ba) -> new_foldl(wv3, wv411, ba) 12.18/4.99 The graph contains the following edges 1 >= 1, 2 > 2, 3 >= 3 12.18/4.99 12.18/4.99 12.18/4.99 ---------------------------------------- 12.18/4.99 12.18/4.99 (12) 12.18/4.99 YES 12.33/7.96 EOF