8.69/3.83 YES 10.80/4.40 proof of /export/starexec/sandbox/benchmark/theBenchmark.hs 10.80/4.40 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 10.80/4.40 10.80/4.40 10.80/4.40 H-Termination with start terms of the given HASKELL could be proven: 10.80/4.40 10.80/4.40 (0) HASKELL 10.80/4.40 (1) LR [EQUIVALENT, 0 ms] 10.80/4.40 (2) HASKELL 10.80/4.40 (3) BR [EQUIVALENT, 0 ms] 10.80/4.40 (4) HASKELL 10.80/4.40 (5) COR [EQUIVALENT, 0 ms] 10.80/4.40 (6) HASKELL 10.80/4.40 (7) Narrow [SOUND, 0 ms] 10.80/4.40 (8) QDP 10.80/4.40 (9) QDPSizeChangeProof [EQUIVALENT, 0 ms] 10.80/4.40 (10) YES 10.80/4.40 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (0) 10.80/4.40 Obligation: 10.80/4.40 mainModule Main 10.80/4.40 module Maybe where { 10.80/4.40 import qualified Main; 10.80/4.40 import qualified Monad; 10.80/4.40 import qualified Prelude; 10.80/4.40 } 10.80/4.40 module Main where { 10.80/4.40 import qualified Maybe; 10.80/4.40 import qualified Monad; 10.80/4.40 import qualified Prelude; 10.80/4.40 } 10.80/4.40 module Monad where { 10.80/4.40 import qualified Main; 10.80/4.40 import qualified Maybe; 10.80/4.40 import qualified Prelude; 10.80/4.40 zipWithM_ :: Monad c => (a -> b -> c d) -> [a] -> [b] -> c (); 10.80/4.40 zipWithM_ f xs ys = sequence_ (zipWith f xs ys); 10.80/4.40 10.80/4.40 } 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (1) LR (EQUIVALENT) 10.80/4.40 Lambda Reductions: 10.80/4.40 The following Lambda expression 10.80/4.40 "\_->q" 10.80/4.40 is transformed to 10.80/4.40 "gtGt0 q _ = q; 10.80/4.40 " 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (2) 10.80/4.40 Obligation: 10.80/4.40 mainModule Main 10.80/4.40 module Maybe where { 10.80/4.40 import qualified Main; 10.80/4.40 import qualified Monad; 10.80/4.40 import qualified Prelude; 10.80/4.40 } 10.80/4.40 module Main where { 10.80/4.40 import qualified Maybe; 10.80/4.40 import qualified Monad; 10.80/4.40 import qualified Prelude; 10.80/4.40 } 10.80/4.40 module Monad where { 10.80/4.40 import qualified Main; 10.80/4.40 import qualified Maybe; 10.80/4.40 import qualified Prelude; 10.80/4.40 zipWithM_ :: Monad c => (b -> a -> c d) -> [b] -> [a] -> c (); 10.80/4.40 zipWithM_ f xs ys = sequence_ (zipWith f xs ys); 10.80/4.40 10.80/4.40 } 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (3) BR (EQUIVALENT) 10.80/4.40 Replaced joker patterns by fresh variables and removed binding patterns. 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (4) 10.80/4.40 Obligation: 10.80/4.40 mainModule Main 10.80/4.40 module Maybe where { 10.80/4.40 import qualified Main; 10.80/4.40 import qualified Monad; 10.80/4.40 import qualified Prelude; 10.80/4.40 } 10.80/4.40 module Main where { 10.80/4.40 import qualified Maybe; 10.80/4.40 import qualified Monad; 10.80/4.40 import qualified Prelude; 10.80/4.40 } 10.80/4.40 module Monad where { 10.80/4.40 import qualified Main; 10.80/4.40 import qualified Maybe; 10.80/4.40 import qualified Prelude; 10.80/4.40 zipWithM_ :: Monad a => (c -> b -> a d) -> [c] -> [b] -> a (); 10.80/4.40 zipWithM_ f xs ys = sequence_ (zipWith f xs ys); 10.80/4.40 10.80/4.40 } 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (5) COR (EQUIVALENT) 10.80/4.40 Cond Reductions: 10.80/4.40 The following Function with conditions 10.80/4.40 "undefined |Falseundefined; 10.80/4.40 " 10.80/4.40 is transformed to 10.80/4.40 "undefined = undefined1; 10.80/4.40 " 10.80/4.40 "undefined0 True = undefined; 10.80/4.40 " 10.80/4.40 "undefined1 = undefined0 False; 10.80/4.40 " 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (6) 10.80/4.40 Obligation: 10.80/4.40 mainModule Main 10.80/4.40 module Maybe where { 10.80/4.40 import qualified Main; 10.80/4.40 import qualified Monad; 10.80/4.40 import qualified Prelude; 10.80/4.40 } 10.80/4.40 module Main where { 10.80/4.40 import qualified Maybe; 10.80/4.40 import qualified Monad; 10.80/4.40 import qualified Prelude; 10.80/4.40 } 10.80/4.40 module Monad where { 10.80/4.40 import qualified Main; 10.80/4.40 import qualified Maybe; 10.80/4.40 import qualified Prelude; 10.80/4.40 zipWithM_ :: Monad d => (b -> a -> d c) -> [b] -> [a] -> d (); 10.80/4.40 zipWithM_ f xs ys = sequence_ (zipWith f xs ys); 10.80/4.40 10.80/4.40 } 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (7) Narrow (SOUND) 10.80/4.40 Haskell To QDPs 10.80/4.40 10.80/4.40 digraph dp_graph { 10.80/4.40 node [outthreshold=100, inthreshold=100];1[label="Monad.zipWithM_",fontsize=16,color="grey",shape="box"];1 -> 3[label="",style="dashed", color="grey", weight=3]; 10.80/4.40 3[label="Monad.zipWithM_ ww3",fontsize=16,color="grey",shape="box"];3 -> 4[label="",style="dashed", color="grey", weight=3]; 10.80/4.40 4[label="Monad.zipWithM_ ww3 ww4",fontsize=16,color="grey",shape="box"];4 -> 5[label="",style="dashed", color="grey", weight=3]; 10.80/4.40 5[label="Monad.zipWithM_ ww3 ww4 ww5",fontsize=16,color="black",shape="triangle"];5 -> 6[label="",style="solid", color="black", weight=3]; 10.80/4.40 6[label="sequence_ (zipWith ww3 ww4 ww5)",fontsize=16,color="black",shape="box"];6 -> 7[label="",style="solid", color="black", weight=3]; 10.80/4.40 7[label="foldr (>>) (return ()) (zipWith ww3 ww4 ww5)",fontsize=16,color="burlywood",shape="triangle"];34[label="ww4/ww40 : ww41",fontsize=10,color="white",style="solid",shape="box"];7 -> 34[label="",style="solid", color="burlywood", weight=9]; 10.80/4.40 34 -> 8[label="",style="solid", color="burlywood", weight=3]; 10.80/4.40 35[label="ww4/[]",fontsize=10,color="white",style="solid",shape="box"];7 -> 35[label="",style="solid", color="burlywood", weight=9]; 10.80/4.40 35 -> 9[label="",style="solid", color="burlywood", weight=3]; 10.80/4.40 8[label="foldr (>>) (return ()) (zipWith ww3 (ww40 : ww41) ww5)",fontsize=16,color="burlywood",shape="box"];36[label="ww5/ww50 : ww51",fontsize=10,color="white",style="solid",shape="box"];8 -> 36[label="",style="solid", color="burlywood", weight=9]; 10.80/4.40 36 -> 10[label="",style="solid", color="burlywood", weight=3]; 10.80/4.40 37[label="ww5/[]",fontsize=10,color="white",style="solid",shape="box"];8 -> 37[label="",style="solid", color="burlywood", weight=9]; 10.80/4.40 37 -> 11[label="",style="solid", color="burlywood", weight=3]; 10.80/4.40 9[label="foldr (>>) (return ()) (zipWith ww3 [] ww5)",fontsize=16,color="black",shape="box"];9 -> 12[label="",style="solid", color="black", weight=3]; 10.80/4.40 10[label="foldr (>>) (return ()) (zipWith ww3 (ww40 : ww41) (ww50 : ww51))",fontsize=16,color="black",shape="box"];10 -> 13[label="",style="solid", color="black", weight=3]; 10.80/4.40 11[label="foldr (>>) (return ()) (zipWith ww3 (ww40 : ww41) [])",fontsize=16,color="black",shape="box"];11 -> 14[label="",style="solid", color="black", weight=3]; 10.80/4.40 12[label="foldr (>>) (return ()) []",fontsize=16,color="black",shape="triangle"];12 -> 15[label="",style="solid", color="black", weight=3]; 10.80/4.40 13[label="foldr (>>) (return ()) (ww3 ww40 ww50 : zipWith ww3 ww41 ww51)",fontsize=16,color="black",shape="box"];13 -> 16[label="",style="solid", color="black", weight=3]; 10.80/4.40 14 -> 12[label="",style="dashed", color="red", weight=0]; 10.80/4.40 14[label="foldr (>>) (return ()) []",fontsize=16,color="magenta"];15[label="return ()",fontsize=16,color="black",shape="box"];15 -> 17[label="",style="solid", color="black", weight=3]; 10.80/4.40 16 -> 18[label="",style="dashed", color="red", weight=0]; 10.80/4.40 16[label="(>>) ww3 ww40 ww50 foldr (>>) (return ()) (zipWith ww3 ww41 ww51)",fontsize=16,color="magenta"];16 -> 19[label="",style="dashed", color="magenta", weight=3]; 10.80/4.40 17[label="Just ()",fontsize=16,color="green",shape="box"];19 -> 7[label="",style="dashed", color="red", weight=0]; 10.80/4.40 19[label="foldr (>>) (return ()) (zipWith ww3 ww41 ww51)",fontsize=16,color="magenta"];19 -> 20[label="",style="dashed", color="magenta", weight=3]; 10.80/4.40 19 -> 21[label="",style="dashed", color="magenta", weight=3]; 10.80/4.40 18[label="(>>) ww3 ww40 ww50 ww6",fontsize=16,color="black",shape="triangle"];18 -> 22[label="",style="solid", color="black", weight=3]; 10.80/4.40 20[label="ww51",fontsize=16,color="green",shape="box"];21[label="ww41",fontsize=16,color="green",shape="box"];22 -> 23[label="",style="dashed", color="red", weight=0]; 10.80/4.40 22[label="ww3 ww40 ww50 >>= gtGt0 ww6",fontsize=16,color="magenta"];22 -> 24[label="",style="dashed", color="magenta", weight=3]; 10.80/4.40 24[label="ww3 ww40 ww50",fontsize=16,color="green",shape="box"];24 -> 29[label="",style="dashed", color="green", weight=3]; 10.80/4.40 24 -> 30[label="",style="dashed", color="green", weight=3]; 10.80/4.40 23[label="ww8 >>= gtGt0 ww6",fontsize=16,color="burlywood",shape="triangle"];38[label="ww8/Nothing",fontsize=10,color="white",style="solid",shape="box"];23 -> 38[label="",style="solid", color="burlywood", weight=9]; 10.80/4.40 38 -> 27[label="",style="solid", color="burlywood", weight=3]; 10.80/4.40 39[label="ww8/Just ww80",fontsize=10,color="white",style="solid",shape="box"];23 -> 39[label="",style="solid", color="burlywood", weight=9]; 10.80/4.40 39 -> 28[label="",style="solid", color="burlywood", weight=3]; 10.80/4.40 29[label="ww40",fontsize=16,color="green",shape="box"];30[label="ww50",fontsize=16,color="green",shape="box"];27[label="Nothing >>= gtGt0 ww6",fontsize=16,color="black",shape="box"];27 -> 31[label="",style="solid", color="black", weight=3]; 10.80/4.40 28[label="Just ww80 >>= gtGt0 ww6",fontsize=16,color="black",shape="box"];28 -> 32[label="",style="solid", color="black", weight=3]; 10.80/4.40 31[label="Nothing",fontsize=16,color="green",shape="box"];32[label="gtGt0 ww6 ww80",fontsize=16,color="black",shape="box"];32 -> 33[label="",style="solid", color="black", weight=3]; 10.80/4.40 33[label="ww6",fontsize=16,color="green",shape="box"];} 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (8) 10.80/4.40 Obligation: 10.80/4.40 Q DP problem: 10.80/4.40 The TRS P consists of the following rules: 10.80/4.40 10.80/4.40 new_foldr(ww3, :(ww40, ww41), :(ww50, ww51), h, ba, bb) -> new_foldr(ww3, ww41, ww51, h, ba, bb) 10.80/4.40 10.80/4.40 R is empty. 10.80/4.40 Q is empty. 10.80/4.40 We have to consider all minimal (P,Q,R)-chains. 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (9) QDPSizeChangeProof (EQUIVALENT) 10.80/4.40 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.80/4.40 10.80/4.40 From the DPs we obtained the following set of size-change graphs: 10.80/4.40 *new_foldr(ww3, :(ww40, ww41), :(ww50, ww51), h, ba, bb) -> new_foldr(ww3, ww41, ww51, h, ba, bb) 10.80/4.40 The graph contains the following edges 1 >= 1, 2 > 2, 3 > 3, 4 >= 4, 5 >= 5, 6 >= 6 10.80/4.40 10.80/4.40 10.80/4.40 ---------------------------------------- 10.80/4.40 10.80/4.40 (10) 10.80/4.40 YES 11.01/4.48 EOF