We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^3)).

Strict Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , reverse(@xs) -> appendreverse(@xs, nil())
  , bftMult'#5(@queue', @acc, @y) ->
    bftMult'(@queue', matrixMult(@acc, @y))
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , bftMult'#3(nil(), @acc, @queue) -> @acc
  , bftMult'#3(::(@t, @_@3), @acc, @queue) ->
    bftMult'#4(@t, @acc, @queue)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , bftMult(@t, @acc) ->
    bftMult'(tuple#2(::(@t, nil()), nil()), @acc)
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , bftMult'#1(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3(@elem, @acc, @queue)
  , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , 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)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , +(@x, @y) -> #add(@x, @y)
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Weak Trs:
  { #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^3))

We add the following dependency tuples:

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_10(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    c_3(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(nil(), @sofar) -> c_4()
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_5(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(nil(), @acc, @m) -> c_6()
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_7(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34()
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , bftMult'#3^#(nil(), @acc, @queue) -> c_8()
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_9(bftMult'#4^#(@t, @acc, @queue))
  , bftMult'#4^#(leaf(), @acc, @queue) ->
    c_21(bftMult'^#(@queue, @acc))
  , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
    c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y),
         enqueue^#(@t2, enqueue(@t1, @queue)),
         enqueue^#(@t1, @queue))
  , matrixMult#1^#(nil(), @m2) -> c_11()
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_20(computeLine#1^#(@line, @acc, @m))
  , bftMult^#(@t, @acc) ->
    c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
  , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(nil(), @l2, @n) -> c_32()
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_33(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys))
  , *^#(@x, @y) -> c_28(#mult^#(@x, @y))
  , +^#(@x, @y) -> c_25(#add^#(@x, @y))
  , dequeue#1^#(nil(), @inq) ->
    c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq))
  , dequeue#1^#(::(@t, @ts), @inq) -> c_24()
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_18(bftMult'#3^#(@elem, @acc, @queue))
  , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t))
  , dequeue#2^#(nil()) -> c_30()
  , dequeue#2^#(::(@t, @ts)) -> c_31()
  , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() }
Weak DPs:
  { #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y))
  , #add^#(#pos(#s(#s(@x))), @y) ->
    c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
  , #add^#(#0(), @y) -> c_40()
  , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y))
  , #add^#(#neg(#s(#s(@x))), @y) ->
    c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
  , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y))
  , #mult^#(#pos(@x), #0()) -> c_44()
  , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y))
  , #mult^#(#0(), #pos(@y)) -> c_46()
  , #mult^#(#0(), #0()) -> c_47()
  , #mult^#(#0(), #neg(@y)) -> c_48()
  , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y))
  , #mult^#(#neg(@x), #0()) -> c_50()
  , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y))
  , #natmult^#(#0(), @y) -> c_36()
  , #natmult^#(#s(@x), @y) ->
    c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y))
  , #succ^#(#pos(#s(@x))) -> c_52()
  , #succ^#(#0()) -> c_53()
  , #succ^#(#neg(#s(#0()))) -> c_54()
  , #succ^#(#neg(#s(#s(@x)))) -> c_55()
  , #pred^#(#pos(#s(#0()))) -> c_56()
  , #pred^#(#pos(#s(#s(@x)))) -> c_57()
  , #pred^#(#0()) -> c_58()
  , #pred^#(#neg(#s(@x))) -> c_59() }

and mark the set of starting terms.

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^3)).

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_10(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    c_3(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(nil(), @sofar) -> c_4()
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_5(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(nil(), @acc, @m) -> c_6()
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_7(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34()
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , bftMult'#3^#(nil(), @acc, @queue) -> c_8()
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_9(bftMult'#4^#(@t, @acc, @queue))
  , bftMult'#4^#(leaf(), @acc, @queue) ->
    c_21(bftMult'^#(@queue, @acc))
  , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
    c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y),
         enqueue^#(@t2, enqueue(@t1, @queue)),
         enqueue^#(@t1, @queue))
  , matrixMult#1^#(nil(), @m2) -> c_11()
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_20(computeLine#1^#(@line, @acc, @m))
  , bftMult^#(@t, @acc) ->
    c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
  , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(nil(), @l2, @n) -> c_32()
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_33(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys))
  , *^#(@x, @y) -> c_28(#mult^#(@x, @y))
  , +^#(@x, @y) -> c_25(#add^#(@x, @y))
  , dequeue#1^#(nil(), @inq) ->
    c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq))
  , dequeue#1^#(::(@t, @ts), @inq) -> c_24()
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_18(bftMult'#3^#(@elem, @acc, @queue))
  , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t))
  , dequeue#2^#(nil()) -> c_30()
  , dequeue#2^#(::(@t, @ts)) -> c_31()
  , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() }
Weak DPs:
  { #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y))
  , #add^#(#pos(#s(#s(@x))), @y) ->
    c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
  , #add^#(#0(), @y) -> c_40()
  , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y))
  , #add^#(#neg(#s(#s(@x))), @y) ->
    c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
  , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y))
  , #mult^#(#pos(@x), #0()) -> c_44()
  , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y))
  , #mult^#(#0(), #pos(@y)) -> c_46()
  , #mult^#(#0(), #0()) -> c_47()
  , #mult^#(#0(), #neg(@y)) -> c_48()
  , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y))
  , #mult^#(#neg(@x), #0()) -> c_50()
  , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y))
  , #natmult^#(#0(), @y) -> c_36()
  , #natmult^#(#s(@x), @y) ->
    c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y))
  , #succ^#(#pos(#s(@x))) -> c_52()
  , #succ^#(#0()) -> c_53()
  , #succ^#(#neg(#s(#0()))) -> c_54()
  , #succ^#(#neg(#s(#s(@x)))) -> c_55()
  , #pred^#(#pos(#s(#0()))) -> c_56()
  , #pred^#(#pos(#s(#s(@x)))) -> c_57()
  , #pred^#(#0()) -> c_58()
  , #pred^#(#neg(#s(@x))) -> c_59() }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , bftMult'#5(@queue', @acc, @y) ->
    bftMult'(@queue', matrixMult(@acc, @y))
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , bftMult'#3(nil(), @acc, @queue) -> @acc
  , bftMult'#3(::(@t, @_@3), @acc, @queue) ->
    bftMult'#4(@t, @acc, @queue)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , bftMult(@t, @acc) ->
    bftMult'(tuple#2(::(@t, nil()), nil()), @acc)
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , bftMult'#1(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3(@elem, @acc, @queue)
  , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , 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)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^3))

We estimate the number of application of
{8,10,12,14,18,23,27,28,30,33,34,35} by applications of
Pre({8,10,12,14,18,23,27,28,30,33,34,35}) =
{2,4,7,11,20,22,25,26,29,31,32}. Here rules are labeled as follows:

  DPs:
    { 1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
         c_1(dequeue^#(@dequeue@1, @dequeue@2))
    , 2: dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq))
    , 3: reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil()))
    , 4: appendreverse^#(@toreverse, @sofar) ->
         c_10(appendreverse#1^#(@toreverse, @sofar))
    , 5: bftMult'#5^#(@queue', @acc, @y) ->
         c_3(bftMult'^#(@queue', matrixMult(@acc, @y)),
             matrixMult^#(@acc, @y))
    , 6: bftMult'^#(@queue, @acc) ->
         c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
    , 7: matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2))
    , 8: appendreverse#1^#(nil(), @sofar) -> c_4()
    , 9: appendreverse#1^#(::(@a, @as), @sofar) ->
         c_5(appendreverse^#(@as, ::(@a, @sofar)))
    , 10: computeLine#1^#(nil(), @acc, @m) -> c_6()
    , 11: computeLine#1^#(::(@x, @xs), @acc, @m) ->
          c_7(computeLine#2^#(@m, @acc, @x, @xs))
    , 12: computeLine#2^#(nil(), @acc, @x, @xs) -> c_34()
    , 13: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
          c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
               lineMult^#(@x, @l, @acc))
    , 14: bftMult'#3^#(nil(), @acc, @queue) -> c_8()
    , 15: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
          c_9(bftMult'#4^#(@t, @acc, @queue))
    , 16: bftMult'#4^#(leaf(), @acc, @queue) ->
          c_21(bftMult'^#(@queue, @acc))
    , 17: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
          c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y),
               enqueue^#(@t2, enqueue(@t1, @queue)),
               enqueue^#(@t1, @queue))
    , 18: matrixMult#1^#(nil(), @m2) -> c_11()
    , 19: matrixMult#1^#(::(@l, @ls), @m2) ->
          c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
    , 20: computeLine^#(@line, @m, @acc) ->
          c_20(computeLine#1^#(@line, @acc, @m))
    , 21: bftMult^#(@t, @acc) ->
          c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
    , 22: lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n))
    , 23: lineMult#1^#(nil(), @l2, @n) -> c_32()
    , 24: lineMult#1^#(::(@x, @xs), @l2, @n) ->
          c_33(lineMult#2^#(@l2, @n, @x, @xs))
    , 25: lineMult#2^#(nil(), @n, @x, @xs) ->
          c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil()))
    , 26: lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
          c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys))
    , 27: *^#(@x, @y) -> c_28(#mult^#(@x, @y))
    , 28: +^#(@x, @y) -> c_25(#add^#(@x, @y))
    , 29: dequeue#1^#(nil(), @inq) ->
          c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq))
    , 30: dequeue#1^#(::(@t, @ts), @inq) -> c_24()
    , 31: bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
          c_18(bftMult'#3^#(@elem, @acc, @queue))
    , 32: enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t))
    , 33: dequeue#2^#(nil()) -> c_30()
    , 34: dequeue#2^#(::(@t, @ts)) -> c_31()
    , 35: enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26()
    , 36: #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y))
    , 37: #add^#(#pos(#s(#s(@x))), @y) ->
          c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
    , 38: #add^#(#0(), @y) -> c_40()
    , 39: #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y))
    , 40: #add^#(#neg(#s(#s(@x))), @y) ->
          c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
    , 41: #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y))
    , 42: #mult^#(#pos(@x), #0()) -> c_44()
    , 43: #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y))
    , 44: #mult^#(#0(), #pos(@y)) -> c_46()
    , 45: #mult^#(#0(), #0()) -> c_47()
    , 46: #mult^#(#0(), #neg(@y)) -> c_48()
    , 47: #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y))
    , 48: #mult^#(#neg(@x), #0()) -> c_50()
    , 49: #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y))
    , 50: #natmult^#(#0(), @y) -> c_36()
    , 51: #natmult^#(#s(@x), @y) ->
          c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y))
    , 52: #succ^#(#pos(#s(@x))) -> c_52()
    , 53: #succ^#(#0()) -> c_53()
    , 54: #succ^#(#neg(#s(#0()))) -> c_54()
    , 55: #succ^#(#neg(#s(#s(@x)))) -> c_55()
    , 56: #pred^#(#pos(#s(#0()))) -> c_56()
    , 57: #pred^#(#pos(#s(#s(@x)))) -> c_57()
    , 58: #pred^#(#0()) -> c_58()
    , 59: #pred^#(#neg(#s(@x))) -> c_59() }

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^3)).

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_10(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    c_3(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_5(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_7(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_9(bftMult'#4^#(@t, @acc, @queue))
  , bftMult'#4^#(leaf(), @acc, @queue) ->
    c_21(bftMult'^#(@queue, @acc))
  , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
    c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y),
         enqueue^#(@t2, enqueue(@t1, @queue)),
         enqueue^#(@t1, @queue))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_20(computeLine#1^#(@line, @acc, @m))
  , bftMult^#(@t, @acc) ->
    c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
  , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_33(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) ->
    c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_18(bftMult'#3^#(@elem, @acc, @queue))
  , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t)) }
Weak DPs:
  { appendreverse#1^#(nil(), @sofar) -> c_4()
  , computeLine#1^#(nil(), @acc, @m) -> c_6()
  , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34()
  , bftMult'#3^#(nil(), @acc, @queue) -> c_8()
  , matrixMult#1^#(nil(), @m2) -> c_11()
  , lineMult#1^#(nil(), @l2, @n) -> c_32()
  , *^#(@x, @y) -> c_28(#mult^#(@x, @y))
  , +^#(@x, @y) -> c_25(#add^#(@x, @y))
  , dequeue#1^#(::(@t, @ts), @inq) -> c_24()
  , dequeue#2^#(nil()) -> c_30()
  , dequeue#2^#(::(@t, @ts)) -> c_31()
  , #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y))
  , #add^#(#pos(#s(#s(@x))), @y) ->
    c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
  , #add^#(#0(), @y) -> c_40()
  , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y))
  , #add^#(#neg(#s(#s(@x))), @y) ->
    c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
  , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26()
  , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y))
  , #mult^#(#pos(@x), #0()) -> c_44()
  , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y))
  , #mult^#(#0(), #pos(@y)) -> c_46()
  , #mult^#(#0(), #0()) -> c_47()
  , #mult^#(#0(), #neg(@y)) -> c_48()
  , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y))
  , #mult^#(#neg(@x), #0()) -> c_50()
  , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y))
  , #natmult^#(#0(), @y) -> c_36()
  , #natmult^#(#s(@x), @y) ->
    c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y))
  , #succ^#(#pos(#s(@x))) -> c_52()
  , #succ^#(#0()) -> c_53()
  , #succ^#(#neg(#s(#0()))) -> c_54()
  , #succ^#(#neg(#s(#s(@x)))) -> c_55()
  , #pred^#(#pos(#s(#0()))) -> c_56()
  , #pred^#(#pos(#s(#s(@x)))) -> c_57()
  , #pred^#(#0()) -> c_58()
  , #pred^#(#neg(#s(@x))) -> c_59() }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , bftMult'#5(@queue', @acc, @y) ->
    bftMult'(@queue', matrixMult(@acc, @y))
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , bftMult'#3(nil(), @acc, @queue) -> @acc
  , bftMult'#3(::(@t, @_@3), @acc, @queue) ->
    bftMult'#4(@t, @acc, @queue)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , bftMult(@t, @acc) ->
    bftMult'(tuple#2(::(@t, nil()), nil()), @acc)
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , bftMult'#1(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3(@elem, @acc, @queue)
  , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , 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)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^3))

