*** 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).