8.02/3.93 YES 10.35/4.48 proof of /export/starexec/sandbox/benchmark/theBenchmark.hs 10.35/4.48 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 10.35/4.48 10.35/4.48 10.35/4.48 H-Termination with start terms of the given HASKELL could be proven: 10.35/4.48 10.35/4.48 (0) HASKELL 10.35/4.48 (1) LR [EQUIVALENT, 0 ms] 10.35/4.48 (2) HASKELL 10.35/4.48 (3) BR [EQUIVALENT, 0 ms] 10.35/4.48 (4) HASKELL 10.35/4.48 (5) COR [EQUIVALENT, 0 ms] 10.35/4.48 (6) HASKELL 10.35/4.48 (7) NumRed [SOUND, 0 ms] 10.35/4.48 (8) HASKELL 10.35/4.48 (9) Narrow [SOUND, 0 ms] 10.35/4.48 (10) QDP 10.35/4.48 (11) QDPSizeChangeProof [EQUIVALENT, 0 ms] 10.35/4.48 (12) YES 10.35/4.48 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (0) 10.35/4.48 Obligation: 10.35/4.48 mainModule Main 10.35/4.48 module Main where { 10.35/4.48 import qualified Prelude; 10.35/4.48 } 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (1) LR (EQUIVALENT) 10.35/4.48 Lambda Reductions: 10.35/4.48 The following Lambda expression 10.35/4.48 "\_->q" 10.35/4.48 is transformed to 10.35/4.48 "gtGt0 q _ = q; 10.35/4.48 " 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (2) 10.35/4.48 Obligation: 10.35/4.48 mainModule Main 10.35/4.48 module Main where { 10.35/4.48 import qualified Prelude; 10.35/4.48 } 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (3) BR (EQUIVALENT) 10.35/4.48 Replaced joker patterns by fresh variables and removed binding patterns. 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (4) 10.35/4.48 Obligation: 10.35/4.48 mainModule Main 10.35/4.48 module Main where { 10.35/4.48 import qualified Prelude; 10.35/4.48 } 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (5) COR (EQUIVALENT) 10.35/4.48 Cond Reductions: 10.35/4.48 The following Function with conditions 10.35/4.48 "randomSelect (x : []) = x; 10.35/4.48 randomSelect (x : xs)|terminatorrandomSelect xs|otherwisex; 10.35/4.48 " 10.35/4.48 is transformed to 10.35/4.48 "randomSelect (x : []) = randomSelect3 (x : []); 10.35/4.48 randomSelect (x : xs) = randomSelect2 (x : xs); 10.35/4.48 " 10.35/4.48 "randomSelect1 x xs True = randomSelect xs; 10.35/4.48 randomSelect1 x xs False = randomSelect0 x xs otherwise; 10.35/4.48 " 10.35/4.48 "randomSelect0 x xs True = x; 10.35/4.48 " 10.35/4.48 "randomSelect2 (x : xs) = randomSelect1 x xs terminator; 10.35/4.48 " 10.35/4.48 "randomSelect3 (x : []) = x; 10.35/4.48 randomSelect3 wv = randomSelect2 wv; 10.35/4.48 " 10.35/4.48 The following Function with conditions 10.35/4.48 "undefined |Falseundefined; 10.35/4.48 " 10.35/4.48 is transformed to 10.35/4.48 "undefined = undefined1; 10.35/4.48 " 10.35/4.48 "undefined0 True = undefined; 10.35/4.48 " 10.35/4.48 "undefined1 = undefined0 False; 10.35/4.48 " 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (6) 10.35/4.48 Obligation: 10.35/4.48 mainModule Main 10.35/4.48 module Main where { 10.35/4.48 import qualified Prelude; 10.35/4.48 } 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (7) NumRed (SOUND) 10.35/4.48 Num Reduction:All numbers are transformed to their corresponding representation with Succ, Pred and Zero. 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (8) 10.35/4.48 Obligation: 10.35/4.48 mainModule Main 10.35/4.48 module Main where { 10.35/4.48 import qualified Prelude; 10.35/4.48 } 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (9) Narrow (SOUND) 10.35/4.48 Haskell To QDPs 10.35/4.48 10.35/4.48 digraph dp_graph { 10.35/4.48 node [outthreshold=100, inthreshold=100];1[label="putStrLn",fontsize=16,color="grey",shape="box"];1 -> 3[label="",style="dashed", color="grey", weight=3]; 10.35/4.48 3[label="putStrLn ww3",fontsize=16,color="black",shape="triangle"];3 -> 4[label="",style="solid", color="black", weight=3]; 10.35/4.48 4 -> 5[label="",style="dashed", color="red", weight=0]; 10.35/4.48 4[label="putStr ww3 >> putChar (Char (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))",fontsize=16,color="magenta"];4 -> 6[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 4 -> 7[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 6[label="ww3",fontsize=16,color="green",shape="box"];7[label="Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))))",fontsize=16,color="green",shape="box"];5[label="putStr ww5 >> putChar (Char (Succ ww6))",fontsize=16,color="black",shape="triangle"];5 -> 8[label="",style="solid", color="black", weight=3]; 10.35/4.48 8[label="putStr ww5 >>= gtGt0 (putChar (Char (Succ ww6)))",fontsize=16,color="black",shape="box"];8 -> 9[label="",style="solid", color="black", weight=3]; 10.35/4.48 9 -> 92[label="",style="dashed", color="red", weight=0]; 10.35/4.48 9[label="primbindIO (putStr ww5) (gtGt0 (putChar (Char (Succ ww6))))",fontsize=16,color="magenta"];9 -> 93[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 9 -> 94[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 93[label="putChar (Char (Succ ww6))",fontsize=16,color="black",shape="box"];93 -> 195[label="",style="solid", color="black", weight=3]; 10.35/4.48 94[label="putStr ww5",fontsize=16,color="burlywood",shape="triangle"];248[label="ww5/ww50 : ww51",fontsize=10,color="white",style="solid",shape="box"];94 -> 248[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 248 -> 196[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 249[label="ww5/[]",fontsize=10,color="white",style="solid",shape="box"];94 -> 249[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 249 -> 197[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 92[label="primbindIO ww9 (gtGt0 ww8)",fontsize=16,color="burlywood",shape="triangle"];250[label="ww9/IO ww90",fontsize=10,color="white",style="solid",shape="box"];92 -> 250[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 250 -> 198[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 251[label="ww9/AProVE_IO ww90",fontsize=10,color="white",style="solid",shape="box"];92 -> 251[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 251 -> 199[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 252[label="ww9/AProVE_Exception ww90",fontsize=10,color="white",style="solid",shape="box"];92 -> 252[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 252 -> 200[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 253[label="ww9/AProVE_Error ww90",fontsize=10,color="white",style="solid",shape="box"];92 -> 253[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 253 -> 201[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 195 -> 225[label="",style="dashed", color="red", weight=0]; 10.35/4.48 195[label="(seq Char (Succ ww6) output)",fontsize=16,color="magenta"];195 -> 226[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 195 -> 227[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 196[label="putStr (ww50 : ww51)",fontsize=16,color="black",shape="box"];196 -> 203[label="",style="solid", color="black", weight=3]; 10.35/4.48 197[label="putStr []",fontsize=16,color="black",shape="box"];197 -> 204[label="",style="solid", color="black", weight=3]; 10.35/4.48 198[label="primbindIO (IO ww90) (gtGt0 ww8)",fontsize=16,color="black",shape="box"];198 -> 205[label="",style="solid", color="black", weight=3]; 10.35/4.48 199[label="primbindIO (AProVE_IO ww90) (gtGt0 ww8)",fontsize=16,color="black",shape="box"];199 -> 206[label="",style="solid", color="black", weight=3]; 10.35/4.48 200[label="primbindIO (AProVE_Exception ww90) (gtGt0 ww8)",fontsize=16,color="black",shape="box"];200 -> 207[label="",style="solid", color="black", weight=3]; 10.35/4.48 201[label="primbindIO (AProVE_Error ww90) (gtGt0 ww8)",fontsize=16,color="black",shape="box"];201 -> 208[label="",style="solid", color="black", weight=3]; 10.35/4.48 226 -> 204[label="",style="dashed", color="red", weight=0]; 10.35/4.48 226[label="output",fontsize=16,color="magenta"];227[label="Char (Succ ww6)",fontsize=16,color="green",shape="box"];225[label="(seq ww50 ww11)",fontsize=16,color="black",shape="triangle"];225 -> 229[label="",style="solid", color="black", weight=3]; 10.35/4.48 203 -> 210[label="",style="dashed", color="red", weight=0]; 10.35/4.48 203[label="putChar ww50 >> putStr ww51",fontsize=16,color="magenta"];203 -> 211[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 204[label="output",fontsize=16,color="black",shape="triangle"];204 -> 212[label="",style="solid", color="black", weight=3]; 10.35/4.48 205[label="error []",fontsize=16,color="red",shape="box"];206[label="gtGt0 ww8 ww90",fontsize=16,color="black",shape="box"];206 -> 213[label="",style="solid", color="black", weight=3]; 10.35/4.48 207[label="AProVE_Exception ww90",fontsize=16,color="green",shape="box"];208[label="AProVE_Error ww90",fontsize=16,color="green",shape="box"];229[label="enforceWHNF (WHNF ww50) ww11",fontsize=16,color="black",shape="box"];229 -> 232[label="",style="solid", color="black", weight=3]; 10.35/4.48 211 -> 94[label="",style="dashed", color="red", weight=0]; 10.35/4.48 211[label="putStr ww51",fontsize=16,color="magenta"];211 -> 214[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 210[label="putChar ww50 >> ww10",fontsize=16,color="black",shape="triangle"];210 -> 215[label="",style="solid", color="black", weight=3]; 10.35/4.48 212[label="randomSelect (aIOE IOError_FullError : aIOE IOError_PermDenied : AProVE_IO () : [])",fontsize=16,color="black",shape="box"];212 -> 216[label="",style="solid", color="black", weight=3]; 10.35/4.48 213[label="ww8",fontsize=16,color="green",shape="box"];232[label="ww11",fontsize=16,color="green",shape="box"];214[label="ww51",fontsize=16,color="green",shape="box"];215[label="putChar ww50 >>= gtGt0 ww10",fontsize=16,color="black",shape="box"];215 -> 217[label="",style="solid", color="black", weight=3]; 10.35/4.48 216[label="randomSelect2 (aIOE IOError_FullError : aIOE IOError_PermDenied : AProVE_IO () : [])",fontsize=16,color="black",shape="box"];216 -> 218[label="",style="solid", color="black", weight=3]; 10.35/4.48 217 -> 92[label="",style="dashed", color="red", weight=0]; 10.35/4.48 217[label="primbindIO (putChar ww50) (gtGt0 ww10)",fontsize=16,color="magenta"];217 -> 219[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 217 -> 220[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 218[label="randomSelect1 (aIOE IOError_FullError) (aIOE IOError_PermDenied : AProVE_IO () : []) terminator",fontsize=16,color="black",shape="box"];218 -> 221[label="",style="solid", color="black", weight=3]; 10.35/4.48 219[label="ww10",fontsize=16,color="green",shape="box"];220[label="putChar ww50",fontsize=16,color="black",shape="box"];220 -> 222[label="",style="solid", color="black", weight=3]; 10.35/4.48 221[label="randomSelect1 (aIOE IOError_FullError) (aIOE IOError_PermDenied : AProVE_IO () : []) ter5m",fontsize=16,color="burlywood",shape="box"];254[label="ter5m/False",fontsize=10,color="white",style="solid",shape="box"];221 -> 254[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 254 -> 223[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 255[label="ter5m/True",fontsize=10,color="white",style="solid",shape="box"];221 -> 255[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 255 -> 224[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 222 -> 225[label="",style="dashed", color="red", weight=0]; 10.35/4.48 222[label="(seq ww50 output)",fontsize=16,color="magenta"];222 -> 228[label="",style="dashed", color="magenta", weight=3]; 10.35/4.48 223[label="randomSelect1 (aIOE IOError_FullError) (aIOE IOError_PermDenied : AProVE_IO () : []) False",fontsize=16,color="black",shape="box"];223 -> 230[label="",style="solid", color="black", weight=3]; 10.35/4.48 224[label="randomSelect1 (aIOE IOError_FullError) (aIOE IOError_PermDenied : AProVE_IO () : []) True",fontsize=16,color="black",shape="box"];224 -> 231[label="",style="solid", color="black", weight=3]; 10.35/4.48 228 -> 204[label="",style="dashed", color="red", weight=0]; 10.35/4.48 228[label="output",fontsize=16,color="magenta"];230[label="randomSelect0 (aIOE IOError_FullError) (aIOE IOError_PermDenied : AProVE_IO () : []) otherwise",fontsize=16,color="black",shape="box"];230 -> 233[label="",style="solid", color="black", weight=3]; 10.35/4.48 231[label="randomSelect (aIOE IOError_PermDenied : AProVE_IO () : [])",fontsize=16,color="black",shape="box"];231 -> 234[label="",style="solid", color="black", weight=3]; 10.35/4.48 233[label="randomSelect0 (aIOE IOError_FullError) (aIOE IOError_PermDenied : AProVE_IO () : []) True",fontsize=16,color="black",shape="box"];233 -> 235[label="",style="solid", color="black", weight=3]; 10.35/4.48 234[label="randomSelect2 (aIOE IOError_PermDenied : AProVE_IO () : [])",fontsize=16,color="black",shape="box"];234 -> 236[label="",style="solid", color="black", weight=3]; 10.35/4.48 235[label="aIOE IOError_FullError",fontsize=16,color="black",shape="box"];235 -> 237[label="",style="solid", color="black", weight=3]; 10.35/4.48 236[label="randomSelect1 (aIOE IOError_PermDenied) (AProVE_IO () : []) terminator",fontsize=16,color="black",shape="box"];236 -> 238[label="",style="solid", color="black", weight=3]; 10.35/4.48 237[label="AProVE_Exception (AET_IOError (IOError IOError_FullError [] [] Nothing))",fontsize=16,color="green",shape="box"];238[label="randomSelect1 (aIOE IOError_PermDenied) (AProVE_IO () : []) ter6m",fontsize=16,color="burlywood",shape="box"];256[label="ter6m/False",fontsize=10,color="white",style="solid",shape="box"];238 -> 256[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 256 -> 239[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 257[label="ter6m/True",fontsize=10,color="white",style="solid",shape="box"];238 -> 257[label="",style="solid", color="burlywood", weight=9]; 10.35/4.48 257 -> 240[label="",style="solid", color="burlywood", weight=3]; 10.35/4.48 239[label="randomSelect1 (aIOE IOError_PermDenied) (AProVE_IO () : []) False",fontsize=16,color="black",shape="box"];239 -> 241[label="",style="solid", color="black", weight=3]; 10.35/4.48 240[label="randomSelect1 (aIOE IOError_PermDenied) (AProVE_IO () : []) True",fontsize=16,color="black",shape="box"];240 -> 242[label="",style="solid", color="black", weight=3]; 10.35/4.48 241[label="randomSelect0 (aIOE IOError_PermDenied) (AProVE_IO () : []) otherwise",fontsize=16,color="black",shape="box"];241 -> 243[label="",style="solid", color="black", weight=3]; 10.35/4.48 242[label="randomSelect (AProVE_IO () : [])",fontsize=16,color="black",shape="box"];242 -> 244[label="",style="solid", color="black", weight=3]; 10.35/4.48 243[label="randomSelect0 (aIOE IOError_PermDenied) (AProVE_IO () : []) True",fontsize=16,color="black",shape="box"];243 -> 245[label="",style="solid", color="black", weight=3]; 10.35/4.48 244[label="randomSelect3 (AProVE_IO () : [])",fontsize=16,color="black",shape="box"];244 -> 246[label="",style="solid", color="black", weight=3]; 10.35/4.48 245[label="aIOE IOError_PermDenied",fontsize=16,color="black",shape="box"];245 -> 247[label="",style="solid", color="black", weight=3]; 10.35/4.48 246[label="AProVE_IO ()",fontsize=16,color="green",shape="box"];247[label="AProVE_Exception (AET_IOError (IOError IOError_PermDenied [] [] Nothing))",fontsize=16,color="green",shape="box"];} 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (10) 10.35/4.48 Obligation: 10.35/4.48 Q DP problem: 10.35/4.48 The TRS P consists of the following rules: 10.35/4.48 10.35/4.48 new_putStr(:(ww50, ww51)) -> new_putStr(ww51) 10.35/4.48 10.35/4.48 R is empty. 10.35/4.48 Q is empty. 10.35/4.48 We have to consider all minimal (P,Q,R)-chains. 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (11) QDPSizeChangeProof (EQUIVALENT) 10.35/4.48 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. 10.35/4.48 10.35/4.48 From the DPs we obtained the following set of size-change graphs: 10.35/4.48 *new_putStr(:(ww50, ww51)) -> new_putStr(ww51) 10.35/4.48 The graph contains the following edges 1 > 1 10.35/4.48 10.35/4.48 10.35/4.48 ---------------------------------------- 10.35/4.48 10.35/4.48 (12) 10.35/4.48 YES 10.35/4.52 EOF