We estimate the number of application of {23} by applications of
Pre({23}) = {13}. Here rules are labeled as follows:

  DPs:
    { 1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
         c_1(dequeue^#(@dequeue@1, @dequeue@2))
    , 2: dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq))
    , 3: reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil()))
    , 4: appendreverse^#(@toreverse, @sofar) ->
         c_10(appendreverse#1^#(@toreverse, @sofar))
    , 5: bftMult'#5^#(@queue', @acc, @y) ->
         c_3(bftMult'^#(@queue', matrixMult(@acc, @y)),
             matrixMult^#(@acc, @y))
    , 6: bftMult'^#(@queue, @acc) ->
         c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
    , 7: matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2))
    , 8: appendreverse#1^#(::(@a, @as), @sofar) ->
         c_5(appendreverse^#(@as, ::(@a, @sofar)))
    , 9: computeLine#1^#(::(@x, @xs), @acc, @m) ->
         c_7(computeLine#2^#(@m, @acc, @x, @xs))
    , 10: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
          c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
               lineMult^#(@x, @l, @acc))
    , 11: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
          c_9(bftMult'#4^#(@t, @acc, @queue))
    , 12: bftMult'#4^#(leaf(), @acc, @queue) ->
          c_21(bftMult'^#(@queue, @acc))
    , 13: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
          c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y),
               enqueue^#(@t2, enqueue(@t1, @queue)),
               enqueue^#(@t1, @queue))
    , 14: matrixMult#1^#(::(@l, @ls), @m2) ->
          c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
    , 15: computeLine^#(@line, @m, @acc) ->
          c_20(computeLine#1^#(@line, @acc, @m))
    , 16: bftMult^#(@t, @acc) ->
          c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
    , 17: lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n))
    , 18: lineMult#1^#(::(@x, @xs), @l2, @n) ->
          c_33(lineMult#2^#(@l2, @n, @x, @xs))
    , 19: lineMult#2^#(nil(), @n, @x, @xs) ->
          c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil()))
    , 20: lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
          c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys))
    , 21: dequeue#1^#(nil(), @inq) ->
          c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq))
    , 22: bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
          c_18(bftMult'#3^#(@elem, @acc, @queue))
    , 23: enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t))
    , 24: appendreverse#1^#(nil(), @sofar) -> c_4()
    , 25: computeLine#1^#(nil(), @acc, @m) -> c_6()
    , 26: computeLine#2^#(nil(), @acc, @x, @xs) -> c_34()
    , 27: bftMult'#3^#(nil(), @acc, @queue) -> c_8()
    , 28: matrixMult#1^#(nil(), @m2) -> c_11()
    , 29: lineMult#1^#(nil(), @l2, @n) -> c_32()
    , 30: *^#(@x, @y) -> c_28(#mult^#(@x, @y))
    , 31: +^#(@x, @y) -> c_25(#add^#(@x, @y))
    , 32: dequeue#1^#(::(@t, @ts), @inq) -> c_24()
    , 33: dequeue#2^#(nil()) -> c_30()
    , 34: dequeue#2^#(::(@t, @ts)) -> c_31()
    , 35: #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y))
    , 36: #add^#(#pos(#s(#s(@x))), @y) ->
          c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
    , 37: #add^#(#0(), @y) -> c_40()
    , 38: #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y))
    , 39: #add^#(#neg(#s(#s(@x))), @y) ->
          c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
    , 40: enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26()
    , 41: #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y))
    , 42: #mult^#(#pos(@x), #0()) -> c_44()
    , 43: #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y))
    , 44: #mult^#(#0(), #pos(@y)) -> c_46()
    , 45: #mult^#(#0(), #0()) -> c_47()
    , 46: #mult^#(#0(), #neg(@y)) -> c_48()
    , 47: #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y))
    , 48: #mult^#(#neg(@x), #0()) -> c_50()
    , 49: #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y))
    , 50: #natmult^#(#0(), @y) -> c_36()
    , 51: #natmult^#(#s(@x), @y) ->
          c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y))
    , 52: #succ^#(#pos(#s(@x))) -> c_52()
    , 53: #succ^#(#0()) -> c_53()
    , 54: #succ^#(#neg(#s(#0()))) -> c_54()
    , 55: #succ^#(#neg(#s(#s(@x)))) -> c_55()
    , 56: #pred^#(#pos(#s(#0()))) -> c_56()
    , 57: #pred^#(#pos(#s(#s(@x)))) -> c_57()
    , 58: #pred^#(#0()) -> c_58()
    , 59: #pred^#(#neg(#s(@x))) -> c_59() }

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^3)).

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_10(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    c_3(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_5(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_7(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_9(bftMult'#4^#(@t, @acc, @queue))
  , bftMult'#4^#(leaf(), @acc, @queue) ->
    c_21(bftMult'^#(@queue, @acc))
  , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
    c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y),
         enqueue^#(@t2, enqueue(@t1, @queue)),
         enqueue^#(@t1, @queue))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_20(computeLine#1^#(@line, @acc, @m))
  , bftMult^#(@t, @acc) ->
    c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
  , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_33(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) ->
    c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_18(bftMult'#3^#(@elem, @acc, @queue)) }
Weak DPs:
  { appendreverse#1^#(nil(), @sofar) -> c_4()
  , computeLine#1^#(nil(), @acc, @m) -> c_6()
  , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34()
  , bftMult'#3^#(nil(), @acc, @queue) -> c_8()
  , matrixMult#1^#(nil(), @m2) -> c_11()
  , lineMult#1^#(nil(), @l2, @n) -> c_32()
  , *^#(@x, @y) -> c_28(#mult^#(@x, @y))
  , +^#(@x, @y) -> c_25(#add^#(@x, @y))
  , dequeue#1^#(::(@t, @ts), @inq) -> c_24()
  , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t))
  , dequeue#2^#(nil()) -> c_30()
  , dequeue#2^#(::(@t, @ts)) -> c_31()
  , #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y))
  , #add^#(#pos(#s(#s(@x))), @y) ->
    c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
  , #add^#(#0(), @y) -> c_40()
  , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y))
  , #add^#(#neg(#s(#s(@x))), @y) ->
    c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
  , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26()
  , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y))
  , #mult^#(#pos(@x), #0()) -> c_44()
  , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y))
  , #mult^#(#0(), #pos(@y)) -> c_46()
  , #mult^#(#0(), #0()) -> c_47()
  , #mult^#(#0(), #neg(@y)) -> c_48()
  , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y))
  , #mult^#(#neg(@x), #0()) -> c_50()
  , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y))
  , #natmult^#(#0(), @y) -> c_36()
  , #natmult^#(#s(@x), @y) ->
    c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y))
  , #succ^#(#pos(#s(@x))) -> c_52()
  , #succ^#(#0()) -> c_53()
  , #succ^#(#neg(#s(#0()))) -> c_54()
  , #succ^#(#neg(#s(#s(@x)))) -> c_55()
  , #pred^#(#pos(#s(#0()))) -> c_56()
  , #pred^#(#pos(#s(#s(@x)))) -> c_57()
  , #pred^#(#0()) -> c_58()
  , #pred^#(#neg(#s(@x))) -> c_59() }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , bftMult'#5(@queue', @acc, @y) ->
    bftMult'(@queue', matrixMult(@acc, @y))
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , bftMult'#3(nil(), @acc, @queue) -> @acc
  , bftMult'#3(::(@t, @_@3), @acc, @queue) ->
    bftMult'#4(@t, @acc, @queue)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , bftMult(@t, @acc) ->
    bftMult'(tuple#2(::(@t, nil()), nil()), @acc)
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , bftMult'#1(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3(@elem, @acc, @queue)
  , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , 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)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^3))

The following weak DPs constitute a sub-graph of the DG that is
closed under successors. The DPs are removed.

{ appendreverse#1^#(nil(), @sofar) -> c_4()
, computeLine#1^#(nil(), @acc, @m) -> c_6()
, computeLine#2^#(nil(), @acc, @x, @xs) -> c_34()
, bftMult'#3^#(nil(), @acc, @queue) -> c_8()
, matrixMult#1^#(nil(), @m2) -> c_11()
, lineMult#1^#(nil(), @l2, @n) -> c_32()
, *^#(@x, @y) -> c_28(#mult^#(@x, @y))
, +^#(@x, @y) -> c_25(#add^#(@x, @y))
, dequeue#1^#(::(@t, @ts), @inq) -> c_24()
, enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t))
, dequeue#2^#(nil()) -> c_30()
, dequeue#2^#(::(@t, @ts)) -> c_31()
, #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y))
, #add^#(#pos(#s(#s(@x))), @y) ->
  c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
, #add^#(#0(), @y) -> c_40()
, #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y))
, #add^#(#neg(#s(#s(@x))), @y) ->
  c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y))
, enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26()
, #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y))
, #mult^#(#pos(@x), #0()) -> c_44()
, #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y))
, #mult^#(#0(), #pos(@y)) -> c_46()
, #mult^#(#0(), #0()) -> c_47()
, #mult^#(#0(), #neg(@y)) -> c_48()
, #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y))
, #mult^#(#neg(@x), #0()) -> c_50()
, #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y))
, #natmult^#(#0(), @y) -> c_36()
, #natmult^#(#s(@x), @y) ->
  c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y))
, #succ^#(#pos(#s(@x))) -> c_52()
, #succ^#(#0()) -> c_53()
, #succ^#(#neg(#s(#0()))) -> c_54()
, #succ^#(#neg(#s(#s(@x)))) -> c_55()
, #pred^#(#pos(#s(#0()))) -> c_56()
, #pred^#(#pos(#s(#s(@x)))) -> c_57()
, #pred^#(#0()) -> c_58()
, #pred^#(#neg(#s(@x))) -> c_59() }

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^3)).

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_10(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    c_3(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_5(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_7(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_9(bftMult'#4^#(@t, @acc, @queue))
  , bftMult'#4^#(leaf(), @acc, @queue) ->
    c_21(bftMult'^#(@queue, @acc))
  , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
    c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y),
         enqueue^#(@t2, enqueue(@t1, @queue)),
         enqueue^#(@t1, @queue))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_20(computeLine#1^#(@line, @acc, @m))
  , bftMult^#(@t, @acc) ->
    c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
  , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_33(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) ->
    c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_18(bftMult'#3^#(@elem, @acc, @queue)) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , bftMult'#5(@queue', @acc, @y) ->
    bftMult'(@queue', matrixMult(@acc, @y))
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , bftMult'#3(nil(), @acc, @queue) -> @acc
  , bftMult'#3(::(@t, @_@3), @acc, @queue) ->
    bftMult'#4(@t, @acc, @queue)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , bftMult(@t, @acc) ->
    bftMult'(tuple#2(::(@t, nil()), nil()), @acc)
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , bftMult'#1(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3(@elem, @acc, @queue)
  , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , 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)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^3))

Due to missing edges in the dependency-graph, the right-hand sides
of following rules could be simplified:

  { bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
    c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y),
         enqueue^#(@t2, enqueue(@t1, @queue)),
         enqueue^#(@t1, @queue))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) ->
    c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) }

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^3)).

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_4(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_8(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_11(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))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , bftMult^#(@t, @acc) ->
    c_16(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_22(bftMult'#3^#(@elem, @acc, @queue)) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , bftMult'#5(@queue', @acc, @y) ->
    bftMult'(@queue', matrixMult(@acc, @y))
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , bftMult'#3(nil(), @acc, @queue) -> @acc
  , bftMult'#3(::(@t, @_@3), @acc, @queue) ->
    bftMult'#4(@t, @acc, @queue)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , bftMult(@t, @acc) ->
    bftMult'(tuple#2(::(@t, nil()), nil()), @acc)
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , bftMult'#1(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3(@elem, @acc, @queue)
  , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , 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)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^3))

We replace rewrite rules by usable rules:

  Weak Usable Rules:
    { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
      dequeue(@dequeue@1, @dequeue@2)
    , #natmult(#0(), @y) -> #0()
    , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
    , reverse(@xs) -> appendreverse(@xs, nil())
    , appendreverse#1(nil(), @sofar) -> @sofar
    , appendreverse#1(::(@a, @as), @sofar) ->
      appendreverse(@as, ::(@a, @sofar))
    , computeLine#1(nil(), @acc, @m) -> @acc
    , computeLine#1(::(@x, @xs), @acc, @m) ->
      computeLine#2(@m, @acc, @x, @xs)
    , appendreverse(@toreverse, @sofar) ->
      appendreverse#1(@toreverse, @sofar)
    , matrixMult#1(nil(), @m2) -> nil()
    , matrixMult#1(::(@l, @ls), @m2) ->
      ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
    , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
    , lineMult#2(nil(), @n, @x, @xs) ->
      ::(*(@x, @n), lineMult(@n, @xs, nil()))
    , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
      ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
    , #add(#pos(#s(#0())), @y) -> #succ(@y)
    , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
    , #add(#0(), @y) -> @y
    , #add(#neg(#s(#0())), @y) -> #pred(@y)
    , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
    , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
    , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
    , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
    , dequeue#1(::(@t, @ts), @inq) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
    , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
    , #mult(#pos(@x), #0()) -> #0()
    , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#0(), #pos(@y)) -> #0()
    , #mult(#0(), #0()) -> #0()
    , #mult(#0(), #neg(@y)) -> #0()
    , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#neg(@x), #0()) -> #0()
    , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
    , +(@x, @y) -> #add(@x, @y)
    , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
    , #succ(#0()) -> #pos(#s(#0()))
    , #succ(#neg(#s(#0()))) -> #0()
    , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
    , enqueue#1(tuple#2(@outq, @inq), @t) ->
      tuple#2(@outq, ::(@t, @inq))
    , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
    , *(@x, @y) -> #mult(@x, @y)
    , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
    , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
    , dequeue#2(::(@t, @ts)) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
    , #pred(#pos(#s(#0()))) -> #0()
    , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
    , #pred(#0()) -> #neg(#s(#0()))
    , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
    , lineMult#1(nil(), @l2, @n) -> nil()
    , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
    , computeLine#2(nil(), @acc, @x, @xs) -> nil()
    , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
      computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^3)).

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_4(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_8(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_11(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))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , bftMult^#(@t, @acc) ->
    c_16(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_22(bftMult'#3^#(@elem, @acc, @queue)) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^3))

Consider the dependency graph

  1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
     c_1(dequeue^#(@dequeue@1, @dequeue@2))
     -->_1 dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) :2
  
  2: dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
     -->_1 dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) :21
  
  3: reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
     -->_1 appendreverse^#(@toreverse, @sofar) ->
           c_4(appendreverse#1^#(@toreverse, @sofar)) :4
  
  4: appendreverse^#(@toreverse, @sofar) ->
     c_4(appendreverse#1^#(@toreverse, @sofar))
     -->_1 appendreverse#1^#(::(@a, @as), @sofar) ->
           c_8(appendreverse^#(@as, ::(@a, @sofar))) :8
  
  5: bftMult'#5^#(@queue', @acc, @y) ->
     c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
         matrixMult^#(@acc, @y))
     -->_2 matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) :7
     -->_1 bftMult'^#(@queue, @acc) ->
           c_6(bftMult'#1^#(bftMult'#2(@queue), @acc),
               bftMult'#2^#(@queue)) :6
  
  6: bftMult'^#(@queue, @acc) ->
     c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
     -->_1 bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
           c_22(bftMult'#3^#(@elem, @acc, @queue)) :22
     -->_2 bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
           c_1(dequeue^#(@dequeue@1, @dequeue@2)) :1
  
  7: matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
     -->_1 matrixMult#1^#(::(@l, @ls), @m2) ->
           c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) :14
  
  8: appendreverse#1^#(::(@a, @as), @sofar) ->
     c_8(appendreverse^#(@as, ::(@a, @sofar)))
     -->_1 appendreverse^#(@toreverse, @sofar) ->
           c_4(appendreverse#1^#(@toreverse, @sofar)) :4
  
  9: computeLine#1^#(::(@x, @xs), @acc, @m) ->
     c_9(computeLine#2^#(@m, @acc, @x, @xs))
     -->_1 computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
           c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
                lineMult^#(@x, @l, @acc)) :10
  
  10: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
      c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
           lineMult^#(@x, @l, @acc))
     -->_2 lineMult^#(@n, @l1, @l2) ->
           c_17(lineMult#1^#(@l1, @l2, @n)) :17
     -->_1 computeLine^#(@line, @m, @acc) ->
           c_15(computeLine#1^#(@line, @acc, @m)) :15
  
  11: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
      c_11(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)) :13
     -->_1 bftMult'#4^#(leaf(), @acc, @queue) ->
           c_12(bftMult'^#(@queue, @acc)) :12
  
  12: bftMult'#4^#(leaf(), @acc, @queue) ->
      c_12(bftMult'^#(@queue, @acc))
     -->_1 bftMult'^#(@queue, @acc) ->
           c_6(bftMult'#1^#(bftMult'#2(@queue), @acc),
               bftMult'#2^#(@queue)) :6
  
  13: 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_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
               matrixMult^#(@acc, @y)) :5
  
  14: matrixMult#1^#(::(@l, @ls), @m2) ->
      c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
     -->_1 computeLine^#(@line, @m, @acc) ->
           c_15(computeLine#1^#(@line, @acc, @m)) :15
     -->_2 matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) :7
  
  15: computeLine^#(@line, @m, @acc) ->
      c_15(computeLine#1^#(@line, @acc, @m))
     -->_1 computeLine#1^#(::(@x, @xs), @acc, @m) ->
           c_9(computeLine#2^#(@m, @acc, @x, @xs)) :9
  
  16: bftMult^#(@t, @acc) ->
      c_16(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc))
     -->_1 bftMult'^#(@queue, @acc) ->
           c_6(bftMult'#1^#(bftMult'#2(@queue), @acc),
               bftMult'#2^#(@queue)) :6
  
  17: lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
     -->_1 lineMult#1^#(::(@x, @xs), @l2, @n) ->
           c_18(lineMult#2^#(@l2, @n, @x, @xs)) :18
  
  18: lineMult#1^#(::(@x, @xs), @l2, @n) ->
      c_18(lineMult#2^#(@l2, @n, @x, @xs))
     -->_1 lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
           c_20(lineMult^#(@n, @xs, @ys)) :20
     -->_1 lineMult#2^#(nil(), @n, @x, @xs) ->
           c_19(lineMult^#(@n, @xs, nil())) :19
  
  19: lineMult#2^#(nil(), @n, @x, @xs) ->
      c_19(lineMult^#(@n, @xs, nil()))
     -->_1 lineMult^#(@n, @l1, @l2) ->
           c_17(lineMult#1^#(@l1, @l2, @n)) :17
  
  20: lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
      c_20(lineMult^#(@n, @xs, @ys))
     -->_1 lineMult^#(@n, @l1, @l2) ->
           c_17(lineMult#1^#(@l1, @l2, @n)) :17
  
  21: dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq))
     -->_1 reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) :3
  
  22: bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
      c_22(bftMult'#3^#(@elem, @acc, @queue))
     -->_1 bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
           c_11(bftMult'#4^#(@t, @acc, @queue)) :11
  

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

  { bftMult^#(@t, @acc) ->
    c_16(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) }


We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^3)).

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_4(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_8(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_11(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))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_22(bftMult'#3^#(@elem, @acc, @queue)) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^3))

We decompose the input problem according to the dependency graph
into the upper component

  { bftMult'#5^#(@queue', @acc, @y) ->
    c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_11(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'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_22(bftMult'#3^#(@elem, @acc, @queue)) }

and lower component

  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_4(appendreverse#1^#(@toreverse, @sofar))
  , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_8(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) }

Further, following extension rules are added to the lower
component.

{ bftMult'#5^#(@queue', @acc, @y) ->
  bftMult'^#(@queue', matrixMult(@acc, @y))
, bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
, bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue)
, bftMult'^#(@queue, @acc) ->
  bftMult'#1^#(bftMult'#2(@queue), @acc)
, 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'#1^#(tuple#2(@elem, @queue), @acc) ->
  bftMult'#3^#(@elem, @acc, @queue) }

TcT solves the upper component with certificate YES(O(1),O(n^1)).

Sub-proof:
----------
  We are left with following problem, upon which TcT provides the
  certificate YES(O(1),O(n^1)).
  
  Strict DPs:
    { bftMult'#5^#(@queue', @acc, @y) ->
      c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
          matrixMult^#(@acc, @y))
    , bftMult'^#(@queue, @acc) ->
      c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
    , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
      c_11(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'#1^#(tuple#2(@elem, @queue), @acc) ->
      c_22(bftMult'#3^#(@elem, @acc, @queue)) }
  Weak Trs:
    { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
      dequeue(@dequeue@1, @dequeue@2)
    , #natmult(#0(), @y) -> #0()
    , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
    , reverse(@xs) -> appendreverse(@xs, nil())
    , appendreverse#1(nil(), @sofar) -> @sofar
    , appendreverse#1(::(@a, @as), @sofar) ->
      appendreverse(@as, ::(@a, @sofar))
    , computeLine#1(nil(), @acc, @m) -> @acc
    , computeLine#1(::(@x, @xs), @acc, @m) ->
      computeLine#2(@m, @acc, @x, @xs)
    , appendreverse(@toreverse, @sofar) ->
      appendreverse#1(@toreverse, @sofar)
    , matrixMult#1(nil(), @m2) -> nil()
    , matrixMult#1(::(@l, @ls), @m2) ->
      ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
    , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
    , lineMult#2(nil(), @n, @x, @xs) ->
      ::(*(@x, @n), lineMult(@n, @xs, nil()))
    , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
      ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
    , #add(#pos(#s(#0())), @y) -> #succ(@y)
    , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
    , #add(#0(), @y) -> @y
    , #add(#neg(#s(#0())), @y) -> #pred(@y)
    , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
    , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
    , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
    , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
    , dequeue#1(::(@t, @ts), @inq) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
    , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
    , #mult(#pos(@x), #0()) -> #0()
    , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#0(), #pos(@y)) -> #0()
    , #mult(#0(), #0()) -> #0()
    , #mult(#0(), #neg(@y)) -> #0()
    , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#neg(@x), #0()) -> #0()
    , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
    , +(@x, @y) -> #add(@x, @y)
    , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
    , #succ(#0()) -> #pos(#s(#0()))
    , #succ(#neg(#s(#0()))) -> #0()
    , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
    , enqueue#1(tuple#2(@outq, @inq), @t) ->
      tuple#2(@outq, ::(@t, @inq))
    , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
    , *(@x, @y) -> #mult(@x, @y)
    , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
    , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
    , dequeue#2(::(@t, @ts)) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
    , #pred(#pos(#s(#0()))) -> #0()
    , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
    , #pred(#0()) -> #neg(#s(#0()))
    , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
    , lineMult#1(nil(), @l2, @n) -> nil()
    , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
    , computeLine#2(nil(), @acc, @x, @xs) -> nil()
    , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
      computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
  Obligation:
    innermost runtime complexity
  Answer:
    YES(O(1),O(n^1))
  
  We use the processor 'matrix interpretation of dimension 1' to
  orient following rules strictly.
  
  DPs:
    { 3: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
         c_11(bftMult'#4^#(@t, @acc, @queue))
    , 4: bftMult'#4^#(leaf(), @acc, @queue) ->
         c_12(bftMult'^#(@queue, @acc)) }
  Trs:
    { matrixMult#1(nil(), @m2) -> nil()
    , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
    , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
    , dequeue#1(::(@t, @ts), @inq) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
    , *(@x, @y) -> #mult(@x, @y)
    , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
    , dequeue#2(::(@t, @ts)) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, nil())) }
  
  Sub-proof:
  ----------
    The following argument positions are usable:
      Uargs(c_5) = {1}, Uargs(c_6) = {1}, Uargs(c_11) = {1},
      Uargs(c_12) = {1}, Uargs(c_13) = {1}, Uargs(c_22) = {1}
    
    TcT has computed the following constructor-based matrix
    interpretation satisfying not(EDA).
    
                     [bftMult'#2](x1) = [1] x1 + [3]                  
                                                                      
                   [#natmult](x1, x2) = [0]                           
                                                                      
                        [reverse](x1) = [1] x1 + [0]                  
                                                                      
            [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
          [computeLine#1](x1, x2, x3) = [3] x2 + [0]                  
                                                                      
              [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
               [matrixMult#1](x1, x2) = [1]                           
                                                                      
                               [leaf] = [0]                           
                                                                      
               [lineMult](x1, x2, x3) = [2]                           
                                                                      
         [lineMult#2](x1, x2, x3, x4) = [2] x4 + [0]                  
                                                                      
                           [#pos](x1) = [0]                           
                                                                      
                       [#add](x1, x2) = [0]                           
                                                                      
                   [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [7]
                                                                      
                    [dequeue](x1, x2) = [1] x1 + [1] x2 + [4]         
                                                                      
                    [tuple#2](x1, x2) = [1] x1 + [1] x2 + [1]         
                                                                      
                                [nil] = [0]                           
                                                                      
            [computeLine](x1, x2, x3) = [4]                           
                                                                      
                  [dequeue#1](x1, x2) = [1] x1 + [1] x2 + [3]         
                                                                      
                         [::](x1, x2) = [1] x1 + [1] x2 + [4]         
                                                                      
                      [#mult](x1, x2) = [0]                           
                                                                      
                          [+](x1, x2) = [3] x1 + [0]                  
                                                                      
                          [#succ](x1) = [0]                           
                                                                      
                                 [#0] = [0]                           
                                                                      
                  [enqueue#1](x1, x2) = [1] x1 + [1] x2 + [4]         
                                                                      
                           [#neg](x1) = [0]                           
                                                                      
                 [matrixMult](x1, x2) = [1]                           
                                                                      
                          [*](x1, x2) = [2]                           
                                                                      
                    [enqueue](x1, x2) = [1] x1 + [1] x2 + [4]         
                                                                      
                      [dequeue#2](x1) = [1] x1 + [3]                  
                                                                      
                          [#pred](x1) = [0]                           
                                                                      
             [lineMult#1](x1, x2, x3) = [0]                           
                                                                      
                             [#s](x1) = [0]                           
                                                                      
      [computeLine#2](x1, x2, x3, x4) = [0]                           
                                                                      
                   [bftMult'#2^#](x1) = [0]                           
                                                                      
           [bftMult'#5^#](x1, x2, x3) = [1] x1 + [3]                  
                                                                      
                 [bftMult'^#](x1, x2) = [1] x1 + [3]                  
                                                                      
               [matrixMult^#](x1, x2) = [0]                           
                                                                      
           [bftMult'#3^#](x1, x2, x3) = [1] x1 + [1] x3 + [1]         
                                                                      
           [bftMult'#4^#](x1, x2, x3) = [1] x1 + [1] x3 + [4]         
                                                                      
               [bftMult'#1^#](x1, x2) = [1] x1 + [0]                  
                                                                      
                        [c_5](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
                        [c_6](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
                           [c_11](x1) = [1] x1 + [0]                  
                                                                      
                           [c_12](x1) = [1] x1 + [0]                  
                                                                      
                           [c_13](x1) = [1] x1 + [0]                  
                                                                      
                           [c_22](x1) = [1] x1 + [0]                  
    
    The order satisfies the following ordering constraints:
    
         [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] =  [1] @dequeue@1 + [1] @dequeue@2 + [4]                              
                                                       >= [1] @dequeue@1 + [1] @dequeue@2 + [4]                              
                                                       =  [dequeue(@dequeue@1, @dequeue@2)]                                  
                                                                                                                             
                                  [#natmult(#0(), @y)] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#0()]                                                             
                                                                                                                             
                                [#natmult(#s(@x), @y)] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#add(#pos(@y), #natmult(@x, @y))]                                 
                                                                                                                             
                                        [reverse(@xs)] =  [1] @xs + [0]                                                      
                                                       >= [1] @xs + [0]                                                      
                                                       =  [appendreverse(@xs, nil())]                                        
                                                                                                                             
                      [appendreverse#1(nil(), @sofar)] =  [1] @sofar + [0]                                                   
                                                       >= [1] @sofar + [0]                                                   
                                                       =  [@sofar]                                                           
                                                                                                                             
                [appendreverse#1(::(@a, @as), @sofar)] =  [1] @sofar + [1] @a + [1] @as + [4]                                
                                                       >= [1] @sofar + [1] @a + [1] @as + [4]                                
                                                       =  [appendreverse(@as, ::(@a, @sofar))]                               
                                                                                                                             
                      [computeLine#1(nil(), @acc, @m)] =  [3] @acc + [0]                                                     
                                                       >= [1] @acc + [0]                                                     
                                                       =  [@acc]                                                             
                                                                                                                             
                [computeLine#1(::(@x, @xs), @acc, @m)] =  [3] @acc + [0]                                                     
                                                       >= [0]                                                                
                                                       =  [computeLine#2(@m, @acc, @x, @xs)]                                 
                                                                                                                             
                   [appendreverse(@toreverse, @sofar)] =  [1] @toreverse + [1] @sofar + [0]                                  
                                                       >= [1] @toreverse + [1] @sofar + [0]                                  
                                                       =  [appendreverse#1(@toreverse, @sofar)]                              
                                                                                                                             
                            [matrixMult#1(nil(), @m2)] =  [1]                                                                
                                                       >  [0]                                                                
                                                       =  [nil()]                                                            
                                                                                                                             
                      [matrixMult#1(::(@l, @ls), @m2)] =  [1]                                                                
                                                       ?  [9]                                                                
                                                       =  [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))]            
                                                                                                                             
                              [lineMult(@n, @l1, @l2)] =  [2]                                                                
                                                       >  [0]                                                                
                                                       =  [lineMult#1(@l1, @l2, @n)]                                         
                                                                                                                             
                      [lineMult#2(nil(), @n, @x, @xs)] =  [2] @xs + [0]                                                      
                                                       ?  [8]                                                                
                                                       =  [::(*(@x, @n), lineMult(@n, @xs, nil()))]                          
                                                                                                                             
                [lineMult#2(::(@y, @ys), @n, @x, @xs)] =  [2] @xs + [0]                                                      
                                                       ?  [12]                                                               
                                                       =  [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))]                     
                                                                                                                             
                            [#add(#pos(#s(#0())), @y)] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#succ(@y)]                                                        
                                                                                                                             
                          [#add(#pos(#s(#s(@x))), @y)] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#succ(#add(#pos(#s(@x)), @y))]                                    
                                                                                                                             
                                      [#add(#0(), @y)] =  [0]                                                                
                                                       ?  [1] @y + [0]                                                       
                                                       =  [@y]                                                               
                                                                                                                             
                            [#add(#neg(#s(#0())), @y)] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#pred(@y)]                                                        
                                                                                                                             
                          [#add(#neg(#s(#s(@x))), @y)] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#pred(#add(#pos(#s(@x)), @y))]                                    
                                                                                                                             
                                [dequeue(@outq, @inq)] =  [1] @outq + [1] @inq + [4]                                         
                                                       >  [1] @outq + [1] @inq + [3]                                         
                                                       =  [dequeue#1(@outq, @inq)]                                           
                                                                                                                             
                        [computeLine(@line, @m, @acc)] =  [4]                                                                
                                                       ?  [3] @acc + [0]                                                     
                                                       =  [computeLine#1(@line, @acc, @m)]                                   
                                                                                                                             
                              [dequeue#1(nil(), @inq)] =  [1] @inq + [3]                                                     
                                                       >= [1] @inq + [3]                                                     
                                                       =  [dequeue#2(reverse(@inq))]                                         
                                                                                                                             
                        [dequeue#1(::(@t, @ts), @inq)] =  [1] @t + [1] @inq + [1] @ts + [7]                                  
                                                       >  [1] @t + [1] @inq + [1] @ts + [6]                                  
                                                       =  [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))]                       
                                                                                                                             
                           [#mult(#pos(@x), #pos(@y))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#pos(#natmult(@x, @y))]                                           
                                                                                                                             
                               [#mult(#pos(@x), #0())] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#0()]                                                             
                                                                                                                             
                           [#mult(#pos(@x), #neg(@y))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#neg(#natmult(@x, @y))]                                           
                                                                                                                             
                               [#mult(#0(), #pos(@y))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#0()]                                                             
                                                                                                                             
                                   [#mult(#0(), #0())] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#0()]                                                             
                                                                                                                             
                               [#mult(#0(), #neg(@y))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#0()]                                                             
                                                                                                                             
                           [#mult(#neg(@x), #pos(@y))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#neg(#natmult(@x, @y))]                                           
                                                                                                                             
                               [#mult(#neg(@x), #0())] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#0()]                                                             
                                                                                                                             
                           [#mult(#neg(@x), #neg(@y))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#pos(#natmult(@x, @y))]                                           
                                                                                                                             
                                           [+(@x, @y)] =  [3] @x + [0]                                                       
                                                       >= [0]                                                                
                                                       =  [#add(@x, @y)]                                                     
                                                                                                                             
                                 [#succ(#pos(#s(@x)))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#pos(#s(#s(@x)))]                                                 
                                                                                                                             
                                         [#succ(#0())] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#pos(#s(#0()))]                                                   
                                                                                                                             
                               [#succ(#neg(#s(#0())))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#0()]                                                             
                                                                                                                             
                             [#succ(#neg(#s(#s(@x))))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#neg(#s(@x))]                                                     
                                                                                                                             
                 [enqueue#1(tuple#2(@outq, @inq), @t)] =  [1] @t + [1] @outq + [1] @inq + [5]                                
                                                       >= [1] @t + [1] @outq + [1] @inq + [5]                                
                                                       =  [tuple#2(@outq, ::(@t, @inq))]                                     
                                                                                                                             
                                [matrixMult(@m1, @m2)] =  [1]                                                                
                                                       >= [1]                                                                
                                                       =  [matrixMult#1(@m1, @m2)]                                           
                                                                                                                             
                                           [*(@x, @y)] =  [2]                                                                
                                                       >  [0]                                                                
                                                       =  [#mult(@x, @y)]                                                    
                                                                                                                             
                                 [enqueue(@t, @queue)] =  [1] @t + [1] @queue + [4]                                          
                                                       >= [1] @t + [1] @queue + [4]                                          
                                                       =  [enqueue#1(@queue, @t)]                                            
                                                                                                                             
                                    [dequeue#2(nil())] =  [3]                                                                
                                                       >  [2]                                                                
                                                       =  [tuple#2(nil(), tuple#2(nil(), nil()))]                            
                                                                                                                             
                              [dequeue#2(::(@t, @ts))] =  [1] @t + [1] @ts + [7]                                             
                                                       >  [1] @t + [1] @ts + [6]                                             
                                                       =  [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))]                      
                                                                                                                             
                               [#pred(#pos(#s(#0())))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#0()]                                                             
                                                                                                                             
                             [#pred(#pos(#s(#s(@x))))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#pos(#s(@x))]                                                     
                                                                                                                             
                                         [#pred(#0())] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#neg(#s(#0()))]                                                   
                                                                                                                             
                                 [#pred(#neg(#s(@x)))] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [#neg(#s(#s(@x)))]                                                 
                                                                                                                             
                          [lineMult#1(nil(), @l2, @n)] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [nil()]                                                            
                                                                                                                             
                    [lineMult#1(::(@x, @xs), @l2, @n)] =  [0]                                                                
                                                       ?  [2] @xs + [0]                                                      
                                                       =  [lineMult#2(@l2, @n, @x, @xs)]                                     
                                                                                                                             
                 [computeLine#2(nil(), @acc, @x, @xs)] =  [0]                                                                
                                                       >= [0]                                                                
                                                       =  [nil()]                                                            
                                                                                                                             
           [computeLine#2(::(@l, @ls), @acc, @x, @xs)] =  [0]                                                                
                                                       ?  [4]                                                                
                                                       =  [computeLine(@xs, @ls, lineMult(@x, @l, @acc))]                    
                                                                                                                             
                     [bftMult'#5^#(@queue', @acc, @y)] =  [1] @queue' + [3]                                                  
                                                       >= [1] @queue' + [3]                                                  
                                                       =  [c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),                    
                                                               matrixMult^#(@acc, @y))]                                      
                                                                                                                             
                            [bftMult'^#(@queue, @acc)] =  [1] @queue + [3]                                                   
                                                       >= [1] @queue + [3]                                                   
                                                       =  [c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))]
                                                                                                                             
            [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] =  [1] @t + [1] @queue + [1] @_@3 + [5]                               
                                                       >  [1] @t + [1] @queue + [4]                                          
                                                       =  [c_11(bftMult'#4^#(@t, @acc, @queue))]                             
                                                                                                                             
                  [bftMult'#4^#(leaf(), @acc, @queue)] =  [1] @queue + [4]                                                   
                                                       >  [1] @queue + [3]                                                   
                                                       =  [c_12(bftMult'^#(@queue, @acc))]                                   
                                                                                                                             
      [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] =  [1] @y + [1] @queue + [1] @t1 + [1] @t2 + [11]                     
                                                       >= [1] @queue + [1] @t1 + [1] @t2 + [11]                              
                                                       =  [c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y))] 
                                                                                                                             
          [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] =  [1] @queue + [1] @elem + [1]                                       
                                                       >= [1] @queue + [1] @elem + [1]                                       
                                                       =  [c_22(bftMult'#3^#(@elem, @acc, @queue))]                          
                                                                                                                             
  
  We return to the main proof. Consider the set of all dependency
  pairs
  
  :
    { 1: bftMult'#5^#(@queue', @acc, @y) ->
         c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
             matrixMult^#(@acc, @y))
    , 2: bftMult'^#(@queue, @acc) ->
         c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
    , 3: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
         c_11(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'#1^#(tuple#2(@elem, @queue), @acc) ->
         c_22(bftMult'#3^#(@elem, @acc, @queue)) }
  
  Processor 'matrix interpretation of dimension 1' induces the
  complexity certificate YES(?,O(n^1)) on application of dependency
  pairs {3,4}. These cover all (indirect) predecessors of dependency
  pairs {1,2,3,4,5,6}, their number of application is equally
  bounded. The dependency pairs are shifted into the weak component.
  
  We are left with following problem, upon which TcT provides the
  certificate YES(O(1),O(1)).
  
  Weak DPs:
    { bftMult'#5^#(@queue', @acc, @y) ->
      c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
          matrixMult^#(@acc, @y))
    , bftMult'^#(@queue, @acc) ->
      c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
    , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
      c_11(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'#1^#(tuple#2(@elem, @queue), @acc) ->
      c_22(bftMult'#3^#(@elem, @acc, @queue)) }
  Weak Trs:
    { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
      dequeue(@dequeue@1, @dequeue@2)
    , #natmult(#0(), @y) -> #0()
    , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
    , reverse(@xs) -> appendreverse(@xs, nil())
    , appendreverse#1(nil(), @sofar) -> @sofar
    , appendreverse#1(::(@a, @as), @sofar) ->
      appendreverse(@as, ::(@a, @sofar))
    , computeLine#1(nil(), @acc, @m) -> @acc
    , computeLine#1(::(@x, @xs), @acc, @m) ->
      computeLine#2(@m, @acc, @x, @xs)
    , appendreverse(@toreverse, @sofar) ->
      appendreverse#1(@toreverse, @sofar)
    , matrixMult#1(nil(), @m2) -> nil()
    , matrixMult#1(::(@l, @ls), @m2) ->
      ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
    , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
    , lineMult#2(nil(), @n, @x, @xs) ->
      ::(*(@x, @n), lineMult(@n, @xs, nil()))
    , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
      ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
    , #add(#pos(#s(#0())), @y) -> #succ(@y)
    , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
    , #add(#0(), @y) -> @y
    , #add(#neg(#s(#0())), @y) -> #pred(@y)
    , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
    , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
    , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
    , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
    , dequeue#1(::(@t, @ts), @inq) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
    , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
    , #mult(#pos(@x), #0()) -> #0()
    , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#0(), #pos(@y)) -> #0()
    , #mult(#0(), #0()) -> #0()
    , #mult(#0(), #neg(@y)) -> #0()
    , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#neg(@x), #0()) -> #0()
    , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
    , +(@x, @y) -> #add(@x, @y)
    , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
    , #succ(#0()) -> #pos(#s(#0()))
    , #succ(#neg(#s(#0()))) -> #0()
    , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
    , enqueue#1(tuple#2(@outq, @inq), @t) ->
      tuple#2(@outq, ::(@t, @inq))
    , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
    , *(@x, @y) -> #mult(@x, @y)
    , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
    , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
    , dequeue#2(::(@t, @ts)) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
    , #pred(#pos(#s(#0()))) -> #0()
    , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
    , #pred(#0()) -> #neg(#s(#0()))
    , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
    , lineMult#1(nil(), @l2, @n) -> nil()
    , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
    , computeLine#2(nil(), @acc, @x, @xs) -> nil()
    , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
      computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
  Obligation:
    innermost runtime complexity
  Answer:
    YES(O(1),O(1))
  
  The following weak DPs constitute a sub-graph of the DG that is
  closed under successors. The DPs are removed.
  
  { bftMult'#5^#(@queue', @acc, @y) ->
    c_5(bftMult'^#(@queue', matrixMult(@acc, @y)),
        matrixMult^#(@acc, @y))
  , bftMult'^#(@queue, @acc) ->
    c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))
  , bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
    c_11(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'#1^#(tuple#2(@elem, @queue), @acc) ->
    c_22(bftMult'#3^#(@elem, @acc, @queue)) }
  
  We are left with following problem, upon which TcT provides the
  certificate YES(O(1),O(1)).
  
  Weak Trs:
    { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
      dequeue(@dequeue@1, @dequeue@2)
    , #natmult(#0(), @y) -> #0()
    , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
    , reverse(@xs) -> appendreverse(@xs, nil())
    , appendreverse#1(nil(), @sofar) -> @sofar
    , appendreverse#1(::(@a, @as), @sofar) ->
      appendreverse(@as, ::(@a, @sofar))
    , computeLine#1(nil(), @acc, @m) -> @acc
    , computeLine#1(::(@x, @xs), @acc, @m) ->
      computeLine#2(@m, @acc, @x, @xs)
    , appendreverse(@toreverse, @sofar) ->
      appendreverse#1(@toreverse, @sofar)
    , matrixMult#1(nil(), @m2) -> nil()
    , matrixMult#1(::(@l, @ls), @m2) ->
      ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
    , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
    , lineMult#2(nil(), @n, @x, @xs) ->
      ::(*(@x, @n), lineMult(@n, @xs, nil()))
    , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
      ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
    , #add(#pos(#s(#0())), @y) -> #succ(@y)
    , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
    , #add(#0(), @y) -> @y
    , #add(#neg(#s(#0())), @y) -> #pred(@y)
    , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
    , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
    , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
    , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
    , dequeue#1(::(@t, @ts), @inq) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
    , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
    , #mult(#pos(@x), #0()) -> #0()
    , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#0(), #pos(@y)) -> #0()
    , #mult(#0(), #0()) -> #0()
    , #mult(#0(), #neg(@y)) -> #0()
    , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#neg(@x), #0()) -> #0()
    , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
    , +(@x, @y) -> #add(@x, @y)
    , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
    , #succ(#0()) -> #pos(#s(#0()))
    , #succ(#neg(#s(#0()))) -> #0()
    , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
    , enqueue#1(tuple#2(@outq, @inq), @t) ->
      tuple#2(@outq, ::(@t, @inq))
    , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
    , *(@x, @y) -> #mult(@x, @y)
    , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
    , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
    , dequeue#2(::(@t, @ts)) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
    , #pred(#pos(#s(#0()))) -> #0()
    , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
    , #pred(#0()) -> #neg(#s(#0()))
    , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
    , lineMult#1(nil(), @l2, @n) -> nil()
    , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
    , computeLine#2(nil(), @acc, @x, @xs) -> nil()
    , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
      computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
  Obligation:
    innermost runtime complexity
  Answer:
    YES(O(1),O(1))
  
  No rule is usable, rules are removed from the input problem.
  
  We are left with following problem, upon which TcT provides the
  certificate YES(O(1),O(1)).
  
  Rules: Empty
  Obligation:
    innermost runtime complexity
  Answer:
    YES(O(1),O(1))
  
  Empty rules are trivially bounded

We return to the main proof.

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^2)).

Strict DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_4(appendreverse#1^#(@toreverse, @sofar))
  , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_8(appendreverse^#(@as, ::(@a, @sofar)))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys))
  , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) }
Weak DPs:
  { bftMult'#5^#(@queue', @acc, @y) ->
    bftMult'^#(@queue', matrixMult(@acc, @y))
  , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue)
  , bftMult'^#(@queue, @acc) ->
    bftMult'#1^#(bftMult'#2(@queue), @acc)
  , 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'#1^#(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3^#(@elem, @acc, @queue) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^2))

We use the processor 'matrix interpretation of dimension 1' to
orient following rules strictly.

DPs:
  { 3: reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
  , 6: appendreverse#1^#(::(@a, @as), @sofar) ->
       c_8(appendreverse^#(@as, ::(@a, @sofar)))
  , 17: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , 18: bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue)
  , 19: bftMult'^#(@queue, @acc) ->
        bftMult'#1^#(bftMult'#2(@queue), @acc) }
Trs:
  { computeLine#1(nil(), @acc, @m) -> @acc
  , matrixMult#1(nil(), @m2) -> nil()
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , +(@x, @y) -> #add(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil() }

Sub-proof:
----------
  The following argument positions are usable:
    Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_3) = {1},
    Uargs(c_4) = {1}, Uargs(c_7) = {1}, Uargs(c_8) = {1},
    Uargs(c_9) = {1}, Uargs(c_10) = {1, 2}, Uargs(c_14) = {1, 2},
    Uargs(c_15) = {1}, Uargs(c_17) = {1}, Uargs(c_18) = {1},
    Uargs(c_19) = {1}, Uargs(c_20) = {1}, Uargs(c_21) = {1}
  
  TcT has computed the following constructor-based matrix
  interpretation satisfying not(EDA).
  
                     [bftMult'#2](x1) = [1] x1 + [2]                  
                                                                      
                   [#natmult](x1, x2) = [0]                           
                                                                      
                        [reverse](x1) = [1] x1 + [0]                  
                                                                      
            [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
          [computeLine#1](x1, x2, x3) = [7] x2 + [1]                  
                                                                      
              [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
               [matrixMult#1](x1, x2) = [3]                           
                                                                      
                               [leaf] = [0]                           
                                                                      
               [lineMult](x1, x2, x3) = [4] x2 + [1] x3 + [0]         
                                                                      
         [lineMult#2](x1, x2, x3, x4) = [1] x1 + [4] x4 + [3]         
                                                                      
                           [#pos](x1) = [0]                           
                                                                      
                       [#add](x1, x2) = [1] x2 + [0]                  
                                                                      
                   [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [4]
                                                                      
                    [dequeue](x1, x2) = [1] x1 + [1] x2 + [4]         
                                                                      
                    [tuple#2](x1, x2) = [1] x1 + [1] x2 + [2]         
                                                                      
                                [nil] = [0]                           
                                                                      
            [computeLine](x1, x2, x3) = [1] x2 + [1] x3 + [6]         
                                                                      
                  [dequeue#1](x1, x2) = [1] x1 + [1] x2 + [4]         
                                                                      
                         [::](x1, x2) = [1] x1 + [1] x2 + [1]         
                                                                      
                      [#mult](x1, x2) = [0]                           
                                                                      
                          [+](x1, x2) = [1] x2 + [2]                  
                                                                      
                          [#succ](x1) = [0]                           
                                                                      
                                 [#0] = [0]                           
                                                                      
                  [enqueue#1](x1, x2) = [1] x1 + [1] x2 + [1]         
                                                                      
                           [#neg](x1) = [0]                           
                                                                      
                 [matrixMult](x1, x2) = [0]                           
                                                                      
                          [*](x1, x2) = [0]                           
                                                                      
                    [enqueue](x1, x2) = [1] x1 + [1] x2 + [2]         
                                                                      
                      [dequeue#2](x1) = [1] x1 + [4]                  
                                                                      
                          [#pred](x1) = [0]                           
                                                                      
             [lineMult#1](x1, x2, x3) = [4] x1 + [1] x2 + [0]         
                                                                      
                             [#s](x1) = [0]                           
                                                                      
      [computeLine#2](x1, x2, x3, x4) = [1] x2 + [7]                  
                                                                      
                   [bftMult'#2^#](x1) = [1] x1 + [4]                  
                                                                      
                  [dequeue^#](x1, x2) = [1] x2 + [6]                  
                                                                      
                      [reverse^#](x1) = [1] x1 + [6]                  
                                                                      
            [appendreverse^#](x1, x2) = [1] x1 + [0]                  
                                                                      
           [bftMult'#5^#](x1, x2, x3) = [2] x1 + [7]                  
                                                                      
                 [bftMult'^#](x1, x2) = [2] x1 + [7]                  
                                                                      
               [matrixMult^#](x1, x2) = [0]                           
                                                                      
          [appendreverse#1^#](x1, x2) = [1] x1 + [0]                  
                                                                      
        [computeLine#1^#](x1, x2, x3) = [0]                           
                                                                      
    [computeLine#2^#](x1, x2, x3, x4) = [0]                           
                                                                      
           [bftMult'#3^#](x1, x2, x3) = [2] x1 + [2] x3 + [5]         
                                                                      
           [bftMult'#4^#](x1, x2, x3) = [2] x1 + [2] x3 + [7]         
                                                                      
             [matrixMult#1^#](x1, x2) = [0]                           
                                                                      
          [computeLine^#](x1, x2, x3) = [0]                           
                                                                      
             [lineMult^#](x1, x2, x3) = [0]                           
                                                                      
           [lineMult#1^#](x1, x2, x3) = [0]                           
                                                                      
       [lineMult#2^#](x1, x2, x3, x4) = [0]                           
                                                                      
                [dequeue#1^#](x1, x2) = [1] x2 + [6]                  
                                                                      
               [bftMult'#1^#](x1, x2) = [2] x1 + [1]                  
                                                                      
                            [c_1](x1) = [1] x1 + [0]                  
                                                                      
                            [c_2](x1) = [1] x1 + [0]                  
                                                                      
                            [c_3](x1) = [1] x1 + [0]                  
                                                                      
                            [c_4](x1) = [1] x1 + [0]                  
                                                                      
                            [c_7](x1) = [2] x1 + [0]                  
                                                                      
                            [c_8](x1) = [1] x1 + [0]                  
                                                                      
                            [c_9](x1) = [1] x1 + [0]                  
                                                                      
                       [c_10](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
                       [c_14](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
                           [c_15](x1) = [1] x1 + [0]                  
                                                                      
                           [c_17](x1) = [1] x1 + [0]                  
                                                                      
                           [c_18](x1) = [1] x1 + [0]                  
                                                                      
                           [c_19](x1) = [1] x1 + [0]                  
                                                                      
                           [c_20](x1) = [1] x1 + [0]                  
                                                                      
                           [c_21](x1) = [1] x1 + [0]                  
  
  The order satisfies the following ordering constraints:
  
       [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] =  [1] @dequeue@1 + [1] @dequeue@2 + [4]                        
                                                     >= [1] @dequeue@1 + [1] @dequeue@2 + [4]                        
                                                     =  [dequeue(@dequeue@1, @dequeue@2)]                            
                                                                                                                     
                                [#natmult(#0(), @y)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#0()]                                                       
                                                                                                                     
                              [#natmult(#s(@x), @y)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#add(#pos(@y), #natmult(@x, @y))]                           
                                                                                                                     
                                      [reverse(@xs)] =  [1] @xs + [0]                                                
                                                     >= [1] @xs + [0]                                                
                                                     =  [appendreverse(@xs, nil())]                                  
                                                                                                                     
                    [appendreverse#1(nil(), @sofar)] =  [1] @sofar + [0]                                             
                                                     >= [1] @sofar + [0]                                             
                                                     =  [@sofar]                                                     
                                                                                                                     
              [appendreverse#1(::(@a, @as), @sofar)] =  [1] @sofar + [1] @a + [1] @as + [1]                          
                                                     >= [1] @sofar + [1] @a + [1] @as + [1]                          
                                                     =  [appendreverse(@as, ::(@a, @sofar))]                         
                                                                                                                     
                    [computeLine#1(nil(), @acc, @m)] =  [7] @acc + [1]                                               
                                                     >  [1] @acc + [0]                                               
                                                     =  [@acc]                                                       
                                                                                                                     
              [computeLine#1(::(@x, @xs), @acc, @m)] =  [7] @acc + [1]                                               
                                                     ?  [1] @acc + [7]                                               
                                                     =  [computeLine#2(@m, @acc, @x, @xs)]                           
                                                                                                                     
                 [appendreverse(@toreverse, @sofar)] =  [1] @toreverse + [1] @sofar + [0]                            
                                                     >= [1] @toreverse + [1] @sofar + [0]                            
                                                     =  [appendreverse#1(@toreverse, @sofar)]                        
                                                                                                                     
                          [matrixMult#1(nil(), @m2)] =  [3]                                                          
                                                     >  [0]                                                          
                                                     =  [nil()]                                                      
                                                                                                                     
                    [matrixMult#1(::(@l, @ls), @m2)] =  [3]                                                          
                                                     ?  [1] @m2 + [7]                                                
                                                     =  [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))]      
                                                                                                                     
                            [lineMult(@n, @l1, @l2)] =  [4] @l1 + [1] @l2 + [0]                                      
                                                     >= [4] @l1 + [1] @l2 + [0]                                      
                                                     =  [lineMult#1(@l1, @l2, @n)]                                   
                                                                                                                     
                    [lineMult#2(nil(), @n, @x, @xs)] =  [4] @xs + [3]                                                
                                                     >  [4] @xs + [1]                                                
                                                     =  [::(*(@x, @n), lineMult(@n, @xs, nil()))]                    
                                                                                                                     
              [lineMult#2(::(@y, @ys), @n, @x, @xs)] =  [1] @y + [4] @xs + [1] @ys + [4]                             
                                                     >  [1] @y + [4] @xs + [1] @ys + [3]                             
                                                     =  [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))]               
                                                                                                                     
                          [#add(#pos(#s(#0())), @y)] =  [1] @y + [0]                                                 
                                                     >= [0]                                                          
                                                     =  [#succ(@y)]                                                  
                                                                                                                     
                        [#add(#pos(#s(#s(@x))), @y)] =  [1] @y + [0]                                                 
                                                     >= [0]                                                          
                                                     =  [#succ(#add(#pos(#s(@x)), @y))]                              
                                                                                                                     
                                    [#add(#0(), @y)] =  [1] @y + [0]                                                 
                                                     >= [1] @y + [0]                                                 
                                                     =  [@y]                                                         
                                                                                                                     
                          [#add(#neg(#s(#0())), @y)] =  [1] @y + [0]                                                 
                                                     >= [0]                                                          
                                                     =  [#pred(@y)]                                                  
                                                                                                                     
                        [#add(#neg(#s(#s(@x))), @y)] =  [1] @y + [0]                                                 
                                                     >= [0]                                                          
                                                     =  [#pred(#add(#pos(#s(@x)), @y))]                              
                                                                                                                     
                              [dequeue(@outq, @inq)] =  [1] @outq + [1] @inq + [4]                                   
                                                     >= [1] @outq + [1] @inq + [4]                                   
                                                     =  [dequeue#1(@outq, @inq)]                                     
                                                                                                                     
                      [computeLine(@line, @m, @acc)] =  [1] @acc + [1] @m + [6]                                      
                                                     ?  [7] @acc + [1]                                               
                                                     =  [computeLine#1(@line, @acc, @m)]                             
                                                                                                                     
                            [dequeue#1(nil(), @inq)] =  [1] @inq + [4]                                               
                                                     >= [1] @inq + [4]                                               
                                                     =  [dequeue#2(reverse(@inq))]                                   
                                                                                                                     
                      [dequeue#1(::(@t, @ts), @inq)] =  [1] @t + [1] @inq + [1] @ts + [5]                            
                                                     >= [1] @t + [1] @inq + [1] @ts + [5]                            
                                                     =  [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))]                 
                                                                                                                     
                         [#mult(#pos(@x), #pos(@y))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#pos(#natmult(@x, @y))]                                     
                                                                                                                     
                             [#mult(#pos(@x), #0())] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#0()]                                                       
                                                                                                                     
                         [#mult(#pos(@x), #neg(@y))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#neg(#natmult(@x, @y))]                                     
                                                                                                                     
                             [#mult(#0(), #pos(@y))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#0()]                                                       
                                                                                                                     
                                 [#mult(#0(), #0())] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#0()]                                                       
                                                                                                                     
                             [#mult(#0(), #neg(@y))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#0()]                                                       
                                                                                                                     
                         [#mult(#neg(@x), #pos(@y))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#neg(#natmult(@x, @y))]                                     
                                                                                                                     
                             [#mult(#neg(@x), #0())] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#0()]                                                       
                                                                                                                     
                         [#mult(#neg(@x), #neg(@y))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#pos(#natmult(@x, @y))]                                     
                                                                                                                     
                                         [+(@x, @y)] =  [1] @y + [2]                                                 
                                                     >  [1] @y + [0]                                                 
                                                     =  [#add(@x, @y)]                                               
                                                                                                                     
                               [#succ(#pos(#s(@x)))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#pos(#s(#s(@x)))]                                           
                                                                                                                     
                                       [#succ(#0())] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#pos(#s(#0()))]                                             
                                                                                                                     
                             [#succ(#neg(#s(#0())))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#0()]                                                       
                                                                                                                     
                           [#succ(#neg(#s(#s(@x))))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#neg(#s(@x))]                                               
                                                                                                                     
               [enqueue#1(tuple#2(@outq, @inq), @t)] =  [1] @t + [1] @outq + [1] @inq + [3]                          
                                                     >= [1] @t + [1] @outq + [1] @inq + [3]                          
                                                     =  [tuple#2(@outq, ::(@t, @inq))]                               
                                                                                                                     
                              [matrixMult(@m1, @m2)] =  [0]                                                          
                                                     ?  [3]                                                          
                                                     =  [matrixMult#1(@m1, @m2)]                                     
                                                                                                                     
                                         [*(@x, @y)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#mult(@x, @y)]                                              
                                                                                                                     
                               [enqueue(@t, @queue)] =  [1] @t + [1] @queue + [2]                                    
                                                     >  [1] @t + [1] @queue + [1]                                    
                                                     =  [enqueue#1(@queue, @t)]                                      
                                                                                                                     
                                  [dequeue#2(nil())] =  [4]                                                          
                                                     >= [4]                                                          
                                                     =  [tuple#2(nil(), tuple#2(nil(), nil()))]                      
                                                                                                                     
                            [dequeue#2(::(@t, @ts))] =  [1] @t + [1] @ts + [5]                                       
                                                     >= [1] @t + [1] @ts + [5]                                       
                                                     =  [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))]                
                                                                                                                     
                             [#pred(#pos(#s(#0())))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#0()]                                                       
                                                                                                                     
                           [#pred(#pos(#s(#s(@x))))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#pos(#s(@x))]                                               
                                                                                                                     
                                       [#pred(#0())] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#neg(#s(#0()))]                                             
                                                                                                                     
                               [#pred(#neg(#s(@x)))] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [#neg(#s(#s(@x)))]                                           
                                                                                                                     
                        [lineMult#1(nil(), @l2, @n)] =  [1] @l2 + [0]                                                
                                                     >= [0]                                                          
                                                     =  [nil()]                                                      
                                                                                                                     
                  [lineMult#1(::(@x, @xs), @l2, @n)] =  [4] @x + [4] @xs + [1] @l2 + [4]                             
                                                     >  [4] @xs + [1] @l2 + [3]                                      
                                                     =  [lineMult#2(@l2, @n, @x, @xs)]                               
                                                                                                                     
               [computeLine#2(nil(), @acc, @x, @xs)] =  [1] @acc + [7]                                               
                                                     >  [0]                                                          
                                                     =  [nil()]                                                      
                                                                                                                     
         [computeLine#2(::(@l, @ls), @acc, @x, @xs)] =  [1] @acc + [7]                                               
                                                     ?  [1] @acc + [4] @l + [1] @ls + [6]                            
                                                     =  [computeLine(@xs, @ls, lineMult(@x, @l, @acc))]              
                                                                                                                     
     [bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2))] =  [1] @dequeue@1 + [1] @dequeue@2 + [6]                        
                                                     >= [1] @dequeue@2 + [6]                                         
                                                     =  [c_1(dequeue^#(@dequeue@1, @dequeue@2))]                     
                                                                                                                     
                            [dequeue^#(@outq, @inq)] =  [1] @inq + [6]                                               
                                                     >= [1] @inq + [6]                                               
                                                     =  [c_2(dequeue#1^#(@outq, @inq))]                              
                                                                                                                     
                                    [reverse^#(@xs)] =  [1] @xs + [6]                                                
                                                     >  [1] @xs + [0]                                                
                                                     =  [c_3(appendreverse^#(@xs, nil()))]                           
                                                                                                                     
               [appendreverse^#(@toreverse, @sofar)] =  [1] @toreverse + [0]                                         
                                                     >= [1] @toreverse + [0]                                         
                                                     =  [c_4(appendreverse#1^#(@toreverse, @sofar))]                 
                                                                                                                     
                   [bftMult'#5^#(@queue', @acc, @y)] =  [2] @queue' + [7]                                            
                                                     >= [2] @queue' + [7]                                            
                                                     =  [bftMult'^#(@queue', matrixMult(@acc, @y))]                  
                                                                                                                     
                   [bftMult'#5^#(@queue', @acc, @y)] =  [2] @queue' + [7]                                            
                                                     >  [0]                                                          
                                                     =  [matrixMult^#(@acc, @y)]                                     
                                                                                                                     
                          [bftMult'^#(@queue, @acc)] =  [2] @queue + [7]                                             
                                                     >  [1] @queue + [4]                                             
                                                     =  [bftMult'#2^#(@queue)]                                       
                                                                                                                     
                          [bftMult'^#(@queue, @acc)] =  [2] @queue + [7]                                             
                                                     >  [2] @queue + [5]                                             
                                                     =  [bftMult'#1^#(bftMult'#2(@queue), @acc)]                     
                                                                                                                     
                            [matrixMult^#(@m1, @m2)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_7(matrixMult#1^#(@m1, @m2))]                              
                                                                                                                     
            [appendreverse#1^#(::(@a, @as), @sofar)] =  [1] @a + [1] @as + [1]                                       
                                                     >  [1] @as + [0]                                                
                                                     =  [c_8(appendreverse^#(@as, ::(@a, @sofar)))]                  
                                                                                                                     
            [computeLine#1^#(::(@x, @xs), @acc, @m)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_9(computeLine#2^#(@m, @acc, @x, @xs))]                    
                                                                                                                     
       [computeLine#2^#(::(@l, @ls), @acc, @x, @xs)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),       
                                                              lineMult^#(@x, @l, @acc))]                             
                                                                                                                     
          [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] =  [2] @t + [2] @queue + [2] @_@3 + [7]                         
                                                     >= [2] @t + [2] @queue + [7]                                    
                                                     =  [bftMult'#4^#(@t, @acc, @queue)]                             
                                                                                                                     
                [bftMult'#4^#(leaf(), @acc, @queue)] =  [2] @queue + [7]                                             
                                                     >= [2] @queue + [7]                                             
                                                     =  [bftMult'^#(@queue, @acc)]                                   
                                                                                                                     
    [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] =  [2] @y + [2] @queue + [2] @t1 + [2] @t2 + [15]               
                                                     >= [2] @queue + [2] @t1 + [2] @t2 + [15]                        
                                                     =  [bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)] 
                                                                                                                     
                  [matrixMult#1^#(::(@l, @ls), @m2)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))]
                                                                                                                     
                    [computeLine^#(@line, @m, @acc)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_15(computeLine#1^#(@line, @acc, @m))]                     
                                                                                                                     
                          [lineMult^#(@n, @l1, @l2)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_17(lineMult#1^#(@l1, @l2, @n))]                           
                                                                                                                     
                [lineMult#1^#(::(@x, @xs), @l2, @n)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_18(lineMult#2^#(@l2, @n, @x, @xs))]                       
                                                                                                                     
                  [lineMult#2^#(nil(), @n, @x, @xs)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_19(lineMult^#(@n, @xs, nil()))]                           
                                                                                                                     
            [lineMult#2^#(::(@y, @ys), @n, @x, @xs)] =  [0]                                                          
                                                     >= [0]                                                          
                                                     =  [c_20(lineMult^#(@n, @xs, @ys))]                             
                                                                                                                     
                          [dequeue#1^#(nil(), @inq)] =  [1] @inq + [6]                                               
                                                     >= [1] @inq + [6]                                               
                                                     =  [c_21(reverse^#(@inq))]                                      
                                                                                                                     
        [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] =  [2] @queue + [2] @elem + [5]                                 
                                                     >= [2] @queue + [2] @elem + [5]                                 
                                                     =  [bftMult'#3^#(@elem, @acc, @queue)]                          
                                                                                                                     

We return to the main proof. Consider the set of all dependency
pairs

:
  { 1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
       c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , 2: dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
  , 3: reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
  , 4: appendreverse^#(@toreverse, @sofar) ->
       c_4(appendreverse#1^#(@toreverse, @sofar))
  , 5: matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , 6: appendreverse#1^#(::(@a, @as), @sofar) ->
       c_8(appendreverse^#(@as, ::(@a, @sofar)))
  , 7: computeLine#1^#(::(@x, @xs), @acc, @m) ->
       c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , 8: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
       c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
            lineMult^#(@x, @l, @acc))
  , 9: matrixMult#1^#(::(@l, @ls), @m2) ->
       c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , 10: computeLine^#(@line, @m, @acc) ->
        c_15(computeLine#1^#(@line, @acc, @m))
  , 11: lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , 12: lineMult#1^#(::(@x, @xs), @l2, @n) ->
        c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , 13: lineMult#2^#(nil(), @n, @x, @xs) ->
        c_19(lineMult^#(@n, @xs, nil()))
  , 14: lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
        c_20(lineMult^#(@n, @xs, @ys))
  , 15: dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq))
  , 16: bftMult'#5^#(@queue', @acc, @y) ->
        bftMult'^#(@queue', matrixMult(@acc, @y))
  , 17: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , 18: bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue)
  , 19: bftMult'^#(@queue, @acc) ->
        bftMult'#1^#(bftMult'#2(@queue), @acc)
  , 20: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
        bftMult'#4^#(@t, @acc, @queue)
  , 21: bftMult'#4^#(leaf(), @acc, @queue) ->
        bftMult'^#(@queue, @acc)
  , 22: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
        bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)
  , 23: bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
        bftMult'#3^#(@elem, @acc, @queue) }

Processor 'matrix interpretation of dimension 1' induces the
complexity certificate YES(?,O(n^1)) on application of dependency
pairs {3,6,17,18,19}. These cover all (indirect) predecessors of
dependency pairs {1,2,3,4,6,15,16,17,18,19,20,21,22,23}, their
number of application is equally bounded. The dependency pairs are
shifted into the weak component.

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^2)).

Strict DPs:
  { matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys)) }
Weak DPs:
  { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
    c_1(dequeue^#(@dequeue@1, @dequeue@2))
  , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
  , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
  , appendreverse^#(@toreverse, @sofar) ->
    c_4(appendreverse#1^#(@toreverse, @sofar))
  , bftMult'#5^#(@queue', @acc, @y) ->
    bftMult'^#(@queue', matrixMult(@acc, @y))
  , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue)
  , bftMult'^#(@queue, @acc) ->
    bftMult'#1^#(bftMult'#2(@queue), @acc)
  , appendreverse#1^#(::(@a, @as), @sofar) ->
    c_8(appendreverse^#(@as, ::(@a, @sofar)))
  , 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)
  , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3^#(@elem, @acc, @queue) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^2))

The following weak DPs constitute a sub-graph of the DG that is
closed under successors. The DPs are removed.

{ bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) ->
  c_1(dequeue^#(@dequeue@1, @dequeue@2))
, dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq))
, reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil()))
, appendreverse^#(@toreverse, @sofar) ->
  c_4(appendreverse#1^#(@toreverse, @sofar))
, bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue)
, appendreverse#1^#(::(@a, @as), @sofar) ->
  c_8(appendreverse^#(@as, ::(@a, @sofar)))
, dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) }

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^2)).

Strict DPs:
  { matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys)) }
Weak DPs:
  { bftMult'#5^#(@queue', @acc, @y) ->
    bftMult'^#(@queue', matrixMult(@acc, @y))
  , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , bftMult'^#(@queue, @acc) ->
    bftMult'#1^#(bftMult'#2(@queue), @acc)
  , 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'#1^#(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3^#(@elem, @acc, @queue) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^2))

We decompose the input problem according to the dependency graph
into the upper component

  { bftMult'#5^#(@queue', @acc, @y) ->
    bftMult'^#(@queue', matrixMult(@acc, @y))
  , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , bftMult'^#(@queue, @acc) ->
    bftMult'#1^#(bftMult'#2(@queue), @acc)
  , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , 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)
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3^#(@elem, @acc, @queue) }

and lower component

  { computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys)) }

Further, following extension rules are added to the lower
component.

{ bftMult'#5^#(@queue', @acc, @y) ->
  bftMult'^#(@queue', matrixMult(@acc, @y))
, bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
, bftMult'^#(@queue, @acc) ->
  bftMult'#1^#(bftMult'#2(@queue), @acc)
, matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2)
, 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)
, matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2)
, matrixMult#1^#(::(@l, @ls), @m2) -> computeLine^#(@l, @m2, nil())
, bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
  bftMult'#3^#(@elem, @acc, @queue) }

TcT solves the upper component with certificate YES(O(1),O(n^1)).

Sub-proof:
----------
  We are left with following problem, upon which TcT provides the
  certificate YES(O(1),O(n^1)).
  
  Strict DPs:
    { matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
    , matrixMult#1^#(::(@l, @ls), @m2) ->
      c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) }
  Weak DPs:
    { bftMult'#5^#(@queue', @acc, @y) ->
      bftMult'^#(@queue', matrixMult(@acc, @y))
    , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
    , bftMult'^#(@queue, @acc) ->
      bftMult'#1^#(bftMult'#2(@queue), @acc)
    , 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'#1^#(tuple#2(@elem, @queue), @acc) ->
      bftMult'#3^#(@elem, @acc, @queue) }
  Weak Trs:
    { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
      dequeue(@dequeue@1, @dequeue@2)
    , #natmult(#0(), @y) -> #0()
    , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
    , reverse(@xs) -> appendreverse(@xs, nil())
    , appendreverse#1(nil(), @sofar) -> @sofar
    , appendreverse#1(::(@a, @as), @sofar) ->
      appendreverse(@as, ::(@a, @sofar))
    , computeLine#1(nil(), @acc, @m) -> @acc
    , computeLine#1(::(@x, @xs), @acc, @m) ->
      computeLine#2(@m, @acc, @x, @xs)
    , appendreverse(@toreverse, @sofar) ->
      appendreverse#1(@toreverse, @sofar)
    , matrixMult#1(nil(), @m2) -> nil()
    , matrixMult#1(::(@l, @ls), @m2) ->
      ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
    , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
    , lineMult#2(nil(), @n, @x, @xs) ->
      ::(*(@x, @n), lineMult(@n, @xs, nil()))
    , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
      ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
    , #add(#pos(#s(#0())), @y) -> #succ(@y)
    , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
    , #add(#0(), @y) -> @y
    , #add(#neg(#s(#0())), @y) -> #pred(@y)
    , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
    , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
    , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
    , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
    , dequeue#1(::(@t, @ts), @inq) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
    , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
    , #mult(#pos(@x), #0()) -> #0()
    , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#0(), #pos(@y)) -> #0()
    , #mult(#0(), #0()) -> #0()
    , #mult(#0(), #neg(@y)) -> #0()
    , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#neg(@x), #0()) -> #0()
    , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
    , +(@x, @y) -> #add(@x, @y)
    , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
    , #succ(#0()) -> #pos(#s(#0()))
    , #succ(#neg(#s(#0()))) -> #0()
    , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
    , enqueue#1(tuple#2(@outq, @inq), @t) ->
      tuple#2(@outq, ::(@t, @inq))
    , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
    , *(@x, @y) -> #mult(@x, @y)
    , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
    , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
    , dequeue#2(::(@t, @ts)) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
    , #pred(#pos(#s(#0()))) -> #0()
    , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
    , #pred(#0()) -> #neg(#s(#0()))
    , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
    , lineMult#1(nil(), @l2, @n) -> nil()
    , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
    , computeLine#2(nil(), @acc, @x, @xs) -> nil()
    , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
      computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
  Obligation:
    innermost runtime complexity
  Answer:
    YES(O(1),O(n^1))
  
  We use the processor 'matrix interpretation of dimension 1' to
  orient following rules strictly.
  
  DPs:
    { 1: matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
    , 4: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) }
  Trs:
    { appendreverse#1(nil(), @sofar) -> @sofar
    , computeLine#1(nil(), @acc, @m) -> @acc
    , lineMult#2(nil(), @n, @x, @xs) ->
      ::(*(@x, @n), lineMult(@n, @xs, nil()))
    , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
      ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
    , +(@x, @y) -> #add(@x, @y)
    , enqueue#1(tuple#2(@outq, @inq), @t) ->
      tuple#2(@outq, ::(@t, @inq))
    , *(@x, @y) -> #mult(@x, @y)
    , lineMult#1(nil(), @l2, @n) -> nil()
    , computeLine#2(nil(), @acc, @x, @xs) -> nil()
    , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
      computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
  
  Sub-proof:
  ----------
    The following argument positions are usable:
      Uargs(c_7) = {1}, Uargs(c_14) = {2}
    
    TcT has computed the following constructor-based matrix
    interpretation satisfying not(EDA).
    
                     [bftMult'#2](x1) = [1]                           
                                                                      
                   [#natmult](x1, x2) = [0]                           
                                                                      
                        [reverse](x1) = [5]                           
                                                                      
            [appendreverse#1](x1, x2) = [7] x2 + [7]                  
                                                                      
          [computeLine#1](x1, x2, x3) = [1] x1 + [3] x2 + [3]         
                                                                      
              [appendreverse](x1, x2) = [7] x2 + [6]                  
                                                                      
               [matrixMult#1](x1, x2) = [1] x1 + [0]                  
                                                                      
                               [leaf] = [0]                           
                                                                      
               [lineMult](x1, x2, x3) = [5] x2 + [1] x3 + [1]         
                                                                      
         [lineMult#2](x1, x2, x3, x4) = [1] x1 + [5] x4 + [6]         
                                                                      
                           [#pos](x1) = [0]                           
                                                                      
                       [#add](x1, x2) = [1] x2 + [0]                  
                                                                      
                   [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [0]
                                                                      
                    [dequeue](x1, x2) = [1]                           
                                                                      
                    [tuple#2](x1, x2) = [1]                           
                                                                      
                                [nil] = [1]                           
                                                                      
            [computeLine](x1, x2, x3) = [1] x1 + [3]                  
                                                                      
                  [dequeue#1](x1, x2) = [1]                           
                                                                      
                         [::](x1, x2) = [1] x2 + [1]                  
                                                                      
                      [#mult](x1, x2) = [0]                           
                                                                      
                          [+](x1, x2) = [7] x2 + [7]                  
                                                                      
                          [#succ](x1) = [0]                           
                                                                      
                                 [#0] = [0]                           
                                                                      
                  [enqueue#1](x1, x2) = [4]                           
                                                                      
                           [#neg](x1) = [1] x1 + [0]                  
                                                                      
                 [matrixMult](x1, x2) = [1] x1 + [0]                  
                                                                      
                          [*](x1, x2) = [2]                           
                                                                      
                    [enqueue](x1, x2) = [3]                           
                                                                      
                      [dequeue#2](x1) = [1]                           
                                                                      
                          [#pred](x1) = [0]                           
                                                                      
             [lineMult#1](x1, x2, x3) = [5] x1 + [1] x2 + [1]         
                                                                      
                             [#s](x1) = [0]                           
                                                                      
      [computeLine#2](x1, x2, x3, x4) = [1] x4 + [7]                  
                                                                      
           [bftMult'#5^#](x1, x2, x3) = [2] x2 + [7]                  
                                                                      
                 [bftMult'^#](x1, x2) = [2] x2 + [7]                  
                                                                      
               [matrixMult^#](x1, x2) = [1] x1 + [1]                  
                                                                      
           [bftMult'#3^#](x1, x2, x3) = [2] x2 + [7]                  
                                                                      
           [bftMult'#4^#](x1, x2, x3) = [2] x2 + [7]                  
                                                                      
             [matrixMult#1^#](x1, x2) = [1] x1 + [0]                  
                                                                      
          [computeLine^#](x1, x2, x3) = [0]                           
                                                                      
               [bftMult'#1^#](x1, x2) = [2] x1 + [2] x2 + [5]         
                                                                      
                            [c_7](x1) = [1] x1 + [0]                  
                                                                      
                       [c_14](x1, x2) = [2] x1 + [1] x2 + [0]         
    
    The order satisfies the following ordering constraints:
    
         [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] =  [1]                                                          
                                                       >= [1]                                                          
                                                       =  [dequeue(@dequeue@1, @dequeue@2)]                            
                                                                                                                       
                                  [#natmult(#0(), @y)] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#0()]                                                       
                                                                                                                       
                                [#natmult(#s(@x), @y)] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#add(#pos(@y), #natmult(@x, @y))]                           
                                                                                                                       
                                        [reverse(@xs)] =  [5]                                                          
                                                       ?  [13]                                                         
                                                       =  [appendreverse(@xs, nil())]                                  
                                                                                                                       
                      [appendreverse#1(nil(), @sofar)] =  [7] @sofar + [7]                                             
                                                       >  [1] @sofar + [0]                                             
                                                       =  [@sofar]                                                     
                                                                                                                       
                [appendreverse#1(::(@a, @as), @sofar)] =  [7] @sofar + [7]                                             
                                                       ?  [7] @sofar + [13]                                            
                                                       =  [appendreverse(@as, ::(@a, @sofar))]                         
                                                                                                                       
                      [computeLine#1(nil(), @acc, @m)] =  [3] @acc + [4]                                               
                                                       >  [1] @acc + [0]                                               
                                                       =  [@acc]                                                       
                                                                                                                       
                [computeLine#1(::(@x, @xs), @acc, @m)] =  [3] @acc + [1] @xs + [4]                                     
                                                       ?  [1] @xs + [7]                                                
                                                       =  [computeLine#2(@m, @acc, @x, @xs)]                           
                                                                                                                       
                   [appendreverse(@toreverse, @sofar)] =  [7] @sofar + [6]                                             
                                                       ?  [7] @sofar + [7]                                             
                                                       =  [appendreverse#1(@toreverse, @sofar)]                        
                                                                                                                       
                            [matrixMult#1(nil(), @m2)] =  [1]                                                          
                                                       >= [1]                                                          
                                                       =  [nil()]                                                      
                                                                                                                       
                      [matrixMult#1(::(@l, @ls), @m2)] =  [1] @ls + [1]                                                
                                                       >= [1] @ls + [1]                                                
                                                       =  [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))]      
                                                                                                                       
                              [lineMult(@n, @l1, @l2)] =  [5] @l1 + [1] @l2 + [1]                                      
                                                       >= [5] @l1 + [1] @l2 + [1]                                      
                                                       =  [lineMult#1(@l1, @l2, @n)]                                   
                                                                                                                       
                      [lineMult#2(nil(), @n, @x, @xs)] =  [5] @xs + [7]                                                
                                                       >  [5] @xs + [3]                                                
                                                       =  [::(*(@x, @n), lineMult(@n, @xs, nil()))]                    
                                                                                                                       
                [lineMult#2(::(@y, @ys), @n, @x, @xs)] =  [5] @xs + [1] @ys + [7]                                      
                                                       >  [5] @xs + [1] @ys + [2]                                      
                                                       =  [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))]               
                                                                                                                       
                            [#add(#pos(#s(#0())), @y)] =  [1] @y + [0]                                                 
                                                       >= [0]                                                          
                                                       =  [#succ(@y)]                                                  
                                                                                                                       
                          [#add(#pos(#s(#s(@x))), @y)] =  [1] @y + [0]                                                 
                                                       >= [0]                                                          
                                                       =  [#succ(#add(#pos(#s(@x)), @y))]                              
                                                                                                                       
                                      [#add(#0(), @y)] =  [1] @y + [0]                                                 
                                                       >= [1] @y + [0]                                                 
                                                       =  [@y]                                                         
                                                                                                                       
                            [#add(#neg(#s(#0())), @y)] =  [1] @y + [0]                                                 
                                                       >= [0]                                                          
                                                       =  [#pred(@y)]                                                  
                                                                                                                       
                          [#add(#neg(#s(#s(@x))), @y)] =  [1] @y + [0]                                                 
                                                       >= [0]                                                          
                                                       =  [#pred(#add(#pos(#s(@x)), @y))]                              
                                                                                                                       
                                [dequeue(@outq, @inq)] =  [1]                                                          
                                                       >= [1]                                                          
                                                       =  [dequeue#1(@outq, @inq)]                                     
                                                                                                                       
                        [computeLine(@line, @m, @acc)] =  [1] @line + [3]                                              
                                                       ?  [3] @acc + [1] @line + [3]                                   
                                                       =  [computeLine#1(@line, @acc, @m)]                             
                                                                                                                       
                              [dequeue#1(nil(), @inq)] =  [1]                                                          
                                                       >= [1]                                                          
                                                       =  [dequeue#2(reverse(@inq))]                                   
                                                                                                                       
                        [dequeue#1(::(@t, @ts), @inq)] =  [1]                                                          
                                                       >= [1]                                                          
                                                       =  [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))]                 
                                                                                                                       
                           [#mult(#pos(@x), #pos(@y))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#pos(#natmult(@x, @y))]                                     
                                                                                                                       
                               [#mult(#pos(@x), #0())] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#0()]                                                       
                                                                                                                       
                           [#mult(#pos(@x), #neg(@y))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#neg(#natmult(@x, @y))]                                     
                                                                                                                       
                               [#mult(#0(), #pos(@y))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#0()]                                                       
                                                                                                                       
                                   [#mult(#0(), #0())] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#0()]                                                       
                                                                                                                       
                               [#mult(#0(), #neg(@y))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#0()]                                                       
                                                                                                                       
                           [#mult(#neg(@x), #pos(@y))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#neg(#natmult(@x, @y))]                                     
                                                                                                                       
                               [#mult(#neg(@x), #0())] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#0()]                                                       
                                                                                                                       
                           [#mult(#neg(@x), #neg(@y))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#pos(#natmult(@x, @y))]                                     
                                                                                                                       
                                           [+(@x, @y)] =  [7] @y + [7]                                                 
                                                       >  [1] @y + [0]                                                 
                                                       =  [#add(@x, @y)]                                               
                                                                                                                       
                                 [#succ(#pos(#s(@x)))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#pos(#s(#s(@x)))]                                           
                                                                                                                       
                                         [#succ(#0())] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#pos(#s(#0()))]                                             
                                                                                                                       
                               [#succ(#neg(#s(#0())))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#0()]                                                       
                                                                                                                       
                             [#succ(#neg(#s(#s(@x))))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#neg(#s(@x))]                                               
                                                                                                                       
                 [enqueue#1(tuple#2(@outq, @inq), @t)] =  [4]                                                          
                                                       >  [1]                                                          
                                                       =  [tuple#2(@outq, ::(@t, @inq))]                               
                                                                                                                       
                                [matrixMult(@m1, @m2)] =  [1] @m1 + [0]                                                
                                                       >= [1] @m1 + [0]                                                
                                                       =  [matrixMult#1(@m1, @m2)]                                     
                                                                                                                       
                                           [*(@x, @y)] =  [2]                                                          
                                                       >  [0]                                                          
                                                       =  [#mult(@x, @y)]                                              
                                                                                                                       
                                 [enqueue(@t, @queue)] =  [3]                                                          
                                                       ?  [4]                                                          
                                                       =  [enqueue#1(@queue, @t)]                                      
                                                                                                                       
                                    [dequeue#2(nil())] =  [1]                                                          
                                                       >= [1]                                                          
                                                       =  [tuple#2(nil(), tuple#2(nil(), nil()))]                      
                                                                                                                       
                              [dequeue#2(::(@t, @ts))] =  [1]                                                          
                                                       >= [1]                                                          
                                                       =  [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))]                
                                                                                                                       
                               [#pred(#pos(#s(#0())))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#0()]                                                       
                                                                                                                       
                             [#pred(#pos(#s(#s(@x))))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#pos(#s(@x))]                                               
                                                                                                                       
                                         [#pred(#0())] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#neg(#s(#0()))]                                             
                                                                                                                       
                                 [#pred(#neg(#s(@x)))] =  [0]                                                          
                                                       >= [0]                                                          
                                                       =  [#neg(#s(#s(@x)))]                                           
                                                                                                                       
                          [lineMult#1(nil(), @l2, @n)] =  [1] @l2 + [6]                                                
                                                       >  [1]                                                          
                                                       =  [nil()]                                                      
                                                                                                                       
                    [lineMult#1(::(@x, @xs), @l2, @n)] =  [5] @xs + [1] @l2 + [6]                                      
                                                       >= [5] @xs + [1] @l2 + [6]                                      
                                                       =  [lineMult#2(@l2, @n, @x, @xs)]                               
                                                                                                                       
                 [computeLine#2(nil(), @acc, @x, @xs)] =  [1] @xs + [7]                                                
                                                       >  [1]                                                          
                                                       =  [nil()]                                                      
                                                                                                                       
           [computeLine#2(::(@l, @ls), @acc, @x, @xs)] =  [1] @xs + [7]                                                
                                                       >  [1] @xs + [3]                                                
                                                       =  [computeLine(@xs, @ls, lineMult(@x, @l, @acc))]              
                                                                                                                       
                     [bftMult'#5^#(@queue', @acc, @y)] =  [2] @acc + [7]                                               
                                                       >= [2] @acc + [7]                                               
                                                       =  [bftMult'^#(@queue', matrixMult(@acc, @y))]                  
                                                                                                                       
                     [bftMult'#5^#(@queue', @acc, @y)] =  [2] @acc + [7]                                               
                                                       >  [1] @acc + [1]                                               
                                                       =  [matrixMult^#(@acc, @y)]                                     
                                                                                                                       
                            [bftMult'^#(@queue, @acc)] =  [2] @acc + [7]                                               
                                                       >= [2] @acc + [7]                                               
                                                       =  [bftMult'#1^#(bftMult'#2(@queue), @acc)]                     
                                                                                                                       
                              [matrixMult^#(@m1, @m2)] =  [1] @m1 + [1]                                                
                                                       >  [1] @m1 + [0]                                                
                                                       =  [c_7(matrixMult#1^#(@m1, @m2))]                              
                                                                                                                       
            [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] =  [2] @acc + [7]                                               
                                                       >= [2] @acc + [7]                                               
                                                       =  [bftMult'#4^#(@t, @acc, @queue)]                             
                                                                                                                       
                  [bftMult'#4^#(leaf(), @acc, @queue)] =  [2] @acc + [7]                                               
                                                       >= [2] @acc + [7]                                               
                                                       =  [bftMult'^#(@queue, @acc)]                                   
                                                                                                                       
      [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] =  [2] @acc + [7]                                               
                                                       >= [2] @acc + [7]                                               
                                                       =  [bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)] 
                                                                                                                       
                    [matrixMult#1^#(::(@l, @ls), @m2)] =  [1] @ls + [1]                                                
                                                       >= [1] @ls + [1]                                                
                                                       =  [c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))]
                                                                                                                       
          [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] =  [2] @acc + [7]                                               
                                                       >= [2] @acc + [7]                                               
                                                       =  [bftMult'#3^#(@elem, @acc, @queue)]                          
                                                                                                                       
  
  We return to the main proof. Consider the set of all dependency
  pairs
  
  :
    { 1: matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
    , 2: matrixMult#1^#(::(@l, @ls), @m2) ->
         c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
    , 3: bftMult'#5^#(@queue', @acc, @y) ->
         bftMult'^#(@queue', matrixMult(@acc, @y))
    , 4: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
    , 5: bftMult'^#(@queue, @acc) ->
         bftMult'#1^#(bftMult'#2(@queue), @acc)
    , 6: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
         bftMult'#4^#(@t, @acc, @queue)
    , 7: bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc)
    , 8: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
         bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)
    , 9: bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
         bftMult'#3^#(@elem, @acc, @queue) }
  
  Processor 'matrix interpretation of dimension 1' induces the
  complexity certificate YES(?,O(n^1)) on application of dependency
  pairs {1,4}. These cover all (indirect) predecessors of dependency
  pairs {1,2,4}, their number of application is equally bounded. The
  dependency pairs are shifted into the weak component.
  
  We are left with following problem, upon which TcT provides the
  certificate YES(O(1),O(1)).
  
  Weak DPs:
    { bftMult'#5^#(@queue', @acc, @y) ->
      bftMult'^#(@queue', matrixMult(@acc, @y))
    , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
    , bftMult'^#(@queue, @acc) ->
      bftMult'#1^#(bftMult'#2(@queue), @acc)
    , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
    , 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)
    , matrixMult#1^#(::(@l, @ls), @m2) ->
      c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
    , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
      bftMult'#3^#(@elem, @acc, @queue) }
  Weak Trs:
    { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
      dequeue(@dequeue@1, @dequeue@2)
    , #natmult(#0(), @y) -> #0()
    , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
    , reverse(@xs) -> appendreverse(@xs, nil())
    , appendreverse#1(nil(), @sofar) -> @sofar
    , appendreverse#1(::(@a, @as), @sofar) ->
      appendreverse(@as, ::(@a, @sofar))
    , computeLine#1(nil(), @acc, @m) -> @acc
    , computeLine#1(::(@x, @xs), @acc, @m) ->
      computeLine#2(@m, @acc, @x, @xs)
    , appendreverse(@toreverse, @sofar) ->
      appendreverse#1(@toreverse, @sofar)
    , matrixMult#1(nil(), @m2) -> nil()
    , matrixMult#1(::(@l, @ls), @m2) ->
      ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
    , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
    , lineMult#2(nil(), @n, @x, @xs) ->
      ::(*(@x, @n), lineMult(@n, @xs, nil()))
    , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
      ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
    , #add(#pos(#s(#0())), @y) -> #succ(@y)
    , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
    , #add(#0(), @y) -> @y
    , #add(#neg(#s(#0())), @y) -> #pred(@y)
    , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
    , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
    , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
    , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
    , dequeue#1(::(@t, @ts), @inq) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
    , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
    , #mult(#pos(@x), #0()) -> #0()
    , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#0(), #pos(@y)) -> #0()
    , #mult(#0(), #0()) -> #0()
    , #mult(#0(), #neg(@y)) -> #0()
    , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#neg(@x), #0()) -> #0()
    , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
    , +(@x, @y) -> #add(@x, @y)
    , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
    , #succ(#0()) -> #pos(#s(#0()))
    , #succ(#neg(#s(#0()))) -> #0()
    , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
    , enqueue#1(tuple#2(@outq, @inq), @t) ->
      tuple#2(@outq, ::(@t, @inq))
    , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
    , *(@x, @y) -> #mult(@x, @y)
    , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
    , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
    , dequeue#2(::(@t, @ts)) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
    , #pred(#pos(#s(#0()))) -> #0()
    , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
    , #pred(#0()) -> #neg(#s(#0()))
    , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
    , lineMult#1(nil(), @l2, @n) -> nil()
    , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
    , computeLine#2(nil(), @acc, @x, @xs) -> nil()
    , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
      computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
  Obligation:
    innermost runtime complexity
  Answer:
    YES(O(1),O(1))
  
  The following weak DPs constitute a sub-graph of the DG that is
  closed under successors. The DPs are removed.
  
  { bftMult'#5^#(@queue', @acc, @y) ->
    bftMult'^#(@queue', matrixMult(@acc, @y))
  , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , bftMult'^#(@queue, @acc) ->
    bftMult'#1^#(bftMult'#2(@queue), @acc)
  , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2))
  , 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)
  , matrixMult#1^#(::(@l, @ls), @m2) ->
    c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3^#(@elem, @acc, @queue) }
  
  We are left with following problem, upon which TcT provides the
  certificate YES(O(1),O(1)).
  
  Weak Trs:
    { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
      dequeue(@dequeue@1, @dequeue@2)
    , #natmult(#0(), @y) -> #0()
    , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
    , reverse(@xs) -> appendreverse(@xs, nil())
    , appendreverse#1(nil(), @sofar) -> @sofar
    , appendreverse#1(::(@a, @as), @sofar) ->
      appendreverse(@as, ::(@a, @sofar))
    , computeLine#1(nil(), @acc, @m) -> @acc
    , computeLine#1(::(@x, @xs), @acc, @m) ->
      computeLine#2(@m, @acc, @x, @xs)
    , appendreverse(@toreverse, @sofar) ->
      appendreverse#1(@toreverse, @sofar)
    , matrixMult#1(nil(), @m2) -> nil()
    , matrixMult#1(::(@l, @ls), @m2) ->
      ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
    , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
    , lineMult#2(nil(), @n, @x, @xs) ->
      ::(*(@x, @n), lineMult(@n, @xs, nil()))
    , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
      ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
    , #add(#pos(#s(#0())), @y) -> #succ(@y)
    , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
    , #add(#0(), @y) -> @y
    , #add(#neg(#s(#0())), @y) -> #pred(@y)
    , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
    , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
    , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
    , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
    , dequeue#1(::(@t, @ts), @inq) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
    , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
    , #mult(#pos(@x), #0()) -> #0()
    , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#0(), #pos(@y)) -> #0()
    , #mult(#0(), #0()) -> #0()
    , #mult(#0(), #neg(@y)) -> #0()
    , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
    , #mult(#neg(@x), #0()) -> #0()
    , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
    , +(@x, @y) -> #add(@x, @y)
    , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
    , #succ(#0()) -> #pos(#s(#0()))
    , #succ(#neg(#s(#0()))) -> #0()
    , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
    , enqueue#1(tuple#2(@outq, @inq), @t) ->
      tuple#2(@outq, ::(@t, @inq))
    , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
    , *(@x, @y) -> #mult(@x, @y)
    , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
    , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
    , dequeue#2(::(@t, @ts)) ->
      tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
    , #pred(#pos(#s(#0()))) -> #0()
    , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
    , #pred(#0()) -> #neg(#s(#0()))
    , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
    , lineMult#1(nil(), @l2, @n) -> nil()
    , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
    , computeLine#2(nil(), @acc, @x, @xs) -> nil()
    , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
      computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
  Obligation:
    innermost runtime complexity
  Answer:
    YES(O(1),O(1))
  
  No rule is usable, rules are removed from the input problem.
  
  We are left with following problem, upon which TcT provides the
  certificate YES(O(1),O(1)).
  
  Rules: Empty
  Obligation:
    innermost runtime complexity
  Answer:
    YES(O(1),O(1))
  
  Empty rules are trivially bounded

We return to the main proof.

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(n^1)).

Strict DPs:
  { computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys)) }
Weak DPs:
  { bftMult'#5^#(@queue', @acc, @y) ->
    bftMult'^#(@queue', matrixMult(@acc, @y))
  , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , bftMult'^#(@queue, @acc) ->
    bftMult'#1^#(bftMult'#2(@queue), @acc)
  , matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2)
  , 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)
  , matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2)
  , matrixMult#1^#(::(@l, @ls), @m2) -> computeLine^#(@l, @m2, nil())
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3^#(@elem, @acc, @queue) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(n^1))

We use the processor 'matrix interpretation of dimension 1' to
orient following rules strictly.

DPs:
  { 1: computeLine#1^#(::(@x, @xs), @acc, @m) ->
       c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , 5: lineMult#1^#(::(@x, @xs), @l2, @n) ->
       c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , 9: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , 10: bftMult'^#(@queue, @acc) ->
        bftMult'#1^#(bftMult'#2(@queue), @acc)
  , 12: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
        bftMult'#4^#(@t, @acc, @queue)
  , 13: bftMult'#4^#(leaf(), @acc, @queue) ->
        bftMult'^#(@queue, @acc)
  , 14: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
        bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)
  , 16: matrixMult#1^#(::(@l, @ls), @m2) ->
        computeLine^#(@l, @m2, nil()) }
Trs:
  { lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }

Sub-proof:
----------
  The following argument positions are usable:
    Uargs(c_9) = {1}, Uargs(c_10) = {1, 2}, Uargs(c_15) = {1},
    Uargs(c_17) = {1}, Uargs(c_18) = {1}, Uargs(c_19) = {1},
    Uargs(c_20) = {1}
  
  TcT has computed the following constructor-based matrix
  interpretation satisfying not(EDA).
  
                     [bftMult'#2](x1) = [1] x1 + [3]                  
                                                                      
                   [#natmult](x1, x2) = [0]                           
                                                                      
                        [reverse](x1) = [1] x1 + [0]                  
                                                                      
            [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
          [computeLine#1](x1, x2, x3) = [7] x2 + [0]                  
                                                                      
              [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
               [matrixMult#1](x1, x2) = [1] x1 + [2] x2 + [0]         
                                                                      
                               [leaf] = [4]                           
                                                                      
               [lineMult](x1, x2, x3) = [1] x3 + [0]                  
                                                                      
         [lineMult#2](x1, x2, x3, x4) = [1] x1 + [1]                  
                                                                      
                           [#pos](x1) = [1] x1 + [1]                  
                                                                      
                       [#add](x1, x2) = [2] x1 + [1] x2 + [6]         
                                                                      
                   [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [6]
                                                                      
                    [dequeue](x1, x2) = [1] x1 + [1] x2 + [3]         
                                                                      
                    [tuple#2](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
                                [nil] = [0]                           
                                                                      
            [computeLine](x1, x2, x3) = [0]                           
                                                                      
                  [dequeue#1](x1, x2) = [1] x1 + [1] x2 + [3]         
                                                                      
                         [::](x1, x2) = [1] x1 + [1] x2 + [1]         
                                                                      
                      [#mult](x1, x2) = [1] x1 + [1]                  
                                                                      
                          [+](x1, x2) = [0]                           
                                                                      
                          [#succ](x1) = [2]                           
                                                                      
                                 [#0] = [0]                           
                                                                      
                  [enqueue#1](x1, x2) = [1] x1 + [1] x2 + [1]         
                                                                      
                           [#neg](x1) = [1]                           
                                                                      
                 [matrixMult](x1, x2) = [1] x1 + [2] x2 + [0]         
                                                                      
                          [*](x1, x2) = [7]                           
                                                                      
                    [enqueue](x1, x2) = [1] x1 + [1] x2 + [1]         
                                                                      
                      [dequeue#2](x1) = [1] x1 + [3]                  
                                                                      
                          [#pred](x1) = [4]                           
                                                                      
             [lineMult#1](x1, x2, x3) = [1] x2 + [0]                  
                                                                      
                             [#s](x1) = [0]                           
                                                                      
      [computeLine#2](x1, x2, x3, x4) = [4]                           
                                                                      
           [bftMult'#5^#](x1, x2, x3) = [2] x1 + [2] x3 + [7]         
                                                                      
                 [bftMult'^#](x1, x2) = [2] x1 + [7]                  
                                                                      
               [matrixMult^#](x1, x2) = [2] x2 + [6]                  
                                                                      
        [computeLine#1^#](x1, x2, x3) = [1] x3 + [3]                  
                                                                      
    [computeLine#2^#](x1, x2, x3, x4) = [1] x1 + [2]                  
                                                                      
           [bftMult'#3^#](x1, x2, x3) = [2] x1 + [2] x3 + [0]         
                                                                      
           [bftMult'#4^#](x1, x2, x3) = [2] x1 + [2] x3 + [1]         
                                                                      
             [matrixMult#1^#](x1, x2) = [2] x2 + [6]                  
                                                                      
          [computeLine^#](x1, x2, x3) = [1] x2 + [3]                  
                                                                      
             [lineMult^#](x1, x2, x3) = [1] x2 + [0]                  
                                                                      
           [lineMult#1^#](x1, x2, x3) = [1] x1 + [0]                  
                                                                      
       [lineMult#2^#](x1, x2, x3, x4) = [1] x4 + [0]                  
                                                                      
               [bftMult'#1^#](x1, x2) = [2] x1 + [0]                  
                                                                      
                            [c_9](x1) = [1] x1 + [0]                  
                                                                      
                       [c_10](x1, x2) = [1] x1 + [1] x2 + [0]         
                                                                      
                           [c_15](x1) = [1] x1 + [0]                  
                                                                      
                           [c_17](x1) = [1] x1 + [0]                  
                                                                      
                           [c_18](x1) = [1] x1 + [0]                  
                                                                      
                           [c_19](x1) = [1] x1 + [0]                  
                                                                      
                           [c_20](x1) = [1] x1 + [0]                  
  
  The order satisfies the following ordering constraints:
  
       [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] =  [1] @dequeue@1 + [1] @dequeue@2 + [3]                       
                                                     >= [1] @dequeue@1 + [1] @dequeue@2 + [3]                       
                                                     =  [dequeue(@dequeue@1, @dequeue@2)]                           
                                                                                                                    
                                [#natmult(#0(), @y)] =  [0]                                                         
                                                     >= [0]                                                         
                                                     =  [#0()]                                                      
                                                                                                                    
                              [#natmult(#s(@x), @y)] =  [0]                                                         
                                                     ?  [2] @y + [8]                                                
                                                     =  [#add(#pos(@y), #natmult(@x, @y))]                          
                                                                                                                    
                                      [reverse(@xs)] =  [1] @xs + [0]                                               
                                                     >= [1] @xs + [0]                                               
                                                     =  [appendreverse(@xs, nil())]                                 
                                                                                                                    
                    [appendreverse#1(nil(), @sofar)] =  [1] @sofar + [0]                                            
                                                     >= [1] @sofar + [0]                                            
                                                     =  [@sofar]                                                    
                                                                                                                    
              [appendreverse#1(::(@a, @as), @sofar)] =  [1] @sofar + [1] @a + [1] @as + [1]                         
                                                     >= [1] @sofar + [1] @a + [1] @as + [1]                         
                                                     =  [appendreverse(@as, ::(@a, @sofar))]                        
                                                                                                                    
                    [computeLine#1(nil(), @acc, @m)] =  [7] @acc + [0]                                              
                                                     >= [1] @acc + [0]                                              
                                                     =  [@acc]                                                      
                                                                                                                    
              [computeLine#1(::(@x, @xs), @acc, @m)] =  [7] @acc + [0]                                              
                                                     ?  [4]                                                         
                                                     =  [computeLine#2(@m, @acc, @x, @xs)]                          
                                                                                                                    
                 [appendreverse(@toreverse, @sofar)] =  [1] @toreverse + [1] @sofar + [0]                           
                                                     >= [1] @toreverse + [1] @sofar + [0]                           
                                                     =  [appendreverse#1(@toreverse, @sofar)]                       
                                                                                                                    
                          [matrixMult#1(nil(), @m2)] =  [2] @m2 + [0]                                               
                                                     >= [0]                                                         
                                                     =  [nil()]                                                     
                                                                                                                    
                    [matrixMult#1(::(@l, @ls), @m2)] =  [1] @l + [1] @ls + [2] @m2 + [1]                            
                                                     >= [1] @ls + [2] @m2 + [1]                                     
                                                     =  [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))]     
                                                                                                                    
                            [lineMult(@n, @l1, @l2)] =  [1] @l2 + [0]                                               
                                                     >= [1] @l2 + [0]                                               
                                                     =  [lineMult#1(@l1, @l2, @n)]                                  
                                                                                                                    
                    [lineMult#2(nil(), @n, @x, @xs)] =  [1]                                                         
                                                     ?  [8]                                                         
                                                     =  [::(*(@x, @n), lineMult(@n, @xs, nil()))]                   
                                                                                                                    
              [lineMult#2(::(@y, @ys), @n, @x, @xs)] =  [1] @y + [1] @ys + [2]                                      
                                                     >  [1] @ys + [1]                                               
                                                     =  [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))]              
                                                                                                                    
                          [#add(#pos(#s(#0())), @y)] =  [1] @y + [8]                                                
                                                     >  [2]                                                         
                                                     =  [#succ(@y)]                                                 
                                                                                                                    
                        [#add(#pos(#s(#s(@x))), @y)] =  [1] @y + [8]                                                
                                                     >  [2]                                                         
                                                     =  [#succ(#add(#pos(#s(@x)), @y))]                             
                                                                                                                    
                                    [#add(#0(), @y)] =  [1] @y + [6]                                                
                                                     >  [1] @y + [0]                                                
                                                     =  [@y]                                                        
                                                                                                                    
                          [#add(#neg(#s(#0())), @y)] =  [1] @y + [8]                                                
                                                     >  [4]                                                         
                                                     =  [#pred(@y)]                                                 
                                                                                                                    
                        [#add(#neg(#s(#s(@x))), @y)] =  [1] @y + [8]                                                
                                                     >  [4]                                                         
                                                     =  [#pred(#add(#pos(#s(@x)), @y))]                             
                                                                                                                    
                              [dequeue(@outq, @inq)] =  [1] @outq + [1] @inq + [3]                                  
                                                     >= [1] @outq + [1] @inq + [3]                                  
                                                     =  [dequeue#1(@outq, @inq)]                                    
                                                                                                                    
                      [computeLine(@line, @m, @acc)] =  [0]                                                         
                                                     ?  [7] @acc + [0]                                              
                                                     =  [computeLine#1(@line, @acc, @m)]                            
                                                                                                                    
                            [dequeue#1(nil(), @inq)] =  [1] @inq + [3]                                              
                                                     >= [1] @inq + [3]                                              
                                                     =  [dequeue#2(reverse(@inq))]                                  
                                                                                                                    
                      [dequeue#1(::(@t, @ts), @inq)] =  [1] @t + [1] @inq + [1] @ts + [4]                           
                                                     >  [1] @t + [1] @inq + [1] @ts + [1]                           
                                                     =  [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))]                
                                                                                                                    
                         [#mult(#pos(@x), #pos(@y))] =  [1] @x + [2]                                                
                                                     >  [1]                                                         
                                                     =  [#pos(#natmult(@x, @y))]                                    
                                                                                                                    
                             [#mult(#pos(@x), #0())] =  [1] @x + [2]                                                
                                                     >  [0]                                                         
                                                     =  [#0()]                                                      
                                                                                                                    
                         [#mult(#pos(@x), #neg(@y))] =  [1] @x + [2]                                                
                                                     >  [1]                                                         
                                                     =  [#neg(#natmult(@x, @y))]                                    
                                                                                                                    
                             [#mult(#0(), #pos(@y))] =  [1]                                                         
                                                     >  [0]                                                         
                                                     =  [#0()]                                                      
                                                                                                                    
                                 [#mult(#0(), #0())] =  [1]                                                         
                                                     >  [0]                                                         
                                                     =  [#0()]                                                      
                                                                                                                    
                             [#mult(#0(), #neg(@y))] =  [1]                                                         
                                                     >  [0]                                                         
                                                     =  [#0()]                                                      
                                                                                                                    
                         [#mult(#neg(@x), #pos(@y))] =  [2]                                                         
                                                     >  [1]                                                         
                                                     =  [#neg(#natmult(@x, @y))]                                    
                                                                                                                    
                             [#mult(#neg(@x), #0())] =  [2]                                                         
                                                     >  [0]                                                         
                                                     =  [#0()]                                                      
                                                                                                                    
                         [#mult(#neg(@x), #neg(@y))] =  [2]                                                         
                                                     >  [1]                                                         
                                                     =  [#pos(#natmult(@x, @y))]                                    
                                                                                                                    
                                         [+(@x, @y)] =  [0]                                                         
                                                     ?  [2] @x + [1] @y + [6]                                       
                                                     =  [#add(@x, @y)]                                              
                                                                                                                    
                               [#succ(#pos(#s(@x)))] =  [2]                                                         
                                                     >  [1]                                                         
                                                     =  [#pos(#s(#s(@x)))]                                          
                                                                                                                    
                                       [#succ(#0())] =  [2]                                                         
                                                     >  [1]                                                         
                                                     =  [#pos(#s(#0()))]                                            
                                                                                                                    
                             [#succ(#neg(#s(#0())))] =  [2]                                                         
                                                     >  [0]                                                         
                                                     =  [#0()]                                                      
                                                                                                                    
                           [#succ(#neg(#s(#s(@x))))] =  [2]                                                         
                                                     >  [1]                                                         
                                                     =  [#neg(#s(@x))]                                              
                                                                                                                    
               [enqueue#1(tuple#2(@outq, @inq), @t)] =  [1] @t + [1] @outq + [1] @inq + [1]                         
                                                     >= [1] @t + [1] @outq + [1] @inq + [1]                         
                                                     =  [tuple#2(@outq, ::(@t, @inq))]                              
                                                                                                                    
                              [matrixMult(@m1, @m2)] =  [1] @m1 + [2] @m2 + [0]                                     
                                                     >= [1] @m1 + [2] @m2 + [0]                                     
                                                     =  [matrixMult#1(@m1, @m2)]                                    
                                                                                                                    
                                         [*(@x, @y)] =  [7]                                                         
                                                     ?  [1] @x + [1]                                                
                                                     =  [#mult(@x, @y)]                                             
                                                                                                                    
                               [enqueue(@t, @queue)] =  [1] @t + [1] @queue + [1]                                   
                                                     >= [1] @t + [1] @queue + [1]                                   
                                                     =  [enqueue#1(@queue, @t)]                                     
                                                                                                                    
                                  [dequeue#2(nil())] =  [3]                                                         
                                                     >  [0]                                                         
                                                     =  [tuple#2(nil(), tuple#2(nil(), nil()))]                     
                                                                                                                    
                            [dequeue#2(::(@t, @ts))] =  [1] @t + [1] @ts + [4]                                      
                                                     >  [1] @t + [1] @ts + [1]                                      
                                                     =  [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))]               
                                                                                                                    
                             [#pred(#pos(#s(#0())))] =  [4]                                                         
                                                     >  [0]                                                         
                                                     =  [#0()]                                                      
                                                                                                                    
                           [#pred(#pos(#s(#s(@x))))] =  [4]                                                         
                                                     >  [1]                                                         
                                                     =  [#pos(#s(@x))]                                              
                                                                                                                    
                                       [#pred(#0())] =  [4]                                                         
                                                     >  [1]                                                         
                                                     =  [#neg(#s(#0()))]                                            
                                                                                                                    
                               [#pred(#neg(#s(@x)))] =  [4]                                                         
                                                     >  [1]                                                         
                                                     =  [#neg(#s(#s(@x)))]                                          
                                                                                                                    
                        [lineMult#1(nil(), @l2, @n)] =  [1] @l2 + [0]                                               
                                                     >= [0]                                                         
                                                     =  [nil()]                                                     
                                                                                                                    
                  [lineMult#1(::(@x, @xs), @l2, @n)] =  [1] @l2 + [0]                                               
                                                     ?  [1] @l2 + [1]                                               
                                                     =  [lineMult#2(@l2, @n, @x, @xs)]                              
                                                                                                                    
               [computeLine#2(nil(), @acc, @x, @xs)] =  [4]                                                         
                                                     >  [0]                                                         
                                                     =  [nil()]                                                     
                                                                                                                    
         [computeLine#2(::(@l, @ls), @acc, @x, @xs)] =  [4]                                                         
                                                     >  [0]                                                         
                                                     =  [computeLine(@xs, @ls, lineMult(@x, @l, @acc))]             
                                                                                                                    
                   [bftMult'#5^#(@queue', @acc, @y)] =  [2] @y + [2] @queue' + [7]                                  
                                                     >= [2] @queue' + [7]                                           
                                                     =  [bftMult'^#(@queue', matrixMult(@acc, @y))]                 
                                                                                                                    
                   [bftMult'#5^#(@queue', @acc, @y)] =  [2] @y + [2] @queue' + [7]                                  
                                                     >  [2] @y + [6]                                                
                                                     =  [matrixMult^#(@acc, @y)]                                    
                                                                                                                    
                          [bftMult'^#(@queue, @acc)] =  [2] @queue + [7]                                            
                                                     >  [2] @queue + [6]                                            
                                                     =  [bftMult'#1^#(bftMult'#2(@queue), @acc)]                    
                                                                                                                    
                            [matrixMult^#(@m1, @m2)] =  [2] @m2 + [6]                                               
                                                     >= [2] @m2 + [6]                                               
                                                     =  [matrixMult#1^#(@m1, @m2)]                                  
                                                                                                                    
            [computeLine#1^#(::(@x, @xs), @acc, @m)] =  [1] @m + [3]                                                
                                                     >  [1] @m + [2]                                                
                                                     =  [c_9(computeLine#2^#(@m, @acc, @x, @xs))]                   
                                                                                                                    
       [computeLine#2^#(::(@l, @ls), @acc, @x, @xs)] =  [1] @l + [1] @ls + [3]                                      
                                                     >= [1] @l + [1] @ls + [3]                                      
                                                     =  [c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),      
                                                              lineMult^#(@x, @l, @acc))]                            
                                                                                                                    
          [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] =  [2] @t + [2] @queue + [2] @_@3 + [2]                        
                                                     >  [2] @t + [2] @queue + [1]                                   
                                                     =  [bftMult'#4^#(@t, @acc, @queue)]                            
                                                                                                                    
                [bftMult'#4^#(leaf(), @acc, @queue)] =  [2] @queue + [9]                                            
                                                     >  [2] @queue + [7]                                            
                                                     =  [bftMult'^#(@queue, @acc)]                                  
                                                                                                                    
    [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] =  [2] @y + [2] @queue + [2] @t1 + [2] @t2 + [13]              
                                                     >  [2] @y + [2] @queue + [2] @t1 + [2] @t2 + [11]              
                                                     =  [bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)]
                                                                                                                    
                  [matrixMult#1^#(::(@l, @ls), @m2)] =  [2] @m2 + [6]                                               
                                                     >= [2] @m2 + [6]                                               
                                                     =  [matrixMult^#(@ls, @m2)]                                    
                                                                                                                    
                  [matrixMult#1^#(::(@l, @ls), @m2)] =  [2] @m2 + [6]                                               
                                                     >  [1] @m2 + [3]                                               
                                                     =  [computeLine^#(@l, @m2, nil())]                             
                                                                                                                    
                    [computeLine^#(@line, @m, @acc)] =  [1] @m + [3]                                                
                                                     >= [1] @m + [3]                                                
                                                     =  [c_15(computeLine#1^#(@line, @acc, @m))]                    
                                                                                                                    
                          [lineMult^#(@n, @l1, @l2)] =  [1] @l1 + [0]                                               
                                                     >= [1] @l1 + [0]                                               
                                                     =  [c_17(lineMult#1^#(@l1, @l2, @n))]                          
                                                                                                                    
                [lineMult#1^#(::(@x, @xs), @l2, @n)] =  [1] @x + [1] @xs + [1]                                      
                                                     >  [1] @xs + [0]                                               
                                                     =  [c_18(lineMult#2^#(@l2, @n, @x, @xs))]                      
                                                                                                                    
                  [lineMult#2^#(nil(), @n, @x, @xs)] =  [1] @xs + [0]                                               
                                                     >= [1] @xs + [0]                                               
                                                     =  [c_19(lineMult^#(@n, @xs, nil()))]                          
                                                                                                                    
            [lineMult#2^#(::(@y, @ys), @n, @x, @xs)] =  [1] @xs + [0]                                               
                                                     >= [1] @xs + [0]                                               
                                                     =  [c_20(lineMult^#(@n, @xs, @ys))]                            
                                                                                                                    
        [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] =  [2] @queue + [2] @elem + [0]                                
                                                     >= [2] @queue + [2] @elem + [0]                                
                                                     =  [bftMult'#3^#(@elem, @acc, @queue)]                         
                                                                                                                    

We return to the main proof. Consider the set of all dependency
pairs

:
  { 1: computeLine#1^#(::(@x, @xs), @acc, @m) ->
       c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , 2: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
       c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
            lineMult^#(@x, @l, @acc))
  , 3: computeLine^#(@line, @m, @acc) ->
       c_15(computeLine#1^#(@line, @acc, @m))
  , 4: lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , 5: lineMult#1^#(::(@x, @xs), @l2, @n) ->
       c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , 6: lineMult#2^#(nil(), @n, @x, @xs) ->
       c_19(lineMult^#(@n, @xs, nil()))
  , 7: lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
       c_20(lineMult^#(@n, @xs, @ys))
  , 8: bftMult'#5^#(@queue', @acc, @y) ->
       bftMult'^#(@queue', matrixMult(@acc, @y))
  , 9: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , 10: bftMult'^#(@queue, @acc) ->
        bftMult'#1^#(bftMult'#2(@queue), @acc)
  , 11: matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2)
  , 12: bftMult'#3^#(::(@t, @_@3), @acc, @queue) ->
        bftMult'#4^#(@t, @acc, @queue)
  , 13: bftMult'#4^#(leaf(), @acc, @queue) ->
        bftMult'^#(@queue, @acc)
  , 14: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) ->
        bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)
  , 15: matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2)
  , 16: matrixMult#1^#(::(@l, @ls), @m2) ->
        computeLine^#(@l, @m2, nil())
  , 17: bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
        bftMult'#3^#(@elem, @acc, @queue) }

Processor 'matrix interpretation of dimension 1' induces the
complexity certificate YES(?,O(n^1)) on application of dependency
pairs {1,5,9,10,12,13,14,16}. These cover all (indirect)
predecessors of dependency pairs
{1,2,3,4,5,6,7,8,9,10,12,13,14,16,17}, their number of application
is equally bounded. The dependency pairs are shifted into the weak
component.

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(1)).

Weak DPs:
  { bftMult'#5^#(@queue', @acc, @y) ->
    bftMult'^#(@queue', matrixMult(@acc, @y))
  , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
  , bftMult'^#(@queue, @acc) ->
    bftMult'#1^#(bftMult'#2(@queue), @acc)
  , matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2)
  , computeLine#1^#(::(@x, @xs), @acc, @m) ->
    c_9(computeLine#2^#(@m, @acc, @x, @xs))
  , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
    c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
         lineMult^#(@x, @l, @acc))
  , 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)
  , matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2)
  , matrixMult#1^#(::(@l, @ls), @m2) -> computeLine^#(@l, @m2, nil())
  , computeLine^#(@line, @m, @acc) ->
    c_15(computeLine#1^#(@line, @acc, @m))
  , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
  , lineMult#1^#(::(@x, @xs), @l2, @n) ->
    c_18(lineMult#2^#(@l2, @n, @x, @xs))
  , lineMult#2^#(nil(), @n, @x, @xs) ->
    c_19(lineMult^#(@n, @xs, nil()))
  , lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
    c_20(lineMult^#(@n, @xs, @ys))
  , bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
    bftMult'#3^#(@elem, @acc, @queue) }
Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(1))

The following weak DPs constitute a sub-graph of the DG that is
closed under successors. The DPs are removed.

{ bftMult'#5^#(@queue', @acc, @y) ->
  bftMult'^#(@queue', matrixMult(@acc, @y))
, bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y)
, bftMult'^#(@queue, @acc) ->
  bftMult'#1^#(bftMult'#2(@queue), @acc)
, matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2)
, computeLine#1^#(::(@x, @xs), @acc, @m) ->
  c_9(computeLine#2^#(@m, @acc, @x, @xs))
, computeLine#2^#(::(@l, @ls), @acc, @x, @xs) ->
  c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)),
       lineMult^#(@x, @l, @acc))
, 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)
, matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2)
, matrixMult#1^#(::(@l, @ls), @m2) -> computeLine^#(@l, @m2, nil())
, computeLine^#(@line, @m, @acc) ->
  c_15(computeLine#1^#(@line, @acc, @m))
, lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n))
, lineMult#1^#(::(@x, @xs), @l2, @n) ->
  c_18(lineMult#2^#(@l2, @n, @x, @xs))
, lineMult#2^#(nil(), @n, @x, @xs) ->
  c_19(lineMult^#(@n, @xs, nil()))
, lineMult#2^#(::(@y, @ys), @n, @x, @xs) ->
  c_20(lineMult^#(@n, @xs, @ys))
, bftMult'#1^#(tuple#2(@elem, @queue), @acc) ->
  bftMult'#3^#(@elem, @acc, @queue) }

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(1)).

Weak Trs:
  { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) ->
    dequeue(@dequeue@1, @dequeue@2)
  , #natmult(#0(), @y) -> #0()
  , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y))
  , reverse(@xs) -> appendreverse(@xs, nil())
  , appendreverse#1(nil(), @sofar) -> @sofar
  , appendreverse#1(::(@a, @as), @sofar) ->
    appendreverse(@as, ::(@a, @sofar))
  , computeLine#1(nil(), @acc, @m) -> @acc
  , computeLine#1(::(@x, @xs), @acc, @m) ->
    computeLine#2(@m, @acc, @x, @xs)
  , appendreverse(@toreverse, @sofar) ->
    appendreverse#1(@toreverse, @sofar)
  , matrixMult#1(nil(), @m2) -> nil()
  , matrixMult#1(::(@l, @ls), @m2) ->
    ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))
  , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n)
  , lineMult#2(nil(), @n, @x, @xs) ->
    ::(*(@x, @n), lineMult(@n, @xs, nil()))
  , lineMult#2(::(@y, @ys), @n, @x, @xs) ->
    ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))
  , #add(#pos(#s(#0())), @y) -> #succ(@y)
  , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y))
  , #add(#0(), @y) -> @y
  , #add(#neg(#s(#0())), @y) -> #pred(@y)
  , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y))
  , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq)
  , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m)
  , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq))
  , dequeue#1(::(@t, @ts), @inq) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, @inq))
  , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y))
  , #mult(#pos(@x), #0()) -> #0()
  , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#0(), #pos(@y)) -> #0()
  , #mult(#0(), #0()) -> #0()
  , #mult(#0(), #neg(@y)) -> #0()
  , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y))
  , #mult(#neg(@x), #0()) -> #0()
  , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y))
  , +(@x, @y) -> #add(@x, @y)
  , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x)))
  , #succ(#0()) -> #pos(#s(#0()))
  , #succ(#neg(#s(#0()))) -> #0()
  , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x))
  , enqueue#1(tuple#2(@outq, @inq), @t) ->
    tuple#2(@outq, ::(@t, @inq))
  , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2)
  , *(@x, @y) -> #mult(@x, @y)
  , enqueue(@t, @queue) -> enqueue#1(@queue, @t)
  , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil()))
  , dequeue#2(::(@t, @ts)) ->
    tuple#2(::(@t, nil()), tuple#2(@ts, nil()))
  , #pred(#pos(#s(#0()))) -> #0()
  , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x))
  , #pred(#0()) -> #neg(#s(#0()))
  , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x)))
  , lineMult#1(nil(), @l2, @n) -> nil()
  , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs)
  , computeLine#2(nil(), @acc, @x, @xs) -> nil()
  , computeLine#2(::(@l, @ls), @acc, @x, @xs) ->
    computeLine(@xs, @ls, lineMult(@x, @l, @acc)) }
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(1))

No rule is usable, rules are removed from the input problem.

We are left with following problem, upon which TcT provides the
certificate YES(O(1),O(1)).

Rules: Empty
Obligation:
  innermost runtime complexity
Answer:
  YES(O(1),O(1))

Empty rules are trivially bounded

Hurray, we answered YES(O(1),O(n^3))