*** 1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult(@t,@acc) -> bftMult'(tuple#2(::(@t,nil()),nil()),@acc) bftMult'(@queue,@acc) -> bftMult'#1(bftMult'#2(@queue),@acc) bftMult'#1(tuple#2(@elem,@queue),@acc) -> bftMult'#3(@elem,@acc,@queue) bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) bftMult'#3(::(@t,@_@3),@acc,@queue) -> bftMult'#4(@t,@acc,@queue) bftMult'#3(nil(),@acc,@queue) -> @acc bftMult'#4(leaf(),@acc,@queue) -> bftMult'(@queue,@acc) bftMult'#4(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5(@queue',@acc,@y) -> bftMult'(@queue',matrixMult(@acc,@y)) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2} Obligation: Innermost basic terms: {#add,#mult,#natmult,#pred,#succ,*,+,appendreverse,appendreverse#1,bftMult,bftMult',bftMult'#1,bftMult'#2,bftMult'#3,bftMult'#4,bftMult'#5,computeLine,computeLine#1,computeLine#2,dequeue,dequeue#1,dequeue#2,enqueue,enqueue#1,lineMult,lineMult#1,lineMult#2,matrixMult,matrixMult#1,reverse}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: DependencyPairs {dpKind_ = DT} Proof: We add the following dependency tuples: Strict DPs *#(@x,@y) -> c_1(#mult#(@x,@y)) +#(@x,@y) -> c_2(#add#(@x,@y)) appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) appendreverse#1#(nil(),@sofar) -> c_5() bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#3#(nil(),@acc,@queue) -> c_11() bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#1#(nil(),@acc,@m) -> c_17() computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) computeLine#2#(nil(),@acc,@x,@xs) -> c_19() dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(::(@t,@ts),@inq) -> c_21() dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) dequeue#2#(::(@t,@ts)) -> c_23() dequeue#2#(nil()) -> c_24() enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) enqueue#1#(tuple#2(@outq,@inq),@t) -> c_26() lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#1#(nil(),@l2,@n) -> c_29() lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) matrixMult#1#(nil(),@m2) -> c_34() reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak DPs #add#(#0(),@y) -> c_36() #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #mult#(#0(),#0()) -> c_41() #mult#(#0(),#neg(@y)) -> c_42() #mult#(#0(),#pos(@y)) -> c_43() #mult#(#neg(@x),#0()) -> c_44() #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) #mult#(#pos(@x),#0()) -> c_47() #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) #natmult#(#0(),@y) -> c_50() #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)) #pred#(#0()) -> c_52() #pred#(#neg(#s(@x))) -> c_53() #pred#(#pos(#s(#0()))) -> c_54() #pred#(#pos(#s(#s(@x)))) -> c_55() #succ#(#0()) -> c_56() #succ#(#neg(#s(#0()))) -> c_57() #succ#(#neg(#s(#s(@x)))) -> c_58() #succ#(#pos(#s(@x))) -> c_59() and mark the set of starting terms. *** 1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: *#(@x,@y) -> c_1(#mult#(@x,@y)) +#(@x,@y) -> c_2(#add#(@x,@y)) appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) appendreverse#1#(nil(),@sofar) -> c_5() bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#3#(nil(),@acc,@queue) -> c_11() bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#1#(nil(),@acc,@m) -> c_17() computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) computeLine#2#(nil(),@acc,@x,@xs) -> c_19() dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(::(@t,@ts),@inq) -> c_21() dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) dequeue#2#(::(@t,@ts)) -> c_23() dequeue#2#(nil()) -> c_24() enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) enqueue#1#(tuple#2(@outq,@inq),@t) -> c_26() lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#1#(nil(),@l2,@n) -> c_29() lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) matrixMult#1#(nil(),@m2) -> c_34() reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: #add#(#0(),@y) -> c_36() #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #mult#(#0(),#0()) -> c_41() #mult#(#0(),#neg(@y)) -> c_42() #mult#(#0(),#pos(@y)) -> c_43() #mult#(#neg(@x),#0()) -> c_44() #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) #mult#(#pos(@x),#0()) -> c_47() #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) #natmult#(#0(),@y) -> c_50() #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)) #pred#(#0()) -> c_52() #pred#(#neg(#s(@x))) -> c_53() #pred#(#pos(#s(#0()))) -> c_54() #pred#(#pos(#s(#s(@x)))) -> c_55() #succ#(#0()) -> c_56() #succ#(#neg(#s(#0()))) -> c_57() #succ#(#neg(#s(#s(@x)))) -> c_58() #succ#(#pos(#s(@x))) -> c_59() Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult(@t,@acc) -> bftMult'(tuple#2(::(@t,nil()),nil()),@acc) bftMult'(@queue,@acc) -> bftMult'#1(bftMult'#2(@queue),@acc) bftMult'#1(tuple#2(@elem,@queue),@acc) -> bftMult'#3(@elem,@acc,@queue) bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) bftMult'#3(::(@t,@_@3),@acc,@queue) -> bftMult'#4(@t,@acc,@queue) bftMult'#3(nil(),@acc,@queue) -> @acc bftMult'#4(leaf(),@acc,@queue) -> bftMult'(@queue,@acc) bftMult'#4(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5(@queue',@acc,@y) -> bftMult'(@queue',matrixMult(@acc,@y)) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/3,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/2,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/3,c_31/2,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: UsableRules Proof: We replace rewrite rules by usable rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) #add#(#0(),@y) -> c_36() #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #mult#(#0(),#0()) -> c_41() #mult#(#0(),#neg(@y)) -> c_42() #mult#(#0(),#pos(@y)) -> c_43() #mult#(#neg(@x),#0()) -> c_44() #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) #mult#(#pos(@x),#0()) -> c_47() #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) #natmult#(#0(),@y) -> c_50() #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)) #pred#(#0()) -> c_52() #pred#(#neg(#s(@x))) -> c_53() #pred#(#pos(#s(#0()))) -> c_54() #pred#(#pos(#s(#s(@x)))) -> c_55() #succ#(#0()) -> c_56() #succ#(#neg(#s(#0()))) -> c_57() #succ#(#neg(#s(#s(@x)))) -> c_58() #succ#(#pos(#s(@x))) -> c_59() *#(@x,@y) -> c_1(#mult#(@x,@y)) +#(@x,@y) -> c_2(#add#(@x,@y)) appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) appendreverse#1#(nil(),@sofar) -> c_5() bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#3#(nil(),@acc,@queue) -> c_11() bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#1#(nil(),@acc,@m) -> c_17() computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) computeLine#2#(nil(),@acc,@x,@xs) -> c_19() dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(::(@t,@ts),@inq) -> c_21() dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) dequeue#2#(::(@t,@ts)) -> c_23() dequeue#2#(nil()) -> c_24() enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) enqueue#1#(tuple#2(@outq,@inq),@t) -> c_26() lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#1#(nil(),@l2,@n) -> c_29() lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) matrixMult#1#(nil(),@m2) -> c_34() reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) *** 1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: *#(@x,@y) -> c_1(#mult#(@x,@y)) +#(@x,@y) -> c_2(#add#(@x,@y)) appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) appendreverse#1#(nil(),@sofar) -> c_5() bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#3#(nil(),@acc,@queue) -> c_11() bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#1#(nil(),@acc,@m) -> c_17() computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) computeLine#2#(nil(),@acc,@x,@xs) -> c_19() dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(::(@t,@ts),@inq) -> c_21() dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) dequeue#2#(::(@t,@ts)) -> c_23() dequeue#2#(nil()) -> c_24() enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) enqueue#1#(tuple#2(@outq,@inq),@t) -> c_26() lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#1#(nil(),@l2,@n) -> c_29() lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) matrixMult#1#(nil(),@m2) -> c_34() reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: #add#(#0(),@y) -> c_36() #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #mult#(#0(),#0()) -> c_41() #mult#(#0(),#neg(@y)) -> c_42() #mult#(#0(),#pos(@y)) -> c_43() #mult#(#neg(@x),#0()) -> c_44() #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) #mult#(#pos(@x),#0()) -> c_47() #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) #natmult#(#0(),@y) -> c_50() #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)) #pred#(#0()) -> c_52() #pred#(#neg(#s(@x))) -> c_53() #pred#(#pos(#s(#0()))) -> c_54() #pred#(#pos(#s(#s(@x)))) -> c_55() #succ#(#0()) -> c_56() #succ#(#neg(#s(#0()))) -> c_57() #succ#(#neg(#s(#s(@x)))) -> c_58() #succ#(#pos(#s(@x))) -> c_59() Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/3,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/2,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/3,c_31/2,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimation {onSelection = all simple predecessor estimation selector} Proof: We estimate the number of application of {1,2,5,11,17,19,21,23,24,26,29,34} by application of Pre({1,2,5,11,17,19,21,23,24,26,29,34}) = {3,8,15,16,20,22,25,27,30,31,32}. Here rules are labelled as follows: 1: *#(@x,@y) -> c_1(#mult#(@x,@y)) 2: +#(@x,@y) -> c_2(#add#(@x,@y)) 3: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 4: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) 5: appendreverse#1#(nil() ,@sofar) -> c_5() 6: bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t ,nil()) ,nil()) ,@acc)) 7: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) 8: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 9: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 10: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 11: bftMult'#3#(nil() ,@acc ,@queue) -> c_11() 12: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) 13: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) ,enqueue#(@t2 ,enqueue(@t1,@queue)) ,enqueue#(@t1,@queue)) 14: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) 15: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 16: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 17: computeLine#1#(nil(),@acc,@m) -> c_17() 18: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) 19: computeLine#2#(nil() ,@acc ,@x ,@xs) -> c_19() 20: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 21: dequeue#1#(::(@t,@ts),@inq) -> c_21() 22: dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)) ,reverse#(@inq)) 23: dequeue#2#(::(@t,@ts)) -> c_23() 24: dequeue#2#(nil()) -> c_24() 25: enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) 26: enqueue#1#(tuple#2(@outq,@inq) ,@t) -> c_26() 27: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 28: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 29: lineMult#1#(nil(),@l2,@n) -> c_29() 30: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(+#(*(@x,@n),@y) ,*#(@x,@n) ,lineMult#(@n,@xs,@ys)) 31: lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n) ,lineMult#(@n,@xs,nil())) 32: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 33: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) 34: matrixMult#1#(nil(),@m2) -> c_34() 35: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) 36: #add#(#0(),@y) -> c_36() 37: #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) 38: #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)) ,@y)) ,#add#(#pos(#s(@x)),@y)) 39: #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) 40: #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)) ,@y)) ,#add#(#pos(#s(@x)),@y)) 41: #mult#(#0(),#0()) -> c_41() 42: #mult#(#0(),#neg(@y)) -> c_42() 43: #mult#(#0(),#pos(@y)) -> c_43() 44: #mult#(#neg(@x),#0()) -> c_44() 45: #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) 46: #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) 47: #mult#(#pos(@x),#0()) -> c_47() 48: #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) 49: #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) 50: #natmult#(#0(),@y) -> c_50() 51: #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y) ,#natmult(@x,@y)) ,#natmult#(@x,@y)) 52: #pred#(#0()) -> c_52() 53: #pred#(#neg(#s(@x))) -> c_53() 54: #pred#(#pos(#s(#0()))) -> c_54() 55: #pred#(#pos(#s(#s(@x)))) -> c_55() 56: #succ#(#0()) -> c_56() 57: #succ#(#neg(#s(#0()))) -> c_57() 58: #succ#(#neg(#s(#s(@x)))) -> c_58() 59: #succ#(#pos(#s(@x))) -> c_59() *** 1.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: #add#(#0(),@y) -> c_36() #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #mult#(#0(),#0()) -> c_41() #mult#(#0(),#neg(@y)) -> c_42() #mult#(#0(),#pos(@y)) -> c_43() #mult#(#neg(@x),#0()) -> c_44() #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) #mult#(#pos(@x),#0()) -> c_47() #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) #natmult#(#0(),@y) -> c_50() #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)) #pred#(#0()) -> c_52() #pred#(#neg(#s(@x))) -> c_53() #pred#(#pos(#s(#0()))) -> c_54() #pred#(#pos(#s(#s(@x)))) -> c_55() #succ#(#0()) -> c_56() #succ#(#neg(#s(#0()))) -> c_57() #succ#(#neg(#s(#s(@x)))) -> c_58() #succ#(#pos(#s(@x))) -> c_59() *#(@x,@y) -> c_1(#mult#(@x,@y)) +#(@x,@y) -> c_2(#add#(@x,@y)) appendreverse#1#(nil(),@sofar) -> c_5() bftMult'#3#(nil(),@acc,@queue) -> c_11() computeLine#1#(nil(),@acc,@m) -> c_17() computeLine#2#(nil(),@acc,@x,@xs) -> c_19() dequeue#1#(::(@t,@ts),@inq) -> c_21() dequeue#2#(::(@t,@ts)) -> c_23() dequeue#2#(nil()) -> c_24() enqueue#1#(tuple#2(@outq,@inq),@t) -> c_26() lineMult#1#(nil(),@l2,@n) -> c_29() matrixMult#1#(nil(),@m2) -> c_34() Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/3,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/2,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/3,c_31/2,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimation {onSelection = all simple predecessor estimation selector} Proof: We estimate the number of application of {16} by application of Pre({16}) = {9}. Here rules are labelled as follows: 1: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 2: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) 3: bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t ,nil()) ,nil()) ,@acc)) 4: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) 5: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 6: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 7: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 8: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) 9: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) ,enqueue#(@t2 ,enqueue(@t1,@queue)) ,enqueue#(@t1,@queue)) 10: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) 11: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 12: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 13: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) 14: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 15: dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)) ,reverse#(@inq)) 16: enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) 17: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 18: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 19: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(+#(*(@x,@n),@y) ,*#(@x,@n) ,lineMult#(@n,@xs,@ys)) 20: lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n) ,lineMult#(@n,@xs,nil())) 21: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 22: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) 23: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) 24: #add#(#0(),@y) -> c_36() 25: #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) 26: #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)) ,@y)) ,#add#(#pos(#s(@x)),@y)) 27: #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) 28: #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)) ,@y)) ,#add#(#pos(#s(@x)),@y)) 29: #mult#(#0(),#0()) -> c_41() 30: #mult#(#0(),#neg(@y)) -> c_42() 31: #mult#(#0(),#pos(@y)) -> c_43() 32: #mult#(#neg(@x),#0()) -> c_44() 33: #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) 34: #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) 35: #mult#(#pos(@x),#0()) -> c_47() 36: #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) 37: #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) 38: #natmult#(#0(),@y) -> c_50() 39: #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y) ,#natmult(@x,@y)) ,#natmult#(@x,@y)) 40: #pred#(#0()) -> c_52() 41: #pred#(#neg(#s(@x))) -> c_53() 42: #pred#(#pos(#s(#0()))) -> c_54() 43: #pred#(#pos(#s(#s(@x)))) -> c_55() 44: #succ#(#0()) -> c_56() 45: #succ#(#neg(#s(#0()))) -> c_57() 46: #succ#(#neg(#s(#s(@x)))) -> c_58() 47: #succ#(#pos(#s(@x))) -> c_59() 48: *#(@x,@y) -> c_1(#mult#(@x,@y)) 49: +#(@x,@y) -> c_2(#add#(@x,@y)) 50: appendreverse#1#(nil() ,@sofar) -> c_5() 51: bftMult'#3#(nil() ,@acc ,@queue) -> c_11() 52: computeLine#1#(nil(),@acc,@m) -> c_17() 53: computeLine#2#(nil() ,@acc ,@x ,@xs) -> c_19() 54: dequeue#1#(::(@t,@ts),@inq) -> c_21() 55: dequeue#2#(::(@t,@ts)) -> c_23() 56: dequeue#2#(nil()) -> c_24() 57: enqueue#1#(tuple#2(@outq,@inq) ,@t) -> c_26() 58: lineMult#1#(nil(),@l2,@n) -> c_29() 59: matrixMult#1#(nil(),@m2) -> c_34() *** 1.1.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: #add#(#0(),@y) -> c_36() #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) #mult#(#0(),#0()) -> c_41() #mult#(#0(),#neg(@y)) -> c_42() #mult#(#0(),#pos(@y)) -> c_43() #mult#(#neg(@x),#0()) -> c_44() #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) #mult#(#pos(@x),#0()) -> c_47() #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) #natmult#(#0(),@y) -> c_50() #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)) #pred#(#0()) -> c_52() #pred#(#neg(#s(@x))) -> c_53() #pred#(#pos(#s(#0()))) -> c_54() #pred#(#pos(#s(#s(@x)))) -> c_55() #succ#(#0()) -> c_56() #succ#(#neg(#s(#0()))) -> c_57() #succ#(#neg(#s(#s(@x)))) -> c_58() #succ#(#pos(#s(@x))) -> c_59() *#(@x,@y) -> c_1(#mult#(@x,@y)) +#(@x,@y) -> c_2(#add#(@x,@y)) appendreverse#1#(nil(),@sofar) -> c_5() bftMult'#3#(nil(),@acc,@queue) -> c_11() computeLine#1#(nil(),@acc,@m) -> c_17() computeLine#2#(nil(),@acc,@x,@xs) -> c_19() dequeue#1#(::(@t,@ts),@inq) -> c_21() dequeue#2#(::(@t,@ts)) -> c_23() dequeue#2#(nil()) -> c_24() enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) enqueue#1#(tuple#2(@outq,@inq),@t) -> c_26() lineMult#1#(nil(),@l2,@n) -> c_29() matrixMult#1#(nil(),@m2) -> c_34() Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/3,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/2,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/3,c_31/2,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:S:appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) -->_1 appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))):2 -->_1 appendreverse#1#(nil(),@sofar) -> c_5():49 2:S:appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 3:S:bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 4:S:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) -->_2 bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)):6 -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):5 5:S:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):7 -->_1 bftMult'#3#(nil(),@acc,@queue) -> c_11():50 6:S:bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) -->_1 dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)):14 7:S:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)):9 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):8 8:S:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 9:S:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) -->_3 enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)):56 -->_2 enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)):56 -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)):10 10:S:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):20 -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 11:S:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):12 -->_1 computeLine#1#(nil(),@acc,@m) -> c_17():51 12:S:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)):13 -->_1 computeLine#2#(nil(),@acc,@x,@xs) -> c_19():52 13:S:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):11 14:S:dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) -->_1 dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)):15 -->_1 dequeue#1#(::(@t,@ts),@inq) -> c_21():53 15:S:dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) -->_2 reverse#(@xs) -> c_35(appendreverse#(@xs,nil())):22 -->_1 dequeue#2#(nil()) -> c_24():55 -->_1 dequeue#2#(::(@t,@ts)) -> c_23():54 16:S:lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) -->_1 lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)):17 -->_1 lineMult#1#(nil(),@l2,@n) -> c_29():58 17:S:lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) -->_1 lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())):19 -->_1 lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)):18 18:S:lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) -->_1 +#(@x,@y) -> c_2(#add#(@x,@y)):48 -->_2 *#(@x,@y) -> c_1(#mult#(@x,@y)):47 -->_3 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 19:S:lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) -->_1 *#(@x,@y) -> c_1(#mult#(@x,@y)):47 -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 20:S:matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)):21 -->_1 matrixMult#1#(nil(),@m2) -> c_34():59 21:S:matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):20 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):11 22:S:reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 23:W:#add#(#0(),@y) -> c_36() 24:W:#add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) -->_1 #pred#(#pos(#s(#s(@x)))) -> c_55():42 -->_1 #pred#(#pos(#s(#0()))) -> c_54():41 -->_1 #pred#(#neg(#s(@x))) -> c_53():40 -->_1 #pred#(#0()) -> c_52():39 25:W:#add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) -->_2 #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)):27 -->_2 #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)):26 -->_1 #pred#(#pos(#s(#s(@x)))) -> c_55():42 -->_1 #pred#(#pos(#s(#0()))) -> c_54():41 -->_1 #pred#(#neg(#s(@x))) -> c_53():40 -->_1 #pred#(#0()) -> c_52():39 26:W:#add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) -->_1 #succ#(#pos(#s(@x))) -> c_59():46 -->_1 #succ#(#neg(#s(#s(@x)))) -> c_58():45 -->_1 #succ#(#neg(#s(#0()))) -> c_57():44 -->_1 #succ#(#0()) -> c_56():43 27:W:#add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)) -->_1 #succ#(#pos(#s(@x))) -> c_59():46 -->_1 #succ#(#neg(#s(#s(@x)))) -> c_58():45 -->_1 #succ#(#neg(#s(#0()))) -> c_57():44 -->_1 #succ#(#0()) -> c_56():43 -->_2 #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)):27 -->_2 #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)):26 28:W:#mult#(#0(),#0()) -> c_41() 29:W:#mult#(#0(),#neg(@y)) -> c_42() 30:W:#mult#(#0(),#pos(@y)) -> c_43() 31:W:#mult#(#neg(@x),#0()) -> c_44() 32:W:#mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) -->_1 #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)):38 -->_1 #natmult#(#0(),@y) -> c_50():37 33:W:#mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) -->_1 #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)):38 -->_1 #natmult#(#0(),@y) -> c_50():37 34:W:#mult#(#pos(@x),#0()) -> c_47() 35:W:#mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) -->_1 #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)):38 -->_1 #natmult#(#0(),@y) -> c_50():37 36:W:#mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) -->_1 #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)):38 -->_1 #natmult#(#0(),@y) -> c_50():37 37:W:#natmult#(#0(),@y) -> c_50() 38:W:#natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)) -->_2 #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y),#natmult(@x,@y)),#natmult#(@x,@y)):38 -->_2 #natmult#(#0(),@y) -> c_50():37 -->_1 #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)):27 -->_1 #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)):26 39:W:#pred#(#0()) -> c_52() 40:W:#pred#(#neg(#s(@x))) -> c_53() 41:W:#pred#(#pos(#s(#0()))) -> c_54() 42:W:#pred#(#pos(#s(#s(@x)))) -> c_55() 43:W:#succ#(#0()) -> c_56() 44:W:#succ#(#neg(#s(#0()))) -> c_57() 45:W:#succ#(#neg(#s(#s(@x)))) -> c_58() 46:W:#succ#(#pos(#s(@x))) -> c_59() 47:W:*#(@x,@y) -> c_1(#mult#(@x,@y)) -->_1 #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)):36 -->_1 #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)):35 -->_1 #mult#(#pos(@x),#0()) -> c_47():34 -->_1 #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)):33 -->_1 #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)):32 -->_1 #mult#(#neg(@x),#0()) -> c_44():31 -->_1 #mult#(#0(),#pos(@y)) -> c_43():30 -->_1 #mult#(#0(),#neg(@y)) -> c_42():29 -->_1 #mult#(#0(),#0()) -> c_41():28 48:W:+#(@x,@y) -> c_2(#add#(@x,@y)) -->_1 #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)):27 -->_1 #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)):26 -->_1 #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)),@y)),#add#(#pos(#s(@x)),@y)):25 -->_1 #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)):24 -->_1 #add#(#0(),@y) -> c_36():23 49:W:appendreverse#1#(nil(),@sofar) -> c_5() 50:W:bftMult'#3#(nil(),@acc,@queue) -> c_11() 51:W:computeLine#1#(nil(),@acc,@m) -> c_17() 52:W:computeLine#2#(nil(),@acc,@x,@xs) -> c_19() 53:W:dequeue#1#(::(@t,@ts),@inq) -> c_21() 54:W:dequeue#2#(::(@t,@ts)) -> c_23() 55:W:dequeue#2#(nil()) -> c_24() 56:W:enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) -->_1 enqueue#1#(tuple#2(@outq,@inq),@t) -> c_26():57 57:W:enqueue#1#(tuple#2(@outq,@inq),@t) -> c_26() 58:W:lineMult#1#(nil(),@l2,@n) -> c_29() 59:W:matrixMult#1#(nil(),@m2) -> c_34() The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 50: bftMult'#3#(nil() ,@acc ,@queue) -> c_11() 59: matrixMult#1#(nil(),@m2) -> c_34() 51: computeLine#1#(nil(),@acc,@m) -> c_17() 52: computeLine#2#(nil() ,@acc ,@x ,@xs) -> c_19() 58: lineMult#1#(nil(),@l2,@n) -> c_29() 48: +#(@x,@y) -> c_2(#add#(@x,@y)) 23: #add#(#0(),@y) -> c_36() 24: #add#(#neg(#s(#0())),@y) -> c_37(#pred#(@y)) 25: #add#(#neg(#s(#s(@x))),@y) -> c_38(#pred#(#add(#pos(#s(@x)) ,@y)) ,#add#(#pos(#s(@x)),@y)) 39: #pred#(#0()) -> c_52() 40: #pred#(#neg(#s(@x))) -> c_53() 41: #pred#(#pos(#s(#0()))) -> c_54() 42: #pred#(#pos(#s(#s(@x)))) -> c_55() 47: *#(@x,@y) -> c_1(#mult#(@x,@y)) 28: #mult#(#0(),#0()) -> c_41() 29: #mult#(#0(),#neg(@y)) -> c_42() 30: #mult#(#0(),#pos(@y)) -> c_43() 31: #mult#(#neg(@x),#0()) -> c_44() 32: #mult#(#neg(@x),#neg(@y)) -> c_45(#natmult#(@x,@y)) 33: #mult#(#neg(@x),#pos(@y)) -> c_46(#natmult#(@x,@y)) 34: #mult#(#pos(@x),#0()) -> c_47() 35: #mult#(#pos(@x),#neg(@y)) -> c_48(#natmult#(@x,@y)) 36: #mult#(#pos(@x),#pos(@y)) -> c_49(#natmult#(@x,@y)) 38: #natmult#(#s(@x),@y) -> c_51(#add#(#pos(@y) ,#natmult(@x,@y)) ,#natmult#(@x,@y)) 27: #add#(#pos(#s(#s(@x))),@y) -> c_40(#succ#(#add(#pos(#s(@x)) ,@y)) ,#add#(#pos(#s(@x)),@y)) 26: #add#(#pos(#s(#0())),@y) -> c_39(#succ#(@y)) 43: #succ#(#0()) -> c_56() 44: #succ#(#neg(#s(#0()))) -> c_57() 45: #succ#(#neg(#s(#s(@x)))) -> c_58() 46: #succ#(#pos(#s(@x))) -> c_59() 37: #natmult#(#0(),@y) -> c_50() 56: enqueue#(@t,@queue) -> c_25(enqueue#1#(@queue,@t)) 57: enqueue#1#(tuple#2(@outq,@inq) ,@t) -> c_26() 53: dequeue#1#(::(@t,@ts),@inq) -> c_21() 54: dequeue#2#(::(@t,@ts)) -> c_23() 55: dequeue#2#(nil()) -> c_24() 49: appendreverse#1#(nil() ,@sofar) -> c_5() *** 1.1.1.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/3,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/2,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/3,c_31/2,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: SimplifyRHS Proof: Consider the dependency graph 1:S:appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) -->_1 appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))):2 2:S:appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 3:S:bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 4:S:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) -->_2 bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)):6 -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):5 5:S:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):7 6:S:bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) -->_1 dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)):14 7:S:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)):9 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):8 8:S:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 9:S:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y),enqueue#(@t2,enqueue(@t1,@queue)),enqueue#(@t1,@queue)) -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)):10 10:S:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):20 -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 11:S:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):12 12:S:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)):13 13:S:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):11 14:S:dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) -->_1 dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)):15 15:S:dequeue#1#(nil(),@inq) -> c_22(dequeue#2#(reverse(@inq)),reverse#(@inq)) -->_2 reverse#(@xs) -> c_35(appendreverse#(@xs,nil())):22 16:S:lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) -->_1 lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)):17 17:S:lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) -->_1 lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())):19 -->_1 lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)):18 18:S:lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(+#(*(@x,@n),@y),*#(@x,@n),lineMult#(@n,@xs,@ys)) -->_3 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 19:S:lineMult#2#(nil(),@n,@x,@xs) -> c_31(*#(@x,@n),lineMult#(@n,@xs,nil())) -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 20:S:matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)):21 21:S:matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):20 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):11 22:S:reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 Due to missing edges in the depndency graph, the right-hand sides of following rules could be simplified: bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) *** 1.1.1.1.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveHeads Proof: Consider the dependency graph 1:S:appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) -->_1 appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))):2 2:S:appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 3:S:bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 4:S:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) -->_2 bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)):6 -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):5 5:S:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):7 6:S:bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) -->_1 dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)):14 7:S:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)):9 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):8 8:S:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 9:S:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)):10 10:S:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):20 -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 11:S:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):12 12:S:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)):13 13:S:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):11 14:S:dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) -->_1 dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)):15 15:S:dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) -->_1 reverse#(@xs) -> c_35(appendreverse#(@xs,nil())):22 16:S:lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) -->_1 lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)):17 17:S:lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) -->_1 lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())):19 -->_1 lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)):18 18:S:lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 19:S:lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 20:S:matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)):21 21:S:matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):20 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):11 22:S:reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 Following roots of the dependency graph are removed, as the considered set of starting terms is closed under reduction with respect to these rules (modulo compound contexts). [(3,bftMult#(@t,@acc) -> c_6(bftMult'#(tuple#2(::(@t,nil()),nil()),@acc)))] *** 1.1.1.1.1.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Decompose {onSelection = all cycle independent sub-graph, withBound = RelativeAdd} Proof: We analyse the complexity of following sub-problems (R) and (S). Problem (S) is obtained from the input problem by shifting strict rules from (R) into the weak component. Problem (R) Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Problem (S) Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} *** 1.1.1.1.1.1.1.1.1 Progress [(?,O(n^2))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:S:appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) -->_1 appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))):2 2:S:appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 4:W:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) -->_2 bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)):6 -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):5 5:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):7 6:W:bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) -->_1 dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)):14 7:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)):9 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):8 8:W:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 9:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)):10 10:W:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):20 -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 11:W:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):12 12:W:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)):13 13:W:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):11 14:W:dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) -->_1 dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)):15 15:W:dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) -->_1 reverse#(@xs) -> c_35(appendreverse#(@xs,nil())):22 16:W:lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) -->_1 lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)):17 17:W:lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) -->_1 lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())):19 -->_1 lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)):18 18:W:lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 19:W:lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):16 20:W:matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)):21 21:W:matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):11 -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):20 22:W:reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 20: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 21: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) 11: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 13: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) 12: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 16: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 19: lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) 17: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 18: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(lineMult#(@n ,@xs ,@ys)) *** 1.1.1.1.1.1.1.1.1.1 Progress [(?,O(n^2))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: SimplifyRHS Proof: Consider the dependency graph 1:S:appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) -->_1 appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))):2 2:S:appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 4:W:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) -->_2 bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)):6 -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):5 5:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):7 6:W:bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) -->_1 dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)):14 7:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)):9 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):8 8:W:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 9:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)):10 10:W:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):4 14:W:dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) -->_1 dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)):15 15:W:dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) -->_1 reverse#(@xs) -> c_35(appendreverse#(@xs,nil())):22 22:W:reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 Due to missing edges in the depndency graph, the right-hand sides of following rules could be simplified: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))) *** 1.1.1.1.1.1.1.1.1.1.1 Progress [(?,O(n^2))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: DecomposeDG {onSelection = all below first cut in WDG, onUpper = Just someStrategy, onLower = Nothing} Proof: We decompose the input problem according to the dependency graph into the upper component bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))) and a lower component appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Further, following extension rules are added to the lower component. bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) *** 1.1.1.1.1.1.1.1.1.1.1.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) Strict TRS Rules: Weak DP Rules: bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimationCP {onSelectionCP = any intersect of rules of CDG leaf and strict-rules, withComplexityPair = NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}} Proof: We first use the processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy} to orient following rules strictly: 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) Consider the set of all dependency pairs 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 3: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 4: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) 5: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) 6: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y))) Processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}induces the complexity certificateTIME (?,O(n^1)) SPACE(?,?)on application of the dependency pairs {1} These cover all (indirect) predecessors of dependency pairs {1,2,3,4,5,6} their number of applications is equally bounded. The dependency pairs are shifted into the weak component. *** 1.1.1.1.1.1.1.1.1.1.1.1.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) Strict TRS Rules: Weak DP Rules: bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Just first alternative for predecessorEstimation any intersect of rules of CDG leaf and strict-rules, greedy = NoGreedy} Proof: We apply a matrix interpretation of kind constructor based matrix interpretation: The following argument positions are considered usable: uargs(c_7) = {1}, uargs(c_8) = {1}, uargs(c_10) = {1}, uargs(c_12) = {1}, uargs(c_13) = {1}, uargs(c_14) = {1} Following symbols are considered usable: {appendreverse,appendreverse#1,bftMult'#2,dequeue,dequeue#1,dequeue#2,enqueue,enqueue#1,reverse,#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#} TcT has computed the following interpretation: p(#0) = [2] p(#add) = [2] x1 + [1] p(#mult) = [4] x2 + [2] p(#natmult) = [0] p(#neg) = [1] x1 + [3] p(#pos) = [1] x1 + [2] p(#pred) = [2] x1 + [2] p(#s) = [1] x1 + [0] p(#succ) = [0] p(*) = [4] x1 + [0] p(+) = [0] p(::) = [1] x1 + [1] x2 + [0] p(appendreverse) = [1] x1 + [1] x2 + [0] p(appendreverse#1) = [1] x1 + [1] x2 + [0] p(bftMult) = [1] p(bftMult') = [1] x1 + [1] x2 + [0] p(bftMult'#1) = [1] p(bftMult'#2) = [1] x1 + [0] p(bftMult'#3) = [1] x1 + [1] p(bftMult'#4) = [1] x1 + [4] p(bftMult'#5) = [4] x2 + [0] p(computeLine) = [6] x2 + [2] p(computeLine#1) = [2] p(computeLine#2) = [2] x2 + [4] x3 + [1] x4 + [5] p(dequeue) = [1] x1 + [1] x2 + [0] p(dequeue#1) = [1] x1 + [1] x2 + [0] p(dequeue#2) = [1] x1 + [0] p(enqueue) = [1] x1 + [1] x2 + [0] p(enqueue#1) = [1] x1 + [1] x2 + [0] p(leaf) = [3] p(lineMult) = [1] x1 + [2] p(lineMult#1) = [4] p(lineMult#2) = [0] p(matrixMult) = [0] p(matrixMult#1) = [4] p(nil) = [0] p(node) = [1] x2 + [1] x3 + [6] p(reverse) = [1] x1 + [0] p(tuple#2) = [1] x1 + [1] x2 + [0] p(#add#) = [1] x1 + [4] x2 + [0] p(#mult#) = [4] x1 + [4] p(#natmult#) = [1] x1 + [1] x2 + [0] p(#pred#) = [2] x1 + [1] p(#succ#) = [1] x1 + [2] p(*#) = [1] x1 + [0] p(+#) = [2] x2 + [2] p(appendreverse#) = [1] x1 + [0] p(appendreverse#1#) = [0] p(bftMult#) = [1] x1 + [1] p(bftMult'#) = [1] x1 + [3] p(bftMult'#1#) = [1] x1 + [0] p(bftMult'#2#) = [1] x1 + [4] p(bftMult'#3#) = [1] x1 + [1] x3 + [0] p(bftMult'#4#) = [1] x1 + [1] x3 + [0] p(bftMult'#5#) = [1] x1 + [3] p(computeLine#) = [1] x1 + [2] p(computeLine#1#) = [1] x2 + [2] p(computeLine#2#) = [1] x1 + [2] x2 + [0] p(dequeue#) = [1] x1 + [1] x2 + [0] p(dequeue#1#) = [1] x1 + [4] x2 + [2] p(dequeue#2#) = [1] p(enqueue#) = [0] p(enqueue#1#) = [1] p(lineMult#) = [1] p(lineMult#1#) = [2] x2 + [1] x3 + [1] p(lineMult#2#) = [2] x3 + [1] x4 + [0] p(matrixMult#) = [2] p(matrixMult#1#) = [1] x1 + [0] p(reverse#) = [1] p(c_1) = [1] x1 + [1] p(c_2) = [1] x1 + [0] p(c_3) = [1] x1 + [2] p(c_4) = [4] x1 + [2] p(c_5) = [1] p(c_6) = [2] x1 + [1] p(c_7) = [1] x1 + [1] p(c_8) = [1] x1 + [0] p(c_9) = [1] x1 + [1] p(c_10) = [1] x1 + [0] p(c_11) = [1] p(c_12) = [1] x1 + [0] p(c_13) = [1] x1 + [3] p(c_14) = [1] x1 + [0] p(c_15) = [1] x1 + [0] p(c_16) = [1] x1 + [0] p(c_17) = [0] p(c_18) = [1] x1 + [1] p(c_19) = [1] p(c_20) = [4] p(c_21) = [4] p(c_22) = [0] p(c_23) = [1] p(c_24) = [1] p(c_25) = [0] p(c_26) = [0] p(c_27) = [4] p(c_28) = [1] x1 + [0] p(c_29) = [0] p(c_30) = [4] x1 + [4] p(c_31) = [2] x1 + [4] p(c_32) = [4] p(c_33) = [4] x1 + [0] p(c_34) = [1] p(c_35) = [1] x1 + [1] p(c_36) = [1] p(c_37) = [4] p(c_38) = [0] p(c_39) = [0] p(c_40) = [0] p(c_41) = [0] p(c_42) = [0] p(c_43) = [1] p(c_44) = [0] p(c_45) = [2] x1 + [1] p(c_46) = [1] p(c_47) = [0] p(c_48) = [1] p(c_49) = [1] x1 + [0] p(c_50) = [1] p(c_51) = [1] p(c_52) = [0] p(c_53) = [1] p(c_54) = [0] p(c_55) = [1] p(c_56) = [1] p(c_57) = [0] p(c_58) = [0] p(c_59) = [0] Following rules are strictly oriented: bftMult'#(@queue,@acc) = [1] @queue + [3] > [1] @queue + [1] = c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) Following rules are (at-least) weakly oriented: bftMult'#1#(tuple#2(@elem = [1] @elem + [1] @queue + [0] ,@queue) ,@acc) >= [1] @elem + [1] @queue + [0] = c_8(bftMult'#3#(@elem ,@acc ,@queue)) bftMult'#3#(::(@t,@_@3) = [1] @_@3 + [1] @queue + [1] @t + [0] ,@acc ,@queue) >= [1] @queue + [1] @t + [0] = c_10(bftMult'#4#(@t ,@acc ,@queue)) bftMult'#4#(leaf(),@acc,@queue) = [1] @queue + [3] >= [1] @queue + [3] = c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2) = [1] @queue + [1] @t1 + [1] @t2 + [6] ,@acc ,@queue) >= [1] @queue + [1] @t1 + [1] @t2 + [6] = c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) bftMult'#5#(@queue',@acc,@y) = [1] @queue' + [3] >= [1] @queue' + [3] = c_14(bftMult'#(@queue' ,matrixMult(@acc,@y))) appendreverse(@toreverse,@sofar) = [1] @sofar + [1] @toreverse + [0] >= [1] @sofar + [1] @toreverse + [0] = appendreverse#1(@toreverse ,@sofar) appendreverse#1(::(@a,@as) = [1] @a + [1] @as + [1] @sofar + [0] ,@sofar) >= [1] @a + [1] @as + [1] @sofar + [0] = appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) = [1] @sofar + [0] >= [1] @sofar + [0] = @sofar bftMult'#2(tuple#2(@dequeue@1 = [1] @dequeue@1 + [1] @dequeue@2 + [0] ,@dequeue@2)) >= [1] @dequeue@1 + [1] @dequeue@2 + [0] = dequeue(@dequeue@1,@dequeue@2) dequeue(@outq,@inq) = [1] @inq + [1] @outq + [0] >= [1] @inq + [1] @outq + [0] = dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) = [1] @inq + [1] @t + [1] @ts + [0] >= [1] @inq + [1] @t + [1] @ts + [0] = tuple#2(::(@t,nil()) ,tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) = [1] @inq + [0] >= [1] @inq + [0] = dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) = [1] @t + [1] @ts + [0] >= [1] @t + [1] @ts + [0] = tuple#2(::(@t,nil()) ,tuple#2(@ts,nil())) dequeue#2(nil()) = [0] >= [0] = tuple#2(nil() ,tuple#2(nil(),nil())) enqueue(@t,@queue) = [1] @queue + [1] @t + [0] >= [1] @queue + [1] @t + [0] = enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq) = [1] @inq + [1] @outq + [1] @t + [0] ,@t) >= [1] @inq + [1] @outq + [1] @t + [0] = tuple#2(@outq,::(@t,@inq)) reverse(@xs) = [1] @xs + [0] >= [1] @xs + [0] = appendreverse(@xs,nil()) *** 1.1.1.1.1.1.1.1.1.1.1.1.1.1 Progress [(?,O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Assumption Proof: () *** 1.1.1.1.1.1.1.1.1.1.1.1.2 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:W:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):2 2:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):3 3:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)):5 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):4 4:W:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):1 5:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))):6 6:W:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y))) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):1 The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) 6: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y))) 5: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) 3: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 4: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) *** 1.1.1.1.1.1.1.1.1.1.1.1.2.1 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: EmptyProcessor Proof: The problem is already closed. The intended complexity is O(1). *** 1.1.1.1.1.1.1.1.1.1.1.2 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimationCP {onSelectionCP = any intersect of rules of CDG leaf and strict-rules, withComplexityPair = NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}} Proof: We first use the processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy} to orient following rules strictly: 2: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) The strictly oriented rules are moved into the weak component. *** 1.1.1.1.1.1.1.1.1.1.1.2.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Just first alternative for predecessorEstimation any intersect of rules of CDG leaf and strict-rules, greedy = NoGreedy} Proof: We apply a matrix interpretation of kind constructor based matrix interpretation: The following argument positions are considered usable: uargs(c_3) = {1}, uargs(c_4) = {1}, uargs(c_9) = {1}, uargs(c_20) = {1}, uargs(c_22) = {1}, uargs(c_35) = {1} Following symbols are considered usable: {appendreverse,appendreverse#1,bftMult'#2,dequeue,dequeue#1,dequeue#2,enqueue,enqueue#1,reverse,#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#} TcT has computed the following interpretation: p(#0) = [2] p(#add) = [2] x1 + [6] p(#mult) = [2] x2 + [2] p(#natmult) = [4] x2 + [7] p(#neg) = [0] p(#pos) = [1] x1 + [0] p(#pred) = [1] x1 + [2] p(#s) = [1] x1 + [0] p(#succ) = [0] p(*) = [4] x2 + [0] p(+) = [0] p(::) = [1] x1 + [1] x2 + [2] p(appendreverse) = [1] x1 + [1] x2 + [0] p(appendreverse#1) = [1] x1 + [1] x2 + [0] p(bftMult) = [1] x1 + [0] p(bftMult') = [0] p(bftMult'#1) = [0] p(bftMult'#2) = [1] x1 + [0] p(bftMult'#3) = [1] x2 + [0] p(bftMult'#4) = [0] p(bftMult'#5) = [0] p(computeLine) = [1] x3 + [6] p(computeLine#1) = [4] x1 + [0] p(computeLine#2) = [0] p(dequeue) = [1] x1 + [1] x2 + [0] p(dequeue#1) = [1] x1 + [1] x2 + [0] p(dequeue#2) = [1] x1 + [0] p(enqueue) = [1] x1 + [1] x2 + [2] p(enqueue#1) = [1] x1 + [1] x2 + [2] p(leaf) = [0] p(lineMult) = [2] x1 + [1] p(lineMult#1) = [0] p(lineMult#2) = [0] p(matrixMult) = [0] p(matrixMult#1) = [1] p(nil) = [0] p(node) = [1] x1 + [1] x2 + [1] x3 + [4] p(reverse) = [1] x1 + [0] p(tuple#2) = [1] x1 + [1] x2 + [0] p(#add#) = [0] p(#mult#) = [0] p(#natmult#) = [0] p(#pred#) = [0] p(#succ#) = [0] p(*#) = [0] p(+#) = [0] p(appendreverse#) = [1] x1 + [0] p(appendreverse#1#) = [1] x1 + [0] p(bftMult#) = [0] p(bftMult'#) = [2] x1 + [0] p(bftMult'#1#) = [2] x1 + [0] p(bftMult'#2#) = [2] x1 + [0] p(bftMult'#3#) = [2] x1 + [2] x3 + [0] p(bftMult'#4#) = [2] x1 + [2] x3 + [0] p(bftMult'#5#) = [2] x1 + [0] p(computeLine#) = [0] p(computeLine#1#) = [0] p(computeLine#2#) = [2] x2 + [0] p(dequeue#) = [1] x1 + [1] x2 + [0] p(dequeue#1#) = [1] x1 + [1] x2 + [0] p(dequeue#2#) = [0] p(enqueue#) = [0] p(enqueue#1#) = [0] p(lineMult#) = [0] p(lineMult#1#) = [0] p(lineMult#2#) = [0] p(matrixMult#) = [0] p(matrixMult#1#) = [1] x1 + [1] x2 + [0] p(reverse#) = [1] x1 + [0] p(c_1) = [0] p(c_2) = [0] p(c_3) = [1] x1 + [0] p(c_4) = [1] x1 + [0] p(c_5) = [0] p(c_6) = [4] x1 + [0] p(c_7) = [0] p(c_8) = [0] p(c_9) = [2] x1 + [0] p(c_10) = [0] p(c_11) = [0] p(c_12) = [4] x1 + [0] p(c_13) = [0] p(c_14) = [0] p(c_15) = [0] p(c_16) = [0] p(c_17) = [0] p(c_18) = [0] p(c_19) = [0] p(c_20) = [1] x1 + [0] p(c_21) = [0] p(c_22) = [1] x1 + [0] p(c_23) = [0] p(c_24) = [0] p(c_25) = [1] x1 + [0] p(c_26) = [0] p(c_27) = [0] p(c_28) = [0] p(c_29) = [0] p(c_30) = [0] p(c_31) = [0] p(c_32) = [0] p(c_33) = [2] p(c_34) = [1] p(c_35) = [1] x1 + [0] p(c_36) = [0] p(c_37) = [0] p(c_38) = [0] p(c_39) = [0] p(c_40) = [0] p(c_41) = [0] p(c_42) = [0] p(c_43) = [0] p(c_44) = [0] p(c_45) = [0] p(c_46) = [0] p(c_47) = [0] p(c_48) = [0] p(c_49) = [0] p(c_50) = [0] p(c_51) = [0] p(c_52) = [0] p(c_53) = [0] p(c_54) = [0] p(c_55) = [0] p(c_56) = [0] p(c_57) = [4] p(c_58) = [2] p(c_59) = [0] Following rules are strictly oriented: appendreverse#1#(::(@a,@as) = [1] @a + [1] @as + [2] ,@sofar) > [1] @as + [0] = c_4(appendreverse#(@as ,::(@a,@sofar))) Following rules are (at-least) weakly oriented: appendreverse#(@toreverse = [1] @toreverse + [0] ,@sofar) >= [1] @toreverse + [0] = c_3(appendreverse#1#(@toreverse ,@sofar)) bftMult'#(@queue,@acc) = [2] @queue + [0] >= [2] @queue + [0] = bftMult'#1#(bftMult'#2(@queue) ,@acc) bftMult'#(@queue,@acc) = [2] @queue + [0] >= [2] @queue + [0] = bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem = [2] @elem + [2] @queue + [0] ,@queue) ,@acc) >= [2] @elem + [2] @queue + [0] = bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1 = [2] @dequeue@1 + [2] @dequeue@2 + [0] ,@dequeue@2)) >= [2] @dequeue@1 + [2] @dequeue@2 + [0] = c_9(dequeue#(@dequeue@1 ,@dequeue@2)) bftMult'#3#(::(@t,@_@3) = [2] @_@3 + [2] @queue + [2] @t + [4] ,@acc ,@queue) >= [2] @queue + [2] @t + [0] = bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) = [2] @queue + [0] >= [2] @queue + [0] = bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2) = [2] @queue + [2] @t1 + [2] @t2 + [2] @y + [8] ,@acc ,@queue) >= [2] @queue + [2] @t1 + [2] @t2 + [8] = bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) bftMult'#5#(@queue',@acc,@y) = [2] @queue' + [0] >= [2] @queue' + [0] = bftMult'#(@queue' ,matrixMult(@acc,@y)) dequeue#(@outq,@inq) = [1] @inq + [1] @outq + [0] >= [1] @inq + [1] @outq + [0] = c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) = [1] @inq + [0] >= [1] @inq + [0] = c_22(reverse#(@inq)) reverse#(@xs) = [1] @xs + [0] >= [1] @xs + [0] = c_35(appendreverse#(@xs,nil())) appendreverse(@toreverse,@sofar) = [1] @sofar + [1] @toreverse + [0] >= [1] @sofar + [1] @toreverse + [0] = appendreverse#1(@toreverse ,@sofar) appendreverse#1(::(@a,@as) = [1] @a + [1] @as + [1] @sofar + [2] ,@sofar) >= [1] @a + [1] @as + [1] @sofar + [2] = appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) = [1] @sofar + [0] >= [1] @sofar + [0] = @sofar bftMult'#2(tuple#2(@dequeue@1 = [1] @dequeue@1 + [1] @dequeue@2 + [0] ,@dequeue@2)) >= [1] @dequeue@1 + [1] @dequeue@2 + [0] = dequeue(@dequeue@1,@dequeue@2) dequeue(@outq,@inq) = [1] @inq + [1] @outq + [0] >= [1] @inq + [1] @outq + [0] = dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) = [1] @inq + [1] @t + [1] @ts + [2] >= [1] @inq + [1] @t + [1] @ts + [2] = tuple#2(::(@t,nil()) ,tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) = [1] @inq + [0] >= [1] @inq + [0] = dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) = [1] @t + [1] @ts + [2] >= [1] @t + [1] @ts + [2] = tuple#2(::(@t,nil()) ,tuple#2(@ts,nil())) dequeue#2(nil()) = [0] >= [0] = tuple#2(nil() ,tuple#2(nil(),nil())) enqueue(@t,@queue) = [1] @queue + [1] @t + [2] >= [1] @queue + [1] @t + [2] = enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq) = [1] @inq + [1] @outq + [1] @t + [2] ,@t) >= [1] @inq + [1] @outq + [1] @t + [2] = tuple#2(@outq,::(@t,@inq)) reverse(@xs) = [1] @xs + [0] >= [1] @xs + [0] = appendreverse(@xs,nil()) *** 1.1.1.1.1.1.1.1.1.1.1.2.1.1 Progress [(?,O(1))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) Strict TRS Rules: Weak DP Rules: appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Assumption Proof: () *** 1.1.1.1.1.1.1.1.1.1.1.2.2 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) Strict TRS Rules: Weak DP Rules: appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimationCP {onSelectionCP = any intersect of rules of CDG leaf and strict-rules, withComplexityPair = NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}} Proof: We first use the processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy} to orient following rules strictly: 1: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) Consider the set of all dependency pairs 1: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 2: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) 3: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue) ,@acc) 4: bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) 5: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> bftMult'#3#(@elem ,@acc ,@queue) 6: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 7: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> bftMult'#4#(@t ,@acc ,@queue) 8: bftMult'#4#(leaf() ,@acc ,@queue) -> bftMult'#(@queue ,@acc) 9: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) 10: bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue' ,matrixMult(@acc,@y)) 11: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 12: dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) 13: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}induces the complexity certificateTIME (?,O(n^1)) SPACE(?,?)on application of the dependency pairs {1} These cover all (indirect) predecessors of dependency pairs {1,2} their number of applications is equally bounded. The dependency pairs are shifted into the weak component. *** 1.1.1.1.1.1.1.1.1.1.1.2.2.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) Strict TRS Rules: Weak DP Rules: appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Just first alternative for predecessorEstimation any intersect of rules of CDG leaf and strict-rules, greedy = NoGreedy} Proof: We apply a matrix interpretation of kind constructor based matrix interpretation: The following argument positions are considered usable: uargs(c_3) = {1}, uargs(c_4) = {1}, uargs(c_9) = {1}, uargs(c_20) = {1}, uargs(c_22) = {1}, uargs(c_35) = {1} Following symbols are considered usable: {appendreverse,appendreverse#1,bftMult'#2,dequeue,dequeue#1,dequeue#2,enqueue,enqueue#1,reverse,#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#} TcT has computed the following interpretation: p(#0) = [0] p(#add) = [1] p(#mult) = [1] x1 + [4] x2 + [0] p(#natmult) = [0] p(#neg) = [1] p(#pos) = [1] p(#pred) = [0] p(#s) = [2] p(#succ) = [6] x1 + [1] p(*) = [4] x1 + [2] x2 + [1] p(+) = [3] x1 + [2] p(::) = [1] x1 + [1] x2 + [1] p(appendreverse) = [1] x1 + [1] x2 + [0] p(appendreverse#1) = [1] x1 + [1] x2 + [0] p(bftMult) = [0] p(bftMult') = [0] p(bftMult'#1) = [1] x1 + [0] p(bftMult'#2) = [1] x1 + [0] p(bftMult'#3) = [0] p(bftMult'#4) = [1] x1 + [1] x2 + [4] x3 + [2] p(bftMult'#5) = [1] x3 + [0] p(computeLine) = [1] x3 + [7] p(computeLine#1) = [4] x1 + [1] x3 + [1] p(computeLine#2) = [1] x3 + [2] x4 + [0] p(dequeue) = [1] x1 + [1] x2 + [0] p(dequeue#1) = [1] x1 + [1] x2 + [0] p(dequeue#2) = [1] x1 + [0] p(enqueue) = [1] x1 + [1] x2 + [2] p(enqueue#1) = [1] x1 + [1] x2 + [1] p(leaf) = [0] p(lineMult) = [5] x1 + [5] x3 + [1] p(lineMult#1) = [1] x1 + [1] x2 + [1] x3 + [2] p(lineMult#2) = [3] x1 + [1] x4 + [6] p(matrixMult) = [1] x2 + [0] p(matrixMult#1) = [4] p(nil) = [0] p(node) = [1] x2 + [1] x3 + [3] p(reverse) = [1] x1 + [0] p(tuple#2) = [1] x1 + [1] x2 + [0] p(#add#) = [1] x1 + [1] x2 + [0] p(#mult#) = [2] x1 + [2] p(#natmult#) = [4] x1 + [1] p(#pred#) = [0] p(#succ#) = [1] p(*#) = [1] x1 + [4] p(+#) = [1] p(appendreverse#) = [1] x1 + [1] p(appendreverse#1#) = [1] x1 + [0] p(bftMult#) = [1] x1 + [0] p(bftMult'#) = [1] x1 + [2] p(bftMult'#1#) = [1] x1 + [2] p(bftMult'#2#) = [1] x1 + [2] p(bftMult'#3#) = [1] x1 + [1] x3 + [2] p(bftMult'#4#) = [1] x1 + [1] x3 + [3] p(bftMult'#5#) = [1] x1 + [2] p(computeLine#) = [2] x1 + [4] x2 + [1] p(computeLine#1#) = [2] p(computeLine#2#) = [2] x4 + [0] p(dequeue#) = [1] x2 + [1] p(dequeue#1#) = [1] x2 + [1] p(dequeue#2#) = [2] p(enqueue#) = [1] x1 + [4] x2 + [1] p(enqueue#1#) = [1] x1 + [0] p(lineMult#) = [1] x1 + [0] p(lineMult#1#) = [1] x1 + [1] p(lineMult#2#) = [1] x1 + [1] x4 + [0] p(matrixMult#) = [1] p(matrixMult#1#) = [1] x1 + [1] p(reverse#) = [1] x1 + [1] p(c_1) = [0] p(c_2) = [1] x1 + [1] p(c_3) = [1] x1 + [0] p(c_4) = [1] x1 + [0] p(c_5) = [0] p(c_6) = [0] p(c_7) = [0] p(c_8) = [4] p(c_9) = [1] x1 + [1] p(c_10) = [0] p(c_11) = [1] p(c_12) = [0] p(c_13) = [1] p(c_14) = [0] p(c_15) = [1] x1 + [1] p(c_16) = [1] x1 + [0] p(c_17) = [4] p(c_18) = [2] x1 + [1] x2 + [0] p(c_19) = [2] p(c_20) = [1] x1 + [0] p(c_21) = [2] p(c_22) = [1] x1 + [0] p(c_23) = [0] p(c_24) = [4] p(c_25) = [0] p(c_26) = [4] p(c_27) = [0] p(c_28) = [1] x1 + [1] p(c_29) = [2] p(c_30) = [1] x1 + [4] p(c_31) = [1] p(c_32) = [1] x1 + [0] p(c_33) = [1] x1 + [4] x2 + [0] p(c_34) = [0] p(c_35) = [1] x1 + [0] p(c_36) = [0] p(c_37) = [1] x1 + [0] p(c_38) = [1] p(c_39) = [1] p(c_40) = [1] x1 + [1] x2 + [1] p(c_41) = [0] p(c_42) = [0] p(c_43) = [0] p(c_44) = [2] p(c_45) = [0] p(c_46) = [1] x1 + [0] p(c_47) = [4] p(c_48) = [4] x1 + [1] p(c_49) = [0] p(c_50) = [4] p(c_51) = [1] x2 + [0] p(c_52) = [0] p(c_53) = [0] p(c_54) = [1] p(c_55) = [2] p(c_56) = [0] p(c_57) = [1] p(c_58) = [1] p(c_59) = [0] Following rules are strictly oriented: appendreverse#(@toreverse = [1] @toreverse + [1] ,@sofar) > [1] @toreverse + [0] = c_3(appendreverse#1#(@toreverse ,@sofar)) Following rules are (at-least) weakly oriented: appendreverse#1#(::(@a,@as) = [1] @a + [1] @as + [1] ,@sofar) >= [1] @as + [1] = c_4(appendreverse#(@as ,::(@a,@sofar))) bftMult'#(@queue,@acc) = [1] @queue + [2] >= [1] @queue + [2] = bftMult'#1#(bftMult'#2(@queue) ,@acc) bftMult'#(@queue,@acc) = [1] @queue + [2] >= [1] @queue + [2] = bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem = [1] @elem + [1] @queue + [2] ,@queue) ,@acc) >= [1] @elem + [1] @queue + [2] = bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1 = [1] @dequeue@1 + [1] @dequeue@2 + [2] ,@dequeue@2)) >= [1] @dequeue@2 + [2] = c_9(dequeue#(@dequeue@1 ,@dequeue@2)) bftMult'#3#(::(@t,@_@3) = [1] @_@3 + [1] @queue + [1] @t + [3] ,@acc ,@queue) >= [1] @queue + [1] @t + [3] = bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) = [1] @queue + [3] >= [1] @queue + [2] = bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2) = [1] @queue + [1] @t1 + [1] @t2 + [6] ,@acc ,@queue) >= [1] @queue + [1] @t1 + [1] @t2 + [6] = bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) bftMult'#5#(@queue',@acc,@y) = [1] @queue' + [2] >= [1] @queue' + [2] = bftMult'#(@queue' ,matrixMult(@acc,@y)) dequeue#(@outq,@inq) = [1] @inq + [1] >= [1] @inq + [1] = c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) = [1] @inq + [1] >= [1] @inq + [1] = c_22(reverse#(@inq)) reverse#(@xs) = [1] @xs + [1] >= [1] @xs + [1] = c_35(appendreverse#(@xs,nil())) appendreverse(@toreverse,@sofar) = [1] @sofar + [1] @toreverse + [0] >= [1] @sofar + [1] @toreverse + [0] = appendreverse#1(@toreverse ,@sofar) appendreverse#1(::(@a,@as) = [1] @a + [1] @as + [1] @sofar + [1] ,@sofar) >= [1] @a + [1] @as + [1] @sofar + [1] = appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) = [1] @sofar + [0] >= [1] @sofar + [0] = @sofar bftMult'#2(tuple#2(@dequeue@1 = [1] @dequeue@1 + [1] @dequeue@2 + [0] ,@dequeue@2)) >= [1] @dequeue@1 + [1] @dequeue@2 + [0] = dequeue(@dequeue@1,@dequeue@2) dequeue(@outq,@inq) = [1] @inq + [1] @outq + [0] >= [1] @inq + [1] @outq + [0] = dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) = [1] @inq + [1] @t + [1] @ts + [1] >= [1] @inq + [1] @t + [1] @ts + [1] = tuple#2(::(@t,nil()) ,tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) = [1] @inq + [0] >= [1] @inq + [0] = dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) = [1] @t + [1] @ts + [1] >= [1] @t + [1] @ts + [1] = tuple#2(::(@t,nil()) ,tuple#2(@ts,nil())) dequeue#2(nil()) = [0] >= [0] = tuple#2(nil() ,tuple#2(nil(),nil())) enqueue(@t,@queue) = [1] @queue + [1] @t + [2] >= [1] @queue + [1] @t + [1] = enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq) = [1] @inq + [1] @outq + [1] @t + [1] ,@t) >= [1] @inq + [1] @outq + [1] @t + [1] = tuple#2(@outq,::(@t,@inq)) reverse(@xs) = [1] @xs + [0] >= [1] @xs + [0] = appendreverse(@xs,nil()) *** 1.1.1.1.1.1.1.1.1.1.1.2.2.1.1 Progress [(?,O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Assumption Proof: () *** 1.1.1.1.1.1.1.1.1.1.1.2.2.2 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:W:appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) -->_1 appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))):2 2:W:appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 3:W:bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue):5 4:W:bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) -->_1 bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)):6 5:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue):7 6:W:bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) -->_1 dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)):11 7:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y):9 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc):8 8:W:bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) -->_1 bftMult'#(@queue,@acc) -> bftMult'#2#(@queue):4 -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):3 9:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) -->_1 bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)):10 10:W:bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) -->_1 bftMult'#(@queue,@acc) -> bftMult'#2#(@queue):4 -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):3 11:W:dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) -->_1 dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)):12 12:W:dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) -->_1 reverse#(@xs) -> c_35(appendreverse#(@xs,nil())):13 13:W:reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):1 The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 3: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue) ,@acc) 10: bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue' ,matrixMult(@acc,@y)) 9: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) 7: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> bftMult'#4#(@t ,@acc ,@queue) 5: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> bftMult'#3#(@elem ,@acc ,@queue) 8: bftMult'#4#(leaf() ,@acc ,@queue) -> bftMult'#(@queue ,@acc) 4: bftMult'#(@queue,@acc) -> bftMult'#2#(@queue) 6: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 11: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 12: dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) 13: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) 1: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 2: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) *** 1.1.1.1.1.1.1.1.1.1.1.2.2.2.1 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/1,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: EmptyProcessor Proof: The problem is already closed. The intended complexity is O(1). *** 1.1.1.1.1.1.1.1.2 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Strict TRS Rules: Weak DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimation {onSelection = all simple predecessor estimation selector} Proof: We estimate the number of application of {19} by application of Pre({19}) = {12}. Here rules are labelled as follows: 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 3: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 4: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 5: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) 6: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) 7: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) 8: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 9: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 10: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) 11: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 12: dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) 13: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 14: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 15: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(lineMult#(@n ,@xs ,@ys)) 16: lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) 17: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 18: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) 19: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) 20: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 21: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) *** 1.1.1.1.1.1.1.1.2.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimation {onSelection = all simple predecessor estimation selector} Proof: We estimate the number of application of {12} by application of Pre({12}) = {11}. Here rules are labelled as follows: 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 3: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 4: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 5: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) 6: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) 7: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) 8: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 9: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 10: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) 11: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 12: dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) 13: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 14: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 15: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(lineMult#(@n ,@xs ,@ys)) 16: lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) 17: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 18: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) 19: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 20: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) 21: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) *** 1.1.1.1.1.1.1.1.2.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimation {onSelection = all simple predecessor estimation selector} Proof: We estimate the number of application of {11} by application of Pre({11}) = {3}. Here rules are labelled as follows: 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 3: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 4: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 5: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) 6: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) 7: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) 8: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 9: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 10: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) 11: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 12: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 13: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 14: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(lineMult#(@n ,@xs ,@ys)) 15: lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) 16: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 17: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) 18: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 19: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) 20: dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) 21: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) *** 1.1.1.1.1.1.1.1.2.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimation {onSelection = all simple predecessor estimation selector} Proof: We estimate the number of application of {3} by application of Pre({3}) = {1}. Here rules are labelled as follows: 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc) ,bftMult'#2#(@queue)) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 3: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 4: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 5: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) 6: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) 7: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) 8: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 9: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 10: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) 11: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 12: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 13: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(lineMult#(@n ,@xs ,@ys)) 14: lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) 15: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 16: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) 17: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 18: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) 19: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 20: dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) 21: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) *** 1.1.1.1.1.1.1.1.2.1.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:S:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) -->_2 bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)):18 -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):2 2:S:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):3 3:S:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)):5 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):4 4:S:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):1 5:S:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)):6 6:S:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):14 -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):1 7:S:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):8 8:S:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)):9 9:S:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):10 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):7 10:S:lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) -->_1 lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)):11 11:S:lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) -->_1 lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())):13 -->_1 lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)):12 12:S:lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):10 13:S:lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):10 14:S:matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)):15 15:S:matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):14 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):7 16:W:appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)) -->_1 appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))):17 17:W:appendreverse#1#(::(@a,@as),@sofar) -> c_4(appendreverse#(@as,::(@a,@sofar))) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):16 18:W:bftMult'#2#(tuple#2(@dequeue@1,@dequeue@2)) -> c_9(dequeue#(@dequeue@1,@dequeue@2)) -->_1 dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)):19 19:W:dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) -->_1 dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)):20 20:W:dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) -->_1 reverse#(@xs) -> c_35(appendreverse#(@xs,nil())):21 21:W:reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) -->_1 appendreverse#(@toreverse,@sofar) -> c_3(appendreverse#1#(@toreverse,@sofar)):16 The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 18: bftMult'#2#(tuple#2(@dequeue@1 ,@dequeue@2)) -> c_9(dequeue#(@dequeue@1 ,@dequeue@2)) 19: dequeue#(@outq,@inq) -> c_20(dequeue#1#(@outq,@inq)) 20: dequeue#1#(nil(),@inq) -> c_22(reverse#(@inq)) 21: reverse#(@xs) -> c_35(appendreverse#(@xs,nil())) 16: appendreverse#(@toreverse ,@sofar) -> c_3(appendreverse#1#(@toreverse ,@sofar)) 17: appendreverse#1#(::(@a,@as) ,@sofar) -> c_4(appendreverse#(@as ,::(@a,@sofar))) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/2,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: SimplifyRHS Proof: Consider the dependency graph 1:S:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)) -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):2 2:S:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):3 3:S:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)):5 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):4 4:S:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):1 5:S:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)):6 6:S:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):14 -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc),bftMult'#2#(@queue)):1 7:S:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):8 8:S:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)):9 9:S:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):10 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):7 10:S:lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) -->_1 lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)):11 11:S:lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) -->_1 lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())):13 -->_1 lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)):12 12:S:lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):10 13:S:lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):10 14:S:matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)):15 15:S:matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):14 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):7 Due to missing edges in the depndency graph, the right-hand sides of following rules could be simplified: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1 Progress [(?,O(n^3))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: DecomposeDG {onSelection = all below first cut in WDG, onUpper = Just someStrategy, onLower = Nothing} Proof: We decompose the input problem according to the dependency graph into the upper component bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) and a lower component computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Further, following extension rules are added to the lower component. bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimationCP {onSelectionCP = any intersect of rules of CDG leaf and strict-rules, withComplexityPair = NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}} Proof: We first use the processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy} to orient following rules strictly: 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc)) Consider the set of all dependency pairs 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc)) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 3: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 4: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) 5: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) 6: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) Processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}induces the complexity certificateTIME (?,O(n^1)) SPACE(?,?)on application of the dependency pairs {1} These cover all (indirect) predecessors of dependency pairs {1,2,3,4,5,6} their number of applications is equally bounded. The dependency pairs are shifted into the weak component. *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Just first alternative for predecessorEstimation any intersect of rules of CDG leaf and strict-rules, greedy = NoGreedy} Proof: We apply a matrix interpretation of kind constructor based matrix interpretation: The following argument positions are considered usable: uargs(c_7) = {1}, uargs(c_8) = {1}, uargs(c_10) = {1}, uargs(c_12) = {1}, uargs(c_13) = {1}, uargs(c_14) = {1} Following symbols are considered usable: {appendreverse,appendreverse#1,bftMult'#2,dequeue,dequeue#1,dequeue#2,enqueue,enqueue#1,reverse,#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#} TcT has computed the following interpretation: p(#0) = [4] p(#add) = [0] p(#mult) = [1] x1 + [5] p(#natmult) = [2] p(#neg) = [1] x1 + [0] p(#pos) = [2] p(#pred) = [1] x1 + [2] p(#s) = [3] p(#succ) = [4] p(*) = [4] x2 + [4] p(+) = [2] x1 + [4] x2 + [2] p(::) = [1] x1 + [1] x2 + [0] p(appendreverse) = [1] x1 + [1] x2 + [0] p(appendreverse#1) = [1] x1 + [1] x2 + [0] p(bftMult) = [1] x2 + [1] p(bftMult') = [0] p(bftMult'#1) = [1] x1 + [1] p(bftMult'#2) = [1] x1 + [0] p(bftMult'#3) = [1] x1 + [1] x2 + [1] x3 + [2] p(bftMult'#4) = [2] x3 + [1] p(bftMult'#5) = [1] x3 + [2] p(computeLine) = [2] x1 + [1] p(computeLine#1) = [4] x1 + [0] p(computeLine#2) = [1] x3 + [1] x4 + [4] p(dequeue) = [1] x1 + [1] x2 + [0] p(dequeue#1) = [1] x1 + [1] x2 + [0] p(dequeue#2) = [1] x1 + [0] p(enqueue) = [1] x1 + [1] x2 + [0] p(enqueue#1) = [1] x1 + [1] x2 + [0] p(leaf) = [2] p(lineMult) = [5] x3 + [2] p(lineMult#1) = [4] x1 + [2] x2 + [4] p(lineMult#2) = [6] x1 + [4] x2 + [1] x4 + [1] p(matrixMult) = [4] x1 + [2] x2 + [0] p(matrixMult#1) = [4] x2 + [0] p(nil) = [0] p(node) = [1] x2 + [1] x3 + [1] p(reverse) = [1] x1 + [0] p(tuple#2) = [1] x1 + [1] x2 + [0] p(#add#) = [2] x1 + [1] x2 + [0] p(#mult#) = [4] x1 + [1] x2 + [0] p(#natmult#) = [2] x1 + [1] x2 + [0] p(#pred#) = [2] p(#succ#) = [1] p(*#) = [1] x2 + [0] p(+#) = [1] x1 + [1] x2 + [1] p(appendreverse#) = [1] x2 + [0] p(appendreverse#1#) = [4] x1 + [0] p(bftMult#) = [1] p(bftMult'#) = [4] x1 + [2] p(bftMult'#1#) = [4] x1 + [0] p(bftMult'#2#) = [1] x1 + [1] p(bftMult'#3#) = [4] x1 + [4] x3 + [0] p(bftMult'#4#) = [4] x1 + [4] x3 + [0] p(bftMult'#5#) = [4] x1 + [4] p(computeLine#) = [4] x1 + [4] x3 + [0] p(computeLine#1#) = [1] p(computeLine#2#) = [4] x1 + [1] p(dequeue#) = [1] x1 + [1] x2 + [1] p(dequeue#1#) = [1] p(dequeue#2#) = [4] x1 + [1] p(enqueue#) = [4] x1 + [0] p(enqueue#1#) = [1] x1 + [1] x2 + [1] p(lineMult#) = [1] x2 + [1] x3 + [1] p(lineMult#1#) = [1] p(lineMult#2#) = [1] x2 + [1] x3 + [1] x4 + [4] p(matrixMult#) = [2] p(matrixMult#1#) = [1] p(reverse#) = [1] x1 + [2] p(c_1) = [0] p(c_2) = [1] x1 + [0] p(c_3) = [0] p(c_4) = [1] x1 + [0] p(c_5) = [1] p(c_6) = [0] p(c_7) = [1] x1 + [0] p(c_8) = [1] x1 + [0] p(c_9) = [2] x1 + [1] p(c_10) = [1] x1 + [0] p(c_11) = [0] p(c_12) = [1] x1 + [6] p(c_13) = [1] x1 + [0] p(c_14) = [1] x1 + [1] x2 + [0] p(c_15) = [4] x1 + [0] p(c_16) = [0] p(c_17) = [0] p(c_18) = [2] p(c_19) = [0] p(c_20) = [1] x1 + [2] p(c_21) = [1] p(c_22) = [1] x1 + [0] p(c_23) = [1] p(c_24) = [1] p(c_25) = [1] x1 + [1] p(c_26) = [1] p(c_27) = [0] p(c_28) = [1] x1 + [1] p(c_29) = [1] p(c_30) = [1] x1 + [1] p(c_31) = [1] p(c_32) = [1] p(c_33) = [4] x1 + [4] x2 + [1] p(c_34) = [1] p(c_35) = [2] p(c_36) = [0] p(c_37) = [1] x1 + [1] p(c_38) = [2] x1 + [0] p(c_39) = [4] x1 + [1] p(c_40) = [1] x1 + [4] p(c_41) = [1] p(c_42) = [0] p(c_43) = [0] p(c_44) = [0] p(c_45) = [1] x1 + [0] p(c_46) = [4] x1 + [4] p(c_47) = [2] p(c_48) = [1] x1 + [2] p(c_49) = [1] x1 + [2] p(c_50) = [1] p(c_51) = [4] x1 + [2] x2 + [1] p(c_52) = [1] p(c_53) = [1] p(c_54) = [0] p(c_55) = [0] p(c_56) = [0] p(c_57) = [0] p(c_58) = [4] p(c_59) = [2] Following rules are strictly oriented: bftMult'#(@queue,@acc) = [4] @queue + [2] > [4] @queue + [0] = c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc)) Following rules are (at-least) weakly oriented: bftMult'#1#(tuple#2(@elem = [4] @elem + [4] @queue + [0] ,@queue) ,@acc) >= [4] @elem + [4] @queue + [0] = c_8(bftMult'#3#(@elem ,@acc ,@queue)) bftMult'#3#(::(@t,@_@3) = [4] @_@3 + [4] @queue + [4] @t + [0] ,@acc ,@queue) >= [4] @queue + [4] @t + [0] = c_10(bftMult'#4#(@t ,@acc ,@queue)) bftMult'#4#(leaf(),@acc,@queue) = [4] @queue + [8] >= [4] @queue + [8] = c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2) = [4] @queue + [4] @t1 + [4] @t2 + [4] ,@acc ,@queue) >= [4] @queue + [4] @t1 + [4] @t2 + [4] = c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) bftMult'#5#(@queue',@acc,@y) = [4] @queue' + [4] >= [4] @queue' + [4] = c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) appendreverse(@toreverse,@sofar) = [1] @sofar + [1] @toreverse + [0] >= [1] @sofar + [1] @toreverse + [0] = appendreverse#1(@toreverse ,@sofar) appendreverse#1(::(@a,@as) = [1] @a + [1] @as + [1] @sofar + [0] ,@sofar) >= [1] @a + [1] @as + [1] @sofar + [0] = appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) = [1] @sofar + [0] >= [1] @sofar + [0] = @sofar bftMult'#2(tuple#2(@dequeue@1 = [1] @dequeue@1 + [1] @dequeue@2 + [0] ,@dequeue@2)) >= [1] @dequeue@1 + [1] @dequeue@2 + [0] = dequeue(@dequeue@1,@dequeue@2) dequeue(@outq,@inq) = [1] @inq + [1] @outq + [0] >= [1] @inq + [1] @outq + [0] = dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) = [1] @inq + [1] @t + [1] @ts + [0] >= [1] @inq + [1] @t + [1] @ts + [0] = tuple#2(::(@t,nil()) ,tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) = [1] @inq + [0] >= [1] @inq + [0] = dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) = [1] @t + [1] @ts + [0] >= [1] @t + [1] @ts + [0] = tuple#2(::(@t,nil()) ,tuple#2(@ts,nil())) dequeue#2(nil()) = [0] >= [0] = tuple#2(nil() ,tuple#2(nil(),nil())) enqueue(@t,@queue) = [1] @queue + [1] @t + [0] >= [1] @queue + [1] @t + [0] = enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq) = [1] @inq + [1] @outq + [1] @t + [0] ,@t) >= [1] @inq + [1] @outq + [1] @t + [0] = tuple#2(@outq,::(@t,@inq)) reverse(@xs) = [1] @xs + [0] >= [1] @xs + [0] = appendreverse(@xs,nil()) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1 Progress [(?,O(1))] *** Considered Problem: Strict DP Rules: bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Assumption Proof: () *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:W:bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)) -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)):2 2:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> c_8(bftMult'#3#(@elem,@acc,@queue)) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)):3 3:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> c_10(bftMult'#4#(@t,@acc,@queue)) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)):5 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)):4 4:W:bftMult'#4#(leaf(),@acc,@queue) -> c_12(bftMult'#(@queue,@acc)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)):1 5:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> c_13(bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y)) -->_1 bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)):6 6:W:bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue',matrixMult(@acc,@y)),matrixMult#(@acc,@y)) -->_1 bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue),@acc)):1 The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 1: bftMult'#(@queue,@acc) -> c_7(bftMult'#1#(bftMult'#2(@queue) ,@acc)) 6: bftMult'#5#(@queue',@acc,@y) -> c_14(bftMult'#(@queue' ,matrixMult(@acc,@y)) ,matrixMult#(@acc,@y)) 5: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> c_13(bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y)) 3: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> c_10(bftMult'#4#(@t ,@acc ,@queue)) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> c_8(bftMult'#3#(@elem ,@acc ,@queue)) 4: bftMult'#4#(leaf() ,@acc ,@queue) -> c_12(bftMult'#(@queue,@acc)) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: EmptyProcessor Proof: The problem is already closed. The intended complexity is O(1). *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2 Progress [(?,O(n^2))] *** Considered Problem: Strict DP Rules: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: DecomposeDG {onSelection = all below first cut in WDG, onUpper = Just someStrategy, onLower = Nothing} Proof: We decompose the input problem according to the dependency graph into the upper component bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) and a lower component computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) Further, following extension rules are added to the lower component. bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimationCP {onSelectionCP = any intersect of rules of CDG leaf and strict-rules, withComplexityPair = NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}} Proof: We first use the processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy} to orient following rules strictly: 2: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) The strictly oriented rules are moved into the weak component. *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Just first alternative for predecessorEstimation any intersect of rules of CDG leaf and strict-rules, greedy = NoGreedy} Proof: We apply a matrix interpretation of kind constructor based matrix interpretation: The following argument positions are considered usable: uargs(c_32) = {1}, uargs(c_33) = {2} Following symbols are considered usable: {matrixMult,matrixMult#1,#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#} TcT has computed the following interpretation: p(#0) = [0] p(#add) = [4] x1 + [0] p(#mult) = [3] p(#natmult) = [6] x2 + [7] p(#neg) = [1] x1 + [3] p(#pos) = [0] p(#pred) = [0] p(#s) = [0] p(#succ) = [1] x1 + [0] p(*) = [0] p(+) = [0] p(::) = [1] x2 + [1] p(appendreverse) = [3] p(appendreverse#1) = [0] p(bftMult) = [0] p(bftMult') = [0] p(bftMult'#1) = [0] p(bftMult'#2) = [0] p(bftMult'#3) = [0] p(bftMult'#4) = [0] p(bftMult'#5) = [0] p(computeLine) = [1] x3 + [0] p(computeLine#1) = [0] p(computeLine#2) = [0] p(dequeue) = [0] p(dequeue#1) = [0] p(dequeue#2) = [0] p(enqueue) = [0] p(enqueue#1) = [0] p(leaf) = [0] p(lineMult) = [2] x1 + [5] p(lineMult#1) = [0] p(lineMult#2) = [0] p(matrixMult) = [1] x1 + [0] p(matrixMult#1) = [1] x1 + [0] p(nil) = [4] p(node) = [1] x1 + [1] x2 + [1] x3 + [0] p(reverse) = [0] p(tuple#2) = [5] p(#add#) = [1] x1 + [0] p(#mult#) = [0] p(#natmult#) = [0] p(#pred#) = [0] p(#succ#) = [0] p(*#) = [0] p(+#) = [0] p(appendreverse#) = [0] p(appendreverse#1#) = [0] p(bftMult#) = [0] p(bftMult'#) = [1] x2 + [2] p(bftMult'#1#) = [1] x2 + [2] p(bftMult'#2#) = [0] p(bftMult'#3#) = [1] x2 + [2] p(bftMult'#4#) = [1] x2 + [2] p(bftMult'#5#) = [1] x2 + [2] p(computeLine#) = [0] p(computeLine#1#) = [0] p(computeLine#2#) = [0] p(dequeue#) = [0] p(dequeue#1#) = [0] p(dequeue#2#) = [0] p(enqueue#) = [0] p(enqueue#1#) = [0] p(lineMult#) = [0] p(lineMult#1#) = [0] p(lineMult#2#) = [0] p(matrixMult#) = [1] x1 + [0] p(matrixMult#1#) = [1] x1 + [0] p(reverse#) = [0] p(c_1) = [0] p(c_2) = [0] p(c_3) = [0] p(c_4) = [0] p(c_5) = [0] p(c_6) = [0] p(c_7) = [0] p(c_8) = [0] p(c_9) = [0] p(c_10) = [0] p(c_11) = [0] p(c_12) = [0] p(c_13) = [0] p(c_14) = [0] p(c_15) = [0] p(c_16) = [0] p(c_17) = [0] p(c_18) = [0] p(c_19) = [0] p(c_20) = [0] p(c_21) = [0] p(c_22) = [0] p(c_23) = [0] p(c_24) = [0] p(c_25) = [0] p(c_26) = [0] p(c_27) = [0] p(c_28) = [0] p(c_29) = [0] p(c_30) = [0] p(c_31) = [0] p(c_32) = [1] x1 + [0] p(c_33) = [1] x1 + [1] x2 + [0] p(c_34) = [0] p(c_35) = [2] x1 + [2] p(c_36) = [0] p(c_37) = [4] x1 + [0] p(c_38) = [1] x1 + [0] p(c_39) = [0] p(c_40) = [0] p(c_41) = [0] p(c_42) = [0] p(c_43) = [0] p(c_44) = [0] p(c_45) = [1] x1 + [0] p(c_46) = [1] x1 + [0] p(c_47) = [0] p(c_48) = [4] x1 + [0] p(c_49) = [4] x1 + [0] p(c_50) = [0] p(c_51) = [1] x2 + [0] p(c_52) = [0] p(c_53) = [0] p(c_54) = [0] p(c_55) = [0] p(c_56) = [0] p(c_57) = [0] p(c_58) = [0] p(c_59) = [0] Following rules are strictly oriented: matrixMult#1#(::(@l,@ls),@m2) = [1] @ls + [1] > [1] @ls + [0] = c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) Following rules are (at-least) weakly oriented: bftMult'#(@queue,@acc) = [1] @acc + [2] >= [1] @acc + [2] = bftMult'#1#(bftMult'#2(@queue) ,@acc) bftMult'#1#(tuple#2(@elem = [1] @acc + [2] ,@queue) ,@acc) >= [1] @acc + [2] = bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3) = [1] @acc + [2] ,@acc ,@queue) >= [1] @acc + [2] = bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) = [1] @acc + [2] >= [1] @acc + [2] = bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2) = [1] @acc + [2] ,@acc ,@queue) >= [1] @acc + [2] = bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) bftMult'#5#(@queue',@acc,@y) = [1] @acc + [2] >= [1] @acc + [2] = bftMult'#(@queue' ,matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) = [1] @acc + [2] >= [1] @acc + [0] = matrixMult#(@acc,@y) matrixMult#(@m1,@m2) = [1] @m1 + [0] >= [1] @m1 + [0] = c_32(matrixMult#1#(@m1,@m2)) matrixMult(@m1,@m2) = [1] @m1 + [0] >= [1] @m1 + [0] = matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) = [1] @ls + [1] >= [1] @ls + [1] = ::(computeLine(@l,@m2,nil()) ,matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) = [4] >= [4] = nil() *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.1.1 Progress [(?,O(1))] *** Considered Problem: Strict DP Rules: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Assumption Proof: () *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimationCP {onSelectionCP = any intersect of rules of CDG leaf and strict-rules, withComplexityPair = NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}} Proof: We first use the processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy} to orient following rules strictly: 1: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) Consider the set of all dependency pairs 1: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 2: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue) ,@acc) 3: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> bftMult'#3#(@elem ,@acc ,@queue) 4: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> bftMult'#4#(@t ,@acc ,@queue) 5: bftMult'#4#(leaf() ,@acc ,@queue) -> bftMult'#(@queue ,@acc) 6: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) 7: bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue' ,matrixMult(@acc,@y)) 8: bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) 9: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) Processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}induces the complexity certificateTIME (?,O(n^1)) SPACE(?,?)on application of the dependency pairs {1} These cover all (indirect) predecessors of dependency pairs {1,9} their number of applications is equally bounded. The dependency pairs are shifted into the weak component. *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Just first alternative for predecessorEstimation any intersect of rules of CDG leaf and strict-rules, greedy = NoGreedy} Proof: We apply a matrix interpretation of kind constructor based matrix interpretation: The following argument positions are considered usable: uargs(c_32) = {1}, uargs(c_33) = {2} Following symbols are considered usable: {matrixMult,matrixMult#1,#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#} TcT has computed the following interpretation: p(#0) = [6] p(#add) = [1] x2 + [0] p(#mult) = [2] x1 + [0] p(#natmult) = [5] p(#neg) = [1] x1 + [4] p(#pos) = [3] p(#pred) = [1] x1 + [2] p(#s) = [4] p(#succ) = [0] p(*) = [0] p(+) = [0] p(::) = [1] x2 + [1] p(appendreverse) = [1] x2 + [0] p(appendreverse#1) = [0] p(bftMult) = [0] p(bftMult') = [0] p(bftMult'#1) = [0] p(bftMult'#2) = [0] p(bftMult'#3) = [0] p(bftMult'#4) = [0] p(bftMult'#5) = [2] p(computeLine) = [1] x3 + [5] p(computeLine#1) = [0] p(computeLine#2) = [7] p(dequeue) = [0] p(dequeue#1) = [0] p(dequeue#2) = [0] p(enqueue) = [0] p(enqueue#1) = [0] p(leaf) = [0] p(lineMult) = [0] p(lineMult#1) = [0] p(lineMult#2) = [1] x1 + [0] p(matrixMult) = [1] x1 + [0] p(matrixMult#1) = [1] x1 + [0] p(nil) = [0] p(node) = [1] x2 + [1] x3 + [0] p(reverse) = [0] p(tuple#2) = [0] p(#add#) = [0] p(#mult#) = [0] p(#natmult#) = [0] p(#pred#) = [0] p(#succ#) = [0] p(*#) = [0] p(+#) = [0] p(appendreverse#) = [0] p(appendreverse#1#) = [0] p(bftMult#) = [0] p(bftMult'#) = [1] x2 + [2] p(bftMult'#1#) = [1] x2 + [2] p(bftMult'#2#) = [0] p(bftMult'#3#) = [1] x2 + [2] p(bftMult'#4#) = [1] x2 + [2] p(bftMult'#5#) = [1] x2 + [2] p(computeLine#) = [0] p(computeLine#1#) = [0] p(computeLine#2#) = [2] p(dequeue#) = [0] p(dequeue#1#) = [0] p(dequeue#2#) = [0] p(enqueue#) = [0] p(enqueue#1#) = [0] p(lineMult#) = [0] p(lineMult#1#) = [0] p(lineMult#2#) = [0] p(matrixMult#) = [1] x1 + [1] p(matrixMult#1#) = [1] x1 + [0] p(reverse#) = [0] p(c_1) = [0] p(c_2) = [0] p(c_3) = [0] p(c_4) = [0] p(c_5) = [0] p(c_6) = [0] p(c_7) = [0] p(c_8) = [0] p(c_9) = [0] p(c_10) = [0] p(c_11) = [0] p(c_12) = [0] p(c_13) = [0] p(c_14) = [0] p(c_15) = [0] p(c_16) = [0] p(c_17) = [0] p(c_18) = [0] p(c_19) = [0] p(c_20) = [0] p(c_21) = [0] p(c_22) = [0] p(c_23) = [0] p(c_24) = [0] p(c_25) = [0] p(c_26) = [0] p(c_27) = [0] p(c_28) = [0] p(c_29) = [0] p(c_30) = [0] p(c_31) = [0] p(c_32) = [1] x1 + [0] p(c_33) = [1] x2 + [0] p(c_34) = [0] p(c_35) = [0] p(c_36) = [0] p(c_37) = [0] p(c_38) = [0] p(c_39) = [0] p(c_40) = [2] x1 + [0] p(c_41) = [0] p(c_42) = [0] p(c_43) = [0] p(c_44) = [0] p(c_45) = [0] p(c_46) = [0] p(c_47) = [0] p(c_48) = [1] x1 + [0] p(c_49) = [0] p(c_50) = [0] p(c_51) = [1] x1 + [0] p(c_52) = [0] p(c_53) = [0] p(c_54) = [0] p(c_55) = [0] p(c_56) = [0] p(c_57) = [0] p(c_58) = [0] p(c_59) = [0] Following rules are strictly oriented: matrixMult#(@m1,@m2) = [1] @m1 + [1] > [1] @m1 + [0] = c_32(matrixMult#1#(@m1,@m2)) Following rules are (at-least) weakly oriented: bftMult'#(@queue,@acc) = [1] @acc + [2] >= [1] @acc + [2] = bftMult'#1#(bftMult'#2(@queue) ,@acc) bftMult'#1#(tuple#2(@elem = [1] @acc + [2] ,@queue) ,@acc) >= [1] @acc + [2] = bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3) = [1] @acc + [2] ,@acc ,@queue) >= [1] @acc + [2] = bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) = [1] @acc + [2] >= [1] @acc + [2] = bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2) = [1] @acc + [2] ,@acc ,@queue) >= [1] @acc + [2] = bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) bftMult'#5#(@queue',@acc,@y) = [1] @acc + [2] >= [1] @acc + [2] = bftMult'#(@queue' ,matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) = [1] @acc + [2] >= [1] @acc + [1] = matrixMult#(@acc,@y) matrixMult#1#(::(@l,@ls),@m2) = [1] @ls + [1] >= [1] @ls + [1] = c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) matrixMult(@m1,@m2) = [1] @m1 + [0] >= [1] @m1 + [0] = matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) = [1] @ls + [1] >= [1] @ls + [1] = ::(computeLine(@l,@m2,nil()) ,matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) = [0] >= [0] = nil() *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2.1.1 Progress [(?,O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Assumption Proof: () *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2.2 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:W:bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue):2 2:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue):3 3:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y):5 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc):4 4:W:bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):1 5:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) -->_1 bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y):7 -->_1 bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)):6 6:W:bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):1 7:W:bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) -->_1 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):8 8:W:matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)):9 9:W:matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()),matrixMult#(@ls,@m2)) -->_2 matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)):8 The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 1: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue) ,@acc) 6: bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue' ,matrixMult(@acc,@y)) 5: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) 3: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> bftMult'#4#(@t ,@acc ,@queue) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> bftMult'#3#(@elem ,@acc ,@queue) 4: bftMult'#4#(leaf() ,@acc ,@queue) -> bftMult'#(@queue ,@acc) 7: bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) 8: matrixMult#(@m1,@m2) -> c_32(matrixMult#1#(@m1,@m2)) 9: matrixMult#1#(::(@l,@ls),@m2) -> c_33(computeLine#(@l,@m2,nil()) ,matrixMult#(@ls,@m2)) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2.2.1 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: EmptyProcessor Proof: The problem is already closed. The intended complexity is O(1). *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimationCP {onSelectionCP = any intersect of rules of CDG leaf and strict-rules, withComplexityPair = NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}} Proof: We first use the processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy} to orient following rules strictly: 2: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 5: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) Consider the set of all dependency pairs 1: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 2: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 3: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) 4: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 5: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 6: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(lineMult#(@n ,@xs ,@ys)) 7: lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) 8: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue) ,@acc) 9: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> bftMult'#3#(@elem ,@acc ,@queue) 10: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> bftMult'#4#(@t ,@acc ,@queue) 11: bftMult'#4#(leaf() ,@acc ,@queue) -> bftMult'#(@queue ,@acc) 12: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) 13: bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue' ,matrixMult(@acc,@y)) 14: bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) 15: matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) 16: matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) 17: matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}induces the complexity certificateTIME (?,O(n^1)) SPACE(?,?)on application of the dependency pairs {2,5} These cover all (indirect) predecessors of dependency pairs {2,3,4,5,6,7} their number of applications is equally bounded. The dependency pairs are shifted into the weak component. *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Just first alternative for predecessorEstimation any intersect of rules of CDG leaf and strict-rules, greedy = NoGreedy} Proof: We apply a matrix interpretation of kind constructor based matrix interpretation: The following argument positions are considered usable: uargs(c_15) = {1}, uargs(c_16) = {1}, uargs(c_18) = {1,2}, uargs(c_27) = {1}, uargs(c_28) = {1}, uargs(c_30) = {1}, uargs(c_31) = {1} Following symbols are considered usable: {appendreverse,appendreverse#1,bftMult'#2,dequeue,dequeue#1,dequeue#2,enqueue,enqueue#1,reverse,#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#} TcT has computed the following interpretation: p(#0) = [0] p(#add) = [1] x1 + [1] p(#mult) = [1] x2 + [0] p(#natmult) = [4] x2 + [0] p(#neg) = [1] x1 + [0] p(#pos) = [1] x1 + [4] p(#pred) = [0] p(#s) = [0] p(#succ) = [5] p(*) = [1] x1 + [4] x2 + [0] p(+) = [0] p(::) = [1] x1 + [1] x2 + [1] p(appendreverse) = [1] x1 + [1] x2 + [0] p(appendreverse#1) = [1] x1 + [1] x2 + [0] p(bftMult) = [1] x1 + [1] x2 + [4] p(bftMult') = [2] p(bftMult'#1) = [0] p(bftMult'#2) = [1] x1 + [0] p(bftMult'#3) = [4] x1 + [1] p(bftMult'#4) = [4] x1 + [1] x2 + [4] p(bftMult'#5) = [1] p(computeLine) = [4] x1 + [1] x3 + [4] p(computeLine#1) = [1] x1 + [1] p(computeLine#2) = [1] x1 + [4] x3 + [3] p(dequeue) = [1] x1 + [1] x2 + [0] p(dequeue#1) = [1] x1 + [1] x2 + [0] p(dequeue#2) = [1] x1 + [0] p(enqueue) = [1] x1 + [1] x2 + [1] p(enqueue#1) = [1] x1 + [1] x2 + [1] p(leaf) = [0] p(lineMult) = [4] x1 + [0] p(lineMult#1) = [0] p(lineMult#2) = [1] x4 + [1] p(matrixMult) = [1] p(matrixMult#1) = [5] x1 + [2] x2 + [7] p(nil) = [0] p(node) = [1] x1 + [1] x2 + [1] x3 + [1] p(reverse) = [1] x1 + [0] p(tuple#2) = [1] x1 + [1] x2 + [0] p(#add#) = [0] p(#mult#) = [1] x2 + [2] p(#natmult#) = [2] x2 + [1] p(#pred#) = [2] x1 + [1] p(#succ#) = [1] x1 + [1] p(*#) = [2] p(+#) = [1] x2 + [1] p(appendreverse#) = [0] p(appendreverse#1#) = [0] p(bftMult#) = [0] p(bftMult'#) = [4] x1 + [1] p(bftMult'#1#) = [4] x1 + [1] p(bftMult'#2#) = [0] p(bftMult'#3#) = [4] x1 + [4] x3 + [1] p(bftMult'#4#) = [4] x1 + [4] x3 + [5] p(bftMult'#5#) = [4] x1 + [4] x3 + [1] p(computeLine#) = [4] x2 + [1] p(computeLine#1#) = [4] x3 + [1] p(computeLine#2#) = [4] x1 + [0] p(dequeue#) = [0] p(dequeue#1#) = [0] p(dequeue#2#) = [0] p(enqueue#) = [0] p(enqueue#1#) = [1] x2 + [0] p(lineMult#) = [2] x2 + [0] p(lineMult#1#) = [2] x1 + [0] p(lineMult#2#) = [1] x3 + [2] x4 + [0] p(matrixMult#) = [4] x2 + [1] p(matrixMult#1#) = [4] x2 + [1] p(reverse#) = [1] p(c_1) = [2] p(c_2) = [1] p(c_3) = [1] x1 + [0] p(c_4) = [0] p(c_5) = [1] p(c_6) = [2] x1 + [0] p(c_7) = [2] x1 + [2] p(c_8) = [2] x1 + [1] p(c_9) = [2] p(c_10) = [1] x1 + [1] p(c_11) = [1] p(c_12) = [4] x1 + [0] p(c_13) = [4] p(c_14) = [1] x2 + [0] p(c_15) = [1] x1 + [0] p(c_16) = [1] x1 + [0] p(c_17) = [1] p(c_18) = [1] x1 + [2] x2 + [3] p(c_19) = [4] p(c_20) = [0] p(c_21) = [1] p(c_22) = [1] x1 + [0] p(c_23) = [0] p(c_24) = [2] p(c_25) = [1] x1 + [1] p(c_26) = [1] p(c_27) = [1] x1 + [0] p(c_28) = [1] x1 + [0] p(c_29) = [2] p(c_30) = [1] x1 + [0] p(c_31) = [1] x1 + [0] p(c_32) = [2] x1 + [1] p(c_33) = [2] p(c_34) = [2] p(c_35) = [1] p(c_36) = [2] p(c_37) = [0] p(c_38) = [1] p(c_39) = [1] x1 + [0] p(c_40) = [2] x2 + [2] p(c_41) = [4] p(c_42) = [1] p(c_43) = [0] p(c_44) = [0] p(c_45) = [1] x1 + [1] p(c_46) = [1] p(c_47) = [4] p(c_48) = [1] x1 + [0] p(c_49) = [2] p(c_50) = [1] p(c_51) = [2] x1 + [4] x2 + [2] p(c_52) = [1] p(c_53) = [1] p(c_54) = [1] p(c_55) = [2] p(c_56) = [0] p(c_57) = [4] p(c_58) = [0] p(c_59) = [2] Following rules are strictly oriented: computeLine#1#(::(@x,@xs) = [4] @m + [1] ,@acc ,@m) > [4] @m + [0] = c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) lineMult#1#(::(@x,@xs),@l2,@n) = [2] @x + [2] @xs + [2] > [1] @x + [2] @xs + [0] = c_28(lineMult#2#(@l2,@n,@x,@xs)) Following rules are (at-least) weakly oriented: bftMult'#(@queue,@acc) = [4] @queue + [1] >= [4] @queue + [1] = bftMult'#1#(bftMult'#2(@queue) ,@acc) bftMult'#1#(tuple#2(@elem = [4] @elem + [4] @queue + [1] ,@queue) ,@acc) >= [4] @elem + [4] @queue + [1] = bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3) = [4] @_@3 + [4] @queue + [4] @t + [5] ,@acc ,@queue) >= [4] @queue + [4] @t + [5] = bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) = [4] @queue + [5] >= [4] @queue + [1] = bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2) = [4] @queue + [4] @t1 + [4] @t2 + [4] @y + [9] ,@acc ,@queue) >= [4] @queue + [4] @t1 + [4] @t2 + [4] @y + [9] = bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) bftMult'#5#(@queue',@acc,@y) = [4] @queue' + [4] @y + [1] >= [4] @queue' + [1] = bftMult'#(@queue' ,matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) = [4] @queue' + [4] @y + [1] >= [4] @y + [1] = matrixMult#(@acc,@y) computeLine#(@line,@m,@acc) = [4] @m + [1] >= [4] @m + [1] = c_15(computeLine#1#(@line ,@acc ,@m)) computeLine#2#(::(@l,@ls) = [4] @l + [4] @ls + [4] ,@acc ,@x ,@xs) >= [4] @l + [4] @ls + [4] = c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc)) ,lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) = [2] @l1 + [0] >= [2] @l1 + [0] = c_27(lineMult#1#(@l1,@l2,@n)) lineMult#2#(::(@y,@ys) = [1] @x + [2] @xs + [0] ,@n ,@x ,@xs) >= [2] @xs + [0] = c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) = [1] @x + [2] @xs + [0] >= [2] @xs + [0] = c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) = [4] @m2 + [1] >= [4] @m2 + [1] = matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) = [4] @m2 + [1] >= [4] @m2 + [1] = computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) = [4] @m2 + [1] >= [4] @m2 + [1] = matrixMult#(@ls,@m2) appendreverse(@toreverse,@sofar) = [1] @sofar + [1] @toreverse + [0] >= [1] @sofar + [1] @toreverse + [0] = appendreverse#1(@toreverse ,@sofar) appendreverse#1(::(@a,@as) = [1] @a + [1] @as + [1] @sofar + [1] ,@sofar) >= [1] @a + [1] @as + [1] @sofar + [1] = appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) = [1] @sofar + [0] >= [1] @sofar + [0] = @sofar bftMult'#2(tuple#2(@dequeue@1 = [1] @dequeue@1 + [1] @dequeue@2 + [0] ,@dequeue@2)) >= [1] @dequeue@1 + [1] @dequeue@2 + [0] = dequeue(@dequeue@1,@dequeue@2) dequeue(@outq,@inq) = [1] @inq + [1] @outq + [0] >= [1] @inq + [1] @outq + [0] = dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) = [1] @inq + [1] @t + [1] @ts + [1] >= [1] @inq + [1] @t + [1] @ts + [1] = tuple#2(::(@t,nil()) ,tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) = [1] @inq + [0] >= [1] @inq + [0] = dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) = [1] @t + [1] @ts + [1] >= [1] @t + [1] @ts + [1] = tuple#2(::(@t,nil()) ,tuple#2(@ts,nil())) dequeue#2(nil()) = [0] >= [0] = tuple#2(nil() ,tuple#2(nil(),nil())) enqueue(@t,@queue) = [1] @queue + [1] @t + [1] >= [1] @queue + [1] @t + [1] = enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq) = [1] @inq + [1] @outq + [1] @t + [1] ,@t) >= [1] @inq + [1] @outq + [1] @t + [1] = tuple#2(@outq,::(@t,@inq)) reverse(@xs) = [1] @xs + [0] >= [1] @xs + [0] = appendreverse(@xs,nil()) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.1.1 Progress [(?,O(1))] *** Considered Problem: Strict DP Rules: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Assumption Proof: () *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.2 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:S:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):9 2:W:bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue):3 3:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue):4 4:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y):6 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc):5 5:W:bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):2 6:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) -->_1 bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y):8 -->_1 bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)):7 7:W:bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):2 8:W:bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) -->_1 matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2):15 9:W:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)):10 10:W:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) -->_2 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):11 -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):1 11:W:lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) -->_1 lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)):12 12:W:lineMult#1#(::(@x,@xs),@l2,@n) -> c_28(lineMult#2#(@l2,@n,@x,@xs)) -->_1 lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())):14 -->_1 lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)):13 13:W:lineMult#2#(::(@y,@ys),@n,@x,@xs) -> c_30(lineMult#(@n,@xs,@ys)) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):11 14:W:lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) -->_1 lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)):11 15:W:matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2):17 -->_1 matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()):16 16:W:matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):1 17:W:matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) -->_1 matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2):15 The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 11: lineMult#(@n,@l1,@l2) -> c_27(lineMult#1#(@l1,@l2,@n)) 14: lineMult#2#(nil(),@n,@x,@xs) -> c_31(lineMult#(@n,@xs,nil())) 12: lineMult#1#(::(@x,@xs) ,@l2 ,@n) -> c_28(lineMult#2#(@l2 ,@n ,@x ,@xs)) 13: lineMult#2#(::(@y,@ys) ,@n ,@x ,@xs) -> c_30(lineMult#(@n ,@xs ,@ys)) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.2.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/2,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: SimplifyRHS Proof: Consider the dependency graph 1:S:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):9 2:W:bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue):3 3:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue):4 4:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y):6 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc):5 5:W:bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):2 6:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) -->_1 bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y):8 -->_1 bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)):7 7:W:bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):2 8:W:bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) -->_1 matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2):15 9:W:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)):10 10:W:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc)),lineMult#(@x,@l,@acc)) -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):1 15:W:matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2):17 -->_1 matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()):16 16:W:matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):1 17:W:matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) -->_1 matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2):15 Due to missing edges in the depndency graph, the right-hand sides of following rules could be simplified: computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc))) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.2.1.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc))) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/1,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: PredecessorEstimationCP {onSelectionCP = any intersect of rules of CDG leaf and strict-rules, withComplexityPair = NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}} Proof: We first use the processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy} to orient following rules strictly: 1: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) Consider the set of all dependency pairs 1: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 2: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue) ,@acc) 3: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> bftMult'#3#(@elem ,@acc ,@queue) 4: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> bftMult'#4#(@t ,@acc ,@queue) 5: bftMult'#4#(leaf() ,@acc ,@queue) -> bftMult'#(@queue ,@acc) 6: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) 7: bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue' ,matrixMult(@acc,@y)) 8: bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) 9: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) 10: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc))) 11: matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) 12: matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) 13: matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Processor NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Nothing, greedy = NoGreedy}induces the complexity certificateTIME (?,O(n^1)) SPACE(?,?)on application of the dependency pairs {1} These cover all (indirect) predecessors of dependency pairs {1,9,10} their number of applications is equally bounded. The dependency pairs are shifted into the weak component. *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.2.1.1.1 Progress [(?,O(n^1))] *** Considered Problem: Strict DP Rules: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc))) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/1,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: NaturalMI {miDimension = 1, miDegree = 1, miKind = Algebraic, uargs = UArgs, urules = URules, selector = Just first alternative for predecessorEstimation any intersect of rules of CDG leaf and strict-rules, greedy = NoGreedy} Proof: We apply a matrix interpretation of kind constructor based matrix interpretation: The following argument positions are considered usable: uargs(c_15) = {1}, uargs(c_16) = {1}, uargs(c_18) = {1} Following symbols are considered usable: {appendreverse,appendreverse#1,bftMult'#2,dequeue,dequeue#1,dequeue#2,enqueue,enqueue#1,reverse,#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#} TcT has computed the following interpretation: p(#0) = [1] p(#add) = [2] p(#mult) = [4] x1 + [0] p(#natmult) = [2] x1 + [1] x2 + [0] p(#neg) = [0] p(#pos) = [0] p(#pred) = [1] x1 + [0] p(#s) = [3] p(#succ) = [2] x1 + [0] p(*) = [0] p(+) = [2] p(::) = [1] x1 + [1] x2 + [2] p(appendreverse) = [1] x1 + [1] x2 + [0] p(appendreverse#1) = [1] x1 + [1] x2 + [0] p(bftMult) = [1] x2 + [0] p(bftMult') = [1] x2 + [2] p(bftMult'#1) = [1] x1 + [1] p(bftMult'#2) = [1] x1 + [0] p(bftMult'#3) = [1] x1 + [2] x3 + [2] p(bftMult'#4) = [1] x2 + [1] p(bftMult'#5) = [1] x1 + [0] p(computeLine) = [0] p(computeLine#1) = [0] p(computeLine#2) = [1] x2 + [2] x3 + [1] x4 + [0] p(dequeue) = [1] x1 + [1] x2 + [0] p(dequeue#1) = [1] x1 + [1] x2 + [0] p(dequeue#2) = [1] x1 + [0] p(enqueue) = [1] x1 + [1] x2 + [2] p(enqueue#1) = [1] x1 + [1] x2 + [2] p(leaf) = [0] p(lineMult) = [0] p(lineMult#1) = [0] p(lineMult#2) = [1] x2 + [2] p(matrixMult) = [1] x1 + [6] p(matrixMult#1) = [1] x1 + [3] p(nil) = [0] p(node) = [1] x1 + [1] x2 + [1] x3 + [5] p(reverse) = [1] x1 + [0] p(tuple#2) = [1] x1 + [1] x2 + [0] p(#add#) = [1] x1 + [0] p(#mult#) = [0] p(#natmult#) = [4] x1 + [1] x2 + [1] p(#pred#) = [4] p(#succ#) = [1] x1 + [4] p(*#) = [1] x2 + [0] p(+#) = [1] p(appendreverse#) = [1] x1 + [1] x2 + [1] p(appendreverse#1#) = [1] x2 + [2] p(bftMult#) = [1] p(bftMult'#) = [3] x1 + [0] p(bftMult'#1#) = [3] x1 + [0] p(bftMult'#2#) = [1] p(bftMult'#3#) = [3] x1 + [3] x3 + [0] p(bftMult'#4#) = [3] x1 + [3] x3 + [0] p(bftMult'#5#) = [3] x1 + [3] x3 + [3] p(computeLine#) = [2] x2 + [2] p(computeLine#1#) = [2] x3 + [0] p(computeLine#2#) = [2] x1 + [0] p(dequeue#) = [1] x1 + [1] p(dequeue#1#) = [0] p(dequeue#2#) = [0] p(enqueue#) = [2] x1 + [0] p(enqueue#1#) = [1] x1 + [1] x2 + [1] p(lineMult#) = [1] x1 + [1] x2 + [1] x3 + [2] p(lineMult#1#) = [1] x2 + [0] p(lineMult#2#) = [1] x1 + [0] p(matrixMult#) = [3] x2 + [3] p(matrixMult#1#) = [3] x2 + [3] p(reverse#) = [1] x1 + [0] p(c_1) = [2] p(c_2) = [1] p(c_3) = [0] p(c_4) = [2] p(c_5) = [1] p(c_6) = [1] x1 + [0] p(c_7) = [2] x1 + [0] p(c_8) = [1] x1 + [0] p(c_9) = [0] p(c_10) = [2] p(c_11) = [0] p(c_12) = [1] p(c_13) = [1] x1 + [0] p(c_14) = [4] p(c_15) = [1] x1 + [0] p(c_16) = [1] x1 + [0] p(c_17) = [1] p(c_18) = [1] x1 + [2] p(c_19) = [1] p(c_20) = [1] x1 + [1] p(c_21) = [4] p(c_22) = [1] x1 + [0] p(c_23) = [0] p(c_24) = [1] p(c_25) = [0] p(c_26) = [4] p(c_27) = [1] p(c_28) = [1] x1 + [2] p(c_29) = [4] p(c_30) = [0] p(c_31) = [4] x1 + [0] p(c_32) = [1] p(c_33) = [1] x2 + [1] p(c_34) = [0] p(c_35) = [1] x1 + [1] p(c_36) = [0] p(c_37) = [1] x1 + [0] p(c_38) = [1] x1 + [1] x2 + [0] p(c_39) = [2] x1 + [0] p(c_40) = [0] p(c_41) = [4] p(c_42) = [0] p(c_43) = [1] p(c_44) = [0] p(c_45) = [2] x1 + [0] p(c_46) = [4] x1 + [1] p(c_47) = [1] p(c_48) = [4] x1 + [1] p(c_49) = [2] x1 + [4] p(c_50) = [0] p(c_51) = [1] x1 + [0] p(c_52) = [1] p(c_53) = [4] p(c_54) = [0] p(c_55) = [0] p(c_56) = [0] p(c_57) = [0] p(c_58) = [4] p(c_59) = [2] Following rules are strictly oriented: computeLine#(@line,@m,@acc) = [2] @m + [2] > [2] @m + [0] = c_15(computeLine#1#(@line ,@acc ,@m)) Following rules are (at-least) weakly oriented: bftMult'#(@queue,@acc) = [3] @queue + [0] >= [3] @queue + [0] = bftMult'#1#(bftMult'#2(@queue) ,@acc) bftMult'#1#(tuple#2(@elem = [3] @elem + [3] @queue + [0] ,@queue) ,@acc) >= [3] @elem + [3] @queue + [0] = bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3) = [3] @_@3 + [3] @queue + [3] @t + [6] ,@acc ,@queue) >= [3] @queue + [3] @t + [0] = bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) = [3] @queue + [0] >= [3] @queue + [0] = bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2) = [3] @queue + [3] @t1 + [3] @t2 + [3] @y + [15] ,@acc ,@queue) >= [3] @queue + [3] @t1 + [3] @t2 + [3] @y + [15] = bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) bftMult'#5#(@queue',@acc,@y) = [3] @queue' + [3] @y + [3] >= [3] @queue' + [0] = bftMult'#(@queue' ,matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) = [3] @queue' + [3] @y + [3] >= [3] @y + [3] = matrixMult#(@acc,@y) computeLine#1#(::(@x,@xs) = [2] @m + [0] ,@acc ,@m) >= [2] @m + [0] = c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) computeLine#2#(::(@l,@ls) = [2] @l + [2] @ls + [4] ,@acc ,@x ,@xs) >= [2] @ls + [4] = c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc))) matrixMult#(@m1,@m2) = [3] @m2 + [3] >= [3] @m2 + [3] = matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) = [3] @m2 + [3] >= [2] @m2 + [2] = computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) = [3] @m2 + [3] >= [3] @m2 + [3] = matrixMult#(@ls,@m2) appendreverse(@toreverse,@sofar) = [1] @sofar + [1] @toreverse + [0] >= [1] @sofar + [1] @toreverse + [0] = appendreverse#1(@toreverse ,@sofar) appendreverse#1(::(@a,@as) = [1] @a + [1] @as + [1] @sofar + [2] ,@sofar) >= [1] @a + [1] @as + [1] @sofar + [2] = appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) = [1] @sofar + [0] >= [1] @sofar + [0] = @sofar bftMult'#2(tuple#2(@dequeue@1 = [1] @dequeue@1 + [1] @dequeue@2 + [0] ,@dequeue@2)) >= [1] @dequeue@1 + [1] @dequeue@2 + [0] = dequeue(@dequeue@1,@dequeue@2) dequeue(@outq,@inq) = [1] @inq + [1] @outq + [0] >= [1] @inq + [1] @outq + [0] = dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) = [1] @inq + [1] @t + [1] @ts + [2] >= [1] @inq + [1] @t + [1] @ts + [2] = tuple#2(::(@t,nil()) ,tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) = [1] @inq + [0] >= [1] @inq + [0] = dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) = [1] @t + [1] @ts + [2] >= [1] @t + [1] @ts + [2] = tuple#2(::(@t,nil()) ,tuple#2(@ts,nil())) dequeue#2(nil()) = [0] >= [0] = tuple#2(nil() ,tuple#2(nil(),nil())) enqueue(@t,@queue) = [1] @queue + [1] @t + [2] >= [1] @queue + [1] @t + [2] = enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq) = [1] @inq + [1] @outq + [1] @t + [2] ,@t) >= [1] @inq + [1] @outq + [1] @t + [2] = tuple#2(@outq,::(@t,@inq)) reverse(@xs) = [1] @xs + [0] >= [1] @xs + [0] = appendreverse(@xs,nil()) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.2.1.1.1.1 Progress [(?,O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc))) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/1,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: Assumption Proof: () *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.2.1.1.2 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc))) matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/1,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: RemoveWeakSuffixes Proof: Consider the dependency graph 1:W:bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc) -->_1 bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue):2 2:W:bftMult'#1#(tuple#2(@elem,@queue),@acc) -> bftMult'#3#(@elem,@acc,@queue) -->_1 bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue):3 3:W:bftMult'#3#(::(@t,@_@3),@acc,@queue) -> bftMult'#4#(@t,@acc,@queue) -->_1 bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y):5 -->_1 bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc):4 4:W:bftMult'#4#(leaf(),@acc,@queue) -> bftMult'#(@queue,@acc) -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):1 5:W:bftMult'#4#(node(@y,@t1,@t2),@acc,@queue) -> bftMult'#5#(enqueue(@t2,enqueue(@t1,@queue)),@acc,@y) -->_1 bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y):7 -->_1 bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)):6 6:W:bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue',matrixMult(@acc,@y)) -->_1 bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue),@acc):1 7:W:bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) -->_1 matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2):11 8:W:computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)) -->_1 computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)):9 9:W:computeLine#1#(::(@x,@xs),@acc,@m) -> c_16(computeLine#2#(@m,@acc,@x,@xs)) -->_1 computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc))):10 10:W:computeLine#2#(::(@l,@ls),@acc,@x,@xs) -> c_18(computeLine#(@xs,@ls,lineMult(@x,@l,@acc))) -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):8 11:W:matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) -->_1 matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2):13 -->_1 matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()):12 12:W:matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) -->_1 computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line,@acc,@m)):8 13:W:matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) -->_1 matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2):11 The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. 1: bftMult'#(@queue,@acc) -> bftMult'#1#(bftMult'#2(@queue) ,@acc) 6: bftMult'#5#(@queue',@acc,@y) -> bftMult'#(@queue' ,matrixMult(@acc,@y)) 5: bftMult'#4#(node(@y,@t1,@t2) ,@acc ,@queue) -> bftMult'#5#(enqueue(@t2 ,enqueue(@t1,@queue)) ,@acc ,@y) 3: bftMult'#3#(::(@t,@_@3) ,@acc ,@queue) -> bftMult'#4#(@t ,@acc ,@queue) 2: bftMult'#1#(tuple#2(@elem ,@queue) ,@acc) -> bftMult'#3#(@elem ,@acc ,@queue) 4: bftMult'#4#(leaf() ,@acc ,@queue) -> bftMult'#(@queue ,@acc) 7: bftMult'#5#(@queue',@acc,@y) -> matrixMult#(@acc,@y) 11: matrixMult#(@m1,@m2) -> matrixMult#1#(@m1,@m2) 13: matrixMult#1#(::(@l,@ls),@m2) -> matrixMult#(@ls,@m2) 12: matrixMult#1#(::(@l,@ls),@m2) -> computeLine#(@l,@m2,nil()) 8: computeLine#(@line,@m,@acc) -> c_15(computeLine#1#(@line ,@acc ,@m)) 10: computeLine#2#(::(@l,@ls) ,@acc ,@x ,@xs) -> c_18(computeLine#(@xs ,@ls ,lineMult(@x,@l,@acc))) 9: computeLine#1#(::(@x,@xs) ,@acc ,@m) -> c_16(computeLine#2#(@m ,@acc ,@x ,@xs)) *** 1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.2.2.1.1.2.1 Progress [(O(1),O(1))] *** Considered Problem: Strict DP Rules: Strict TRS Rules: Weak DP Rules: Weak TRS Rules: #add(#0(),@y) -> @y #add(#neg(#s(#0())),@y) -> #pred(@y) #add(#neg(#s(#s(@x))),@y) -> #pred(#add(#pos(#s(@x)),@y)) #add(#pos(#s(#0())),@y) -> #succ(@y) #add(#pos(#s(#s(@x))),@y) -> #succ(#add(#pos(#s(@x)),@y)) #mult(#0(),#0()) -> #0() #mult(#0(),#neg(@y)) -> #0() #mult(#0(),#pos(@y)) -> #0() #mult(#neg(@x),#0()) -> #0() #mult(#neg(@x),#neg(@y)) -> #pos(#natmult(@x,@y)) #mult(#neg(@x),#pos(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#0()) -> #0() #mult(#pos(@x),#neg(@y)) -> #neg(#natmult(@x,@y)) #mult(#pos(@x),#pos(@y)) -> #pos(#natmult(@x,@y)) #natmult(#0(),@y) -> #0() #natmult(#s(@x),@y) -> #add(#pos(@y),#natmult(@x,@y)) #pred(#0()) -> #neg(#s(#0())) #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) #pred(#pos(#s(#0()))) -> #0() #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) #succ(#0()) -> #pos(#s(#0())) #succ(#neg(#s(#0()))) -> #0() #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) *(@x,@y) -> #mult(@x,@y) +(@x,@y) -> #add(@x,@y) appendreverse(@toreverse,@sofar) -> appendreverse#1(@toreverse,@sofar) appendreverse#1(::(@a,@as),@sofar) -> appendreverse(@as,::(@a,@sofar)) appendreverse#1(nil(),@sofar) -> @sofar bftMult'#2(tuple#2(@dequeue@1,@dequeue@2)) -> dequeue(@dequeue@1,@dequeue@2) computeLine(@line,@m,@acc) -> computeLine#1(@line,@acc,@m) computeLine#1(::(@x,@xs),@acc,@m) -> computeLine#2(@m,@acc,@x,@xs) computeLine#1(nil(),@acc,@m) -> @acc computeLine#2(::(@l,@ls),@acc,@x,@xs) -> computeLine(@xs,@ls,lineMult(@x,@l,@acc)) computeLine#2(nil(),@acc,@x,@xs) -> nil() dequeue(@outq,@inq) -> dequeue#1(@outq,@inq) dequeue#1(::(@t,@ts),@inq) -> tuple#2(::(@t,nil()),tuple#2(@ts,@inq)) dequeue#1(nil(),@inq) -> dequeue#2(reverse(@inq)) dequeue#2(::(@t,@ts)) -> tuple#2(::(@t,nil()),tuple#2(@ts,nil())) dequeue#2(nil()) -> tuple#2(nil(),tuple#2(nil(),nil())) enqueue(@t,@queue) -> enqueue#1(@queue,@t) enqueue#1(tuple#2(@outq,@inq),@t) -> tuple#2(@outq,::(@t,@inq)) lineMult(@n,@l1,@l2) -> lineMult#1(@l1,@l2,@n) lineMult#1(::(@x,@xs),@l2,@n) -> lineMult#2(@l2,@n,@x,@xs) lineMult#1(nil(),@l2,@n) -> nil() lineMult#2(::(@y,@ys),@n,@x,@xs) -> ::(+(*(@x,@n),@y),lineMult(@n,@xs,@ys)) lineMult#2(nil(),@n,@x,@xs) -> ::(*(@x,@n),lineMult(@n,@xs,nil())) matrixMult(@m1,@m2) -> matrixMult#1(@m1,@m2) matrixMult#1(::(@l,@ls),@m2) -> ::(computeLine(@l,@m2,nil()),matrixMult(@ls,@m2)) matrixMult#1(nil(),@m2) -> nil() reverse(@xs) -> appendreverse(@xs,nil()) Signature: {#add/2,#mult/2,#natmult/2,#pred/1,#succ/1,*/2,+/2,appendreverse/2,appendreverse#1/2,bftMult/2,bftMult'/2,bftMult'#1/2,bftMult'#2/1,bftMult'#3/3,bftMult'#4/3,bftMult'#5/3,computeLine/3,computeLine#1/3,computeLine#2/4,dequeue/2,dequeue#1/2,dequeue#2/1,enqueue/2,enqueue#1/2,lineMult/3,lineMult#1/3,lineMult#2/4,matrixMult/2,matrixMult#1/2,reverse/1,#add#/2,#mult#/2,#natmult#/2,#pred#/1,#succ#/1,*#/2,+#/2,appendreverse#/2,appendreverse#1#/2,bftMult#/2,bftMult'#/2,bftMult'#1#/2,bftMult'#2#/1,bftMult'#3#/3,bftMult'#4#/3,bftMult'#5#/3,computeLine#/3,computeLine#1#/3,computeLine#2#/4,dequeue#/2,dequeue#1#/2,dequeue#2#/1,enqueue#/2,enqueue#1#/2,lineMult#/3,lineMult#1#/3,lineMult#2#/4,matrixMult#/2,matrixMult#1#/2,reverse#/1} / {#0/0,#neg/1,#pos/1,#s/1,::/2,leaf/0,nil/0,node/3,tuple#2/2,c_1/1,c_2/1,c_3/1,c_4/1,c_5/0,c_6/1,c_7/1,c_8/1,c_9/1,c_10/1,c_11/0,c_12/1,c_13/1,c_14/2,c_15/1,c_16/1,c_17/0,c_18/1,c_19/0,c_20/1,c_21/0,c_22/1,c_23/0,c_24/0,c_25/1,c_26/0,c_27/1,c_28/1,c_29/0,c_30/1,c_31/1,c_32/1,c_33/2,c_34/0,c_35/1,c_36/0,c_37/1,c_38/2,c_39/1,c_40/2,c_41/0,c_42/0,c_43/0,c_44/0,c_45/1,c_46/1,c_47/0,c_48/1,c_49/1,c_50/0,c_51/2,c_52/0,c_53/0,c_54/0,c_55/0,c_56/0,c_57/0,c_58/0,c_59/0} Obligation: Innermost basic terms: {#add#,#mult#,#natmult#,#pred#,#succ#,*#,+#,appendreverse#,appendreverse#1#,bftMult#,bftMult'#,bftMult'#1#,bftMult'#2#,bftMult'#3#,bftMult'#4#,bftMult'#5#,computeLine#,computeLine#1#,computeLine#2#,dequeue#,dequeue#1#,dequeue#2#,enqueue#,enqueue#1#,lineMult#,lineMult#1#,lineMult#2#,matrixMult#,matrixMult#1#,reverse#}/{#0,#neg,#pos,#s,::,leaf,nil,node,tuple#2} Applied Processor: EmptyProcessor Proof: The problem is already closed. The intended complexity is O(1).