YES(O(1),O(n^3)) 675.11/183.35 YES(O(1),O(n^3)) 675.11/183.35 675.11/183.35 We are left with following problem, upon which TcT provides the 675.11/183.35 certificate YES(O(1),O(n^3)). 675.11/183.35 675.11/183.35 Strict Trs: 675.11/183.35 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.35 dequeue(@dequeue@1, @dequeue@2) 675.11/183.35 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.35 , bftMult'#5(@queue', @acc, @y) -> 675.11/183.35 bftMult'(@queue', matrixMult(@acc, @y)) 675.11/183.35 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.35 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.35 appendreverse(@as, ::(@a, @sofar)) 675.11/183.35 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.35 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.35 computeLine#2(@m, @acc, @x, @xs) 675.11/183.35 , bftMult'#3(nil(), @acc, @queue) -> @acc 675.11/183.35 , bftMult'#3(::(@t, @_@3), @acc, @queue) -> 675.11/183.35 bftMult'#4(@t, @acc, @queue) 675.11/183.35 , appendreverse(@toreverse, @sofar) -> 675.11/183.35 appendreverse#1(@toreverse, @sofar) 675.11/183.35 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.35 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.35 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.35 , bftMult(@t, @acc) -> 675.11/183.35 bftMult'(tuple#2(::(@t, nil()), nil()), @acc) 675.11/183.35 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.35 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.35 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.35 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.35 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.35 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.35 , bftMult'#1(tuple#2(@elem, @queue), @acc) -> 675.11/183.35 bftMult'#3(@elem, @acc, @queue) 675.11/183.35 , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc) 675.11/183.35 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.35 , bftMult'#4(leaf(), @acc, @queue) -> bftMult'(@queue, @acc) 675.11/183.35 , bftMult'#4(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.35 bftMult'#5(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.11/183.35 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.35 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.35 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.35 , +(@x, @y) -> #add(@x, @y) 675.11/183.35 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.35 tuple#2(@outq, ::(@t, @inq)) 675.11/183.35 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.35 , *(@x, @y) -> #mult(@x, @y) 675.11/183.35 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.35 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.35 , dequeue#2(::(@t, @ts)) -> 675.11/183.35 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.35 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.35 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.35 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.35 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.35 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.35 Weak Trs: 675.11/183.35 { #natmult(#0(), @y) -> #0() 675.11/183.35 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.35 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.35 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.35 , #add(#0(), @y) -> @y 675.11/183.35 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.35 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.35 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.35 , #mult(#pos(@x), #0()) -> #0() 675.11/183.35 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.35 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.35 , #mult(#0(), #0()) -> #0() 675.11/183.35 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.35 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.35 , #mult(#neg(@x), #0()) -> #0() 675.11/183.35 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.35 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.35 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.35 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.35 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.35 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.35 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.35 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.35 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) } 675.11/183.35 Obligation: 675.11/183.35 innermost runtime complexity 675.11/183.35 Answer: 675.11/183.35 YES(O(1),O(n^3)) 675.11/183.35 675.11/183.35 We add the following dependency tuples: 675.11/183.35 675.11/183.35 Strict DPs: 675.11/183.35 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.35 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.35 , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq)) 675.11/183.35 , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil())) 675.11/183.35 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.35 c_10(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.35 , bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.35 c_3(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.35 matrixMult^#(@acc, @y)) 675.11/183.35 , bftMult'^#(@queue, @acc) -> 675.11/183.35 c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.35 , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2)) 675.11/183.35 , appendreverse#1^#(nil(), @sofar) -> c_4() 675.11/183.35 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.35 c_5(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.35 , computeLine#1^#(nil(), @acc, @m) -> c_6() 675.11/183.35 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.35 c_7(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.35 , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34() 675.11/183.35 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.35 c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.35 lineMult^#(@x, @l, @acc)) 675.11/183.35 , bftMult'#3^#(nil(), @acc, @queue) -> c_8() 675.11/183.35 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.35 c_9(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.35 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.35 c_21(bftMult'^#(@queue, @acc)) 675.11/183.35 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.35 c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y), 675.11/183.35 enqueue^#(@t2, enqueue(@t1, @queue)), 675.11/183.35 enqueue^#(@t1, @queue)) 675.11/183.35 , matrixMult#1^#(nil(), @m2) -> c_11() 675.11/183.35 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.35 c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.35 , computeLine^#(@line, @m, @acc) -> 675.11/183.35 c_20(computeLine#1^#(@line, @acc, @m)) 675.11/183.35 , bftMult^#(@t, @acc) -> 675.11/183.35 c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.35 , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n)) 675.11/183.35 , lineMult#1^#(nil(), @l2, @n) -> c_32() 675.11/183.35 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.35 c_33(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.35 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.35 c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil())) 675.11/183.35 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.35 c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys)) 675.11/183.35 , *^#(@x, @y) -> c_28(#mult^#(@x, @y)) 675.11/183.35 , +^#(@x, @y) -> c_25(#add^#(@x, @y)) 675.11/183.35 , dequeue#1^#(nil(), @inq) -> 675.11/183.35 c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) 675.11/183.35 , dequeue#1^#(::(@t, @ts), @inq) -> c_24() 675.11/183.35 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.35 c_18(bftMult'#3^#(@elem, @acc, @queue)) 675.11/183.35 , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t)) 675.11/183.35 , dequeue#2^#(nil()) -> c_30() 675.11/183.35 , dequeue#2^#(::(@t, @ts)) -> c_31() 675.11/183.35 , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() } 675.11/183.35 Weak DPs: 675.11/183.35 { #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y)) 675.11/183.35 , #add^#(#pos(#s(#s(@x))), @y) -> 675.11/183.35 c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.35 , #add^#(#0(), @y) -> c_40() 675.11/183.35 , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y)) 675.11/183.35 , #add^#(#neg(#s(#s(@x))), @y) -> 675.11/183.35 c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.35 , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y)) 675.11/183.35 , #mult^#(#pos(@x), #0()) -> c_44() 675.11/183.35 , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y)) 675.11/183.35 , #mult^#(#0(), #pos(@y)) -> c_46() 675.11/183.35 , #mult^#(#0(), #0()) -> c_47() 675.11/183.35 , #mult^#(#0(), #neg(@y)) -> c_48() 675.11/183.35 , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y)) 675.11/183.35 , #mult^#(#neg(@x), #0()) -> c_50() 675.11/183.35 , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y)) 675.11/183.35 , #natmult^#(#0(), @y) -> c_36() 675.11/183.35 , #natmult^#(#s(@x), @y) -> 675.11/183.35 c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y)) 675.11/183.35 , #succ^#(#pos(#s(@x))) -> c_52() 675.11/183.35 , #succ^#(#0()) -> c_53() 675.11/183.35 , #succ^#(#neg(#s(#0()))) -> c_54() 675.11/183.35 , #succ^#(#neg(#s(#s(@x)))) -> c_55() 675.11/183.35 , #pred^#(#pos(#s(#0()))) -> c_56() 675.11/183.35 , #pred^#(#pos(#s(#s(@x)))) -> c_57() 675.11/183.35 , #pred^#(#0()) -> c_58() 675.11/183.35 , #pred^#(#neg(#s(@x))) -> c_59() } 675.11/183.35 675.11/183.35 and mark the set of starting terms. 675.11/183.35 675.11/183.35 We are left with following problem, upon which TcT provides the 675.11/183.35 certificate YES(O(1),O(n^3)). 675.11/183.35 675.11/183.35 Strict DPs: 675.11/183.35 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.35 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.35 , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq)) 675.11/183.35 , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil())) 675.11/183.35 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.35 c_10(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.35 , bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.35 c_3(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.35 matrixMult^#(@acc, @y)) 675.11/183.35 , bftMult'^#(@queue, @acc) -> 675.11/183.35 c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.35 , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2)) 675.11/183.35 , appendreverse#1^#(nil(), @sofar) -> c_4() 675.11/183.35 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.35 c_5(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.35 , computeLine#1^#(nil(), @acc, @m) -> c_6() 675.11/183.35 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.35 c_7(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.35 , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34() 675.11/183.35 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.35 c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.35 lineMult^#(@x, @l, @acc)) 675.11/183.35 , bftMult'#3^#(nil(), @acc, @queue) -> c_8() 675.11/183.35 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.35 c_9(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.35 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.35 c_21(bftMult'^#(@queue, @acc)) 675.11/183.35 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.35 c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y), 675.11/183.35 enqueue^#(@t2, enqueue(@t1, @queue)), 675.11/183.35 enqueue^#(@t1, @queue)) 675.11/183.35 , matrixMult#1^#(nil(), @m2) -> c_11() 675.11/183.35 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.35 c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.35 , computeLine^#(@line, @m, @acc) -> 675.11/183.35 c_20(computeLine#1^#(@line, @acc, @m)) 675.11/183.35 , bftMult^#(@t, @acc) -> 675.11/183.35 c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.35 , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n)) 675.11/183.35 , lineMult#1^#(nil(), @l2, @n) -> c_32() 675.11/183.35 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.35 c_33(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.35 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.35 c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil())) 675.11/183.35 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.35 c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys)) 675.11/183.35 , *^#(@x, @y) -> c_28(#mult^#(@x, @y)) 675.11/183.35 , +^#(@x, @y) -> c_25(#add^#(@x, @y)) 675.11/183.35 , dequeue#1^#(nil(), @inq) -> 675.11/183.35 c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) 675.11/183.35 , dequeue#1^#(::(@t, @ts), @inq) -> c_24() 675.11/183.35 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.35 c_18(bftMult'#3^#(@elem, @acc, @queue)) 675.11/183.35 , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t)) 675.11/183.35 , dequeue#2^#(nil()) -> c_30() 675.11/183.35 , dequeue#2^#(::(@t, @ts)) -> c_31() 675.11/183.35 , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() } 675.11/183.35 Weak DPs: 675.11/183.35 { #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y)) 675.11/183.35 , #add^#(#pos(#s(#s(@x))), @y) -> 675.11/183.35 c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.35 , #add^#(#0(), @y) -> c_40() 675.11/183.35 , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y)) 675.11/183.35 , #add^#(#neg(#s(#s(@x))), @y) -> 675.11/183.35 c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.35 , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y)) 675.11/183.35 , #mult^#(#pos(@x), #0()) -> c_44() 675.11/183.35 , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y)) 675.11/183.35 , #mult^#(#0(), #pos(@y)) -> c_46() 675.11/183.35 , #mult^#(#0(), #0()) -> c_47() 675.11/183.35 , #mult^#(#0(), #neg(@y)) -> c_48() 675.11/183.35 , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y)) 675.11/183.35 , #mult^#(#neg(@x), #0()) -> c_50() 675.11/183.35 , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y)) 675.11/183.35 , #natmult^#(#0(), @y) -> c_36() 675.11/183.35 , #natmult^#(#s(@x), @y) -> 675.11/183.35 c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y)) 675.11/183.35 , #succ^#(#pos(#s(@x))) -> c_52() 675.11/183.35 , #succ^#(#0()) -> c_53() 675.11/183.35 , #succ^#(#neg(#s(#0()))) -> c_54() 675.11/183.35 , #succ^#(#neg(#s(#s(@x)))) -> c_55() 675.11/183.35 , #pred^#(#pos(#s(#0()))) -> c_56() 675.11/183.35 , #pred^#(#pos(#s(#s(@x)))) -> c_57() 675.11/183.35 , #pred^#(#0()) -> c_58() 675.11/183.35 , #pred^#(#neg(#s(@x))) -> c_59() } 675.11/183.35 Weak Trs: 675.11/183.35 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.35 dequeue(@dequeue@1, @dequeue@2) 675.11/183.35 , #natmult(#0(), @y) -> #0() 675.11/183.35 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.35 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.35 , bftMult'#5(@queue', @acc, @y) -> 675.11/183.35 bftMult'(@queue', matrixMult(@acc, @y)) 675.11/183.35 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.35 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.35 appendreverse(@as, ::(@a, @sofar)) 675.11/183.35 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.35 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.35 computeLine#2(@m, @acc, @x, @xs) 675.11/183.35 , bftMult'#3(nil(), @acc, @queue) -> @acc 675.11/183.35 , bftMult'#3(::(@t, @_@3), @acc, @queue) -> 675.11/183.35 bftMult'#4(@t, @acc, @queue) 675.11/183.35 , appendreverse(@toreverse, @sofar) -> 675.11/183.35 appendreverse#1(@toreverse, @sofar) 675.11/183.35 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.35 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.35 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.35 , bftMult(@t, @acc) -> 675.11/183.35 bftMult'(tuple#2(::(@t, nil()), nil()), @acc) 675.11/183.35 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.35 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.35 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.35 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.35 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.35 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.35 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.35 , #add(#0(), @y) -> @y 675.11/183.35 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.35 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.35 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.35 , bftMult'#1(tuple#2(@elem, @queue), @acc) -> 675.11/183.35 bftMult'#3(@elem, @acc, @queue) 675.11/183.35 , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc) 675.11/183.35 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.35 , bftMult'#4(leaf(), @acc, @queue) -> bftMult'(@queue, @acc) 675.11/183.35 , bftMult'#4(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.35 bftMult'#5(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.11/183.35 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.35 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.35 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.35 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.35 , #mult(#pos(@x), #0()) -> #0() 675.11/183.35 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.35 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.35 , #mult(#0(), #0()) -> #0() 675.11/183.35 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.35 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.35 , #mult(#neg(@x), #0()) -> #0() 675.11/183.35 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.35 , +(@x, @y) -> #add(@x, @y) 675.11/183.35 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.35 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.35 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.35 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.35 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.35 tuple#2(@outq, ::(@t, @inq)) 675.11/183.35 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.35 , *(@x, @y) -> #mult(@x, @y) 675.11/183.35 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.35 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.35 , dequeue#2(::(@t, @ts)) -> 675.11/183.35 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.35 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.35 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.35 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.35 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.35 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.35 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.35 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.35 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.35 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.35 Obligation: 675.11/183.35 innermost runtime complexity 675.11/183.35 Answer: 675.11/183.35 YES(O(1),O(n^3)) 675.11/183.35 675.11/183.35 We estimate the number of application of 675.11/183.35 {8,10,12,14,18,23,27,28,30,33,34,35} by applications of 675.11/183.35 Pre({8,10,12,14,18,23,27,28,30,33,34,35}) = 675.11/183.35 {2,4,7,11,20,22,25,26,29,31,32}. Here rules are labeled as follows: 675.11/183.35 675.11/183.35 DPs: 675.11/183.35 { 1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.35 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.35 , 2: dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq)) 675.11/183.35 , 3: reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil())) 675.11/183.35 , 4: appendreverse^#(@toreverse, @sofar) -> 675.11/183.35 c_10(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.35 , 5: bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.35 c_3(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.35 matrixMult^#(@acc, @y)) 675.11/183.35 , 6: bftMult'^#(@queue, @acc) -> 675.11/183.35 c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.35 , 7: matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2)) 675.11/183.35 , 8: appendreverse#1^#(nil(), @sofar) -> c_4() 675.11/183.35 , 9: appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.35 c_5(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.35 , 10: computeLine#1^#(nil(), @acc, @m) -> c_6() 675.11/183.35 , 11: computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.35 c_7(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.35 , 12: computeLine#2^#(nil(), @acc, @x, @xs) -> c_34() 675.11/183.35 , 13: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.36 c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.36 lineMult^#(@x, @l, @acc)) 675.11/183.36 , 14: bftMult'#3^#(nil(), @acc, @queue) -> c_8() 675.11/183.36 , 15: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.36 c_9(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.36 , 16: bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.36 c_21(bftMult'^#(@queue, @acc)) 675.11/183.36 , 17: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.36 c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y), 675.11/183.36 enqueue^#(@t2, enqueue(@t1, @queue)), 675.11/183.36 enqueue^#(@t1, @queue)) 675.11/183.36 , 18: matrixMult#1^#(nil(), @m2) -> c_11() 675.11/183.36 , 19: matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.36 c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.36 , 20: computeLine^#(@line, @m, @acc) -> 675.11/183.36 c_20(computeLine#1^#(@line, @acc, @m)) 675.11/183.36 , 21: bftMult^#(@t, @acc) -> 675.11/183.36 c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.36 , 22: lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n)) 675.11/183.36 , 23: lineMult#1^#(nil(), @l2, @n) -> c_32() 675.11/183.36 , 24: lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.36 c_33(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.36 , 25: lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.36 c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil())) 675.11/183.36 , 26: lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.36 c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys)) 675.11/183.36 , 27: *^#(@x, @y) -> c_28(#mult^#(@x, @y)) 675.11/183.36 , 28: +^#(@x, @y) -> c_25(#add^#(@x, @y)) 675.11/183.36 , 29: dequeue#1^#(nil(), @inq) -> 675.11/183.36 c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) 675.11/183.36 , 30: dequeue#1^#(::(@t, @ts), @inq) -> c_24() 675.11/183.36 , 31: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.36 c_18(bftMult'#3^#(@elem, @acc, @queue)) 675.11/183.36 , 32: enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t)) 675.11/183.36 , 33: dequeue#2^#(nil()) -> c_30() 675.11/183.36 , 34: dequeue#2^#(::(@t, @ts)) -> c_31() 675.11/183.36 , 35: enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() 675.11/183.36 , 36: #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y)) 675.11/183.36 , 37: #add^#(#pos(#s(#s(@x))), @y) -> 675.11/183.36 c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.36 , 38: #add^#(#0(), @y) -> c_40() 675.11/183.36 , 39: #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y)) 675.11/183.36 , 40: #add^#(#neg(#s(#s(@x))), @y) -> 675.11/183.36 c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.36 , 41: #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y)) 675.11/183.36 , 42: #mult^#(#pos(@x), #0()) -> c_44() 675.11/183.36 , 43: #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y)) 675.11/183.36 , 44: #mult^#(#0(), #pos(@y)) -> c_46() 675.11/183.36 , 45: #mult^#(#0(), #0()) -> c_47() 675.11/183.36 , 46: #mult^#(#0(), #neg(@y)) -> c_48() 675.11/183.36 , 47: #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y)) 675.11/183.36 , 48: #mult^#(#neg(@x), #0()) -> c_50() 675.11/183.36 , 49: #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y)) 675.11/183.36 , 50: #natmult^#(#0(), @y) -> c_36() 675.11/183.36 , 51: #natmult^#(#s(@x), @y) -> 675.11/183.36 c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y)) 675.11/183.36 , 52: #succ^#(#pos(#s(@x))) -> c_52() 675.11/183.36 , 53: #succ^#(#0()) -> c_53() 675.11/183.36 , 54: #succ^#(#neg(#s(#0()))) -> c_54() 675.11/183.36 , 55: #succ^#(#neg(#s(#s(@x)))) -> c_55() 675.11/183.36 , 56: #pred^#(#pos(#s(#0()))) -> c_56() 675.11/183.36 , 57: #pred^#(#pos(#s(#s(@x)))) -> c_57() 675.11/183.36 , 58: #pred^#(#0()) -> c_58() 675.11/183.36 , 59: #pred^#(#neg(#s(@x))) -> c_59() } 675.11/183.36 675.11/183.36 We are left with following problem, upon which TcT provides the 675.11/183.36 certificate YES(O(1),O(n^3)). 675.11/183.36 675.11/183.36 Strict DPs: 675.11/183.36 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.36 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.36 , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq)) 675.11/183.36 , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil())) 675.11/183.36 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.36 c_10(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.36 , bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.36 c_3(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.36 matrixMult^#(@acc, @y)) 675.11/183.36 , bftMult'^#(@queue, @acc) -> 675.11/183.36 c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.36 , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2)) 675.11/183.36 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.36 c_5(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.36 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.36 c_7(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.36 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.36 c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.36 lineMult^#(@x, @l, @acc)) 675.11/183.36 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.36 c_9(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.36 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.36 c_21(bftMult'^#(@queue, @acc)) 675.11/183.36 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.36 c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y), 675.11/183.36 enqueue^#(@t2, enqueue(@t1, @queue)), 675.11/183.36 enqueue^#(@t1, @queue)) 675.11/183.36 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.36 c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.36 , computeLine^#(@line, @m, @acc) -> 675.11/183.36 c_20(computeLine#1^#(@line, @acc, @m)) 675.11/183.36 , bftMult^#(@t, @acc) -> 675.11/183.36 c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.36 , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n)) 675.11/183.36 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.36 c_33(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.36 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.36 c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil())) 675.11/183.36 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.36 c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys)) 675.11/183.36 , dequeue#1^#(nil(), @inq) -> 675.11/183.36 c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) 675.11/183.36 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.36 c_18(bftMult'#3^#(@elem, @acc, @queue)) 675.11/183.36 , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t)) } 675.11/183.36 Weak DPs: 675.11/183.36 { appendreverse#1^#(nil(), @sofar) -> c_4() 675.11/183.36 , computeLine#1^#(nil(), @acc, @m) -> c_6() 675.11/183.36 , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34() 675.11/183.36 , bftMult'#3^#(nil(), @acc, @queue) -> c_8() 675.11/183.36 , matrixMult#1^#(nil(), @m2) -> c_11() 675.11/183.36 , lineMult#1^#(nil(), @l2, @n) -> c_32() 675.11/183.36 , *^#(@x, @y) -> c_28(#mult^#(@x, @y)) 675.11/183.36 , +^#(@x, @y) -> c_25(#add^#(@x, @y)) 675.11/183.36 , dequeue#1^#(::(@t, @ts), @inq) -> c_24() 675.11/183.36 , dequeue#2^#(nil()) -> c_30() 675.11/183.36 , dequeue#2^#(::(@t, @ts)) -> c_31() 675.11/183.36 , #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y)) 675.11/183.36 , #add^#(#pos(#s(#s(@x))), @y) -> 675.11/183.36 c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.36 , #add^#(#0(), @y) -> c_40() 675.11/183.36 , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y)) 675.11/183.36 , #add^#(#neg(#s(#s(@x))), @y) -> 675.11/183.36 c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.36 , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() 675.11/183.36 , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y)) 675.11/183.36 , #mult^#(#pos(@x), #0()) -> c_44() 675.11/183.36 , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y)) 675.11/183.36 , #mult^#(#0(), #pos(@y)) -> c_46() 675.11/183.36 , #mult^#(#0(), #0()) -> c_47() 675.11/183.36 , #mult^#(#0(), #neg(@y)) -> c_48() 675.11/183.36 , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y)) 675.11/183.36 , #mult^#(#neg(@x), #0()) -> c_50() 675.11/183.36 , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y)) 675.11/183.36 , #natmult^#(#0(), @y) -> c_36() 675.11/183.36 , #natmult^#(#s(@x), @y) -> 675.11/183.36 c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y)) 675.11/183.36 , #succ^#(#pos(#s(@x))) -> c_52() 675.11/183.36 , #succ^#(#0()) -> c_53() 675.11/183.36 , #succ^#(#neg(#s(#0()))) -> c_54() 675.11/183.36 , #succ^#(#neg(#s(#s(@x)))) -> c_55() 675.11/183.36 , #pred^#(#pos(#s(#0()))) -> c_56() 675.11/183.36 , #pred^#(#pos(#s(#s(@x)))) -> c_57() 675.11/183.36 , #pred^#(#0()) -> c_58() 675.11/183.36 , #pred^#(#neg(#s(@x))) -> c_59() } 675.11/183.36 Weak Trs: 675.11/183.36 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.36 dequeue(@dequeue@1, @dequeue@2) 675.11/183.36 , #natmult(#0(), @y) -> #0() 675.11/183.36 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.36 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.36 , bftMult'#5(@queue', @acc, @y) -> 675.11/183.36 bftMult'(@queue', matrixMult(@acc, @y)) 675.11/183.36 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.36 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.36 appendreverse(@as, ::(@a, @sofar)) 675.11/183.36 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.36 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.36 computeLine#2(@m, @acc, @x, @xs) 675.11/183.36 , bftMult'#3(nil(), @acc, @queue) -> @acc 675.11/183.36 , bftMult'#3(::(@t, @_@3), @acc, @queue) -> 675.11/183.36 bftMult'#4(@t, @acc, @queue) 675.11/183.36 , appendreverse(@toreverse, @sofar) -> 675.11/183.36 appendreverse#1(@toreverse, @sofar) 675.11/183.36 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.36 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.36 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.36 , bftMult(@t, @acc) -> 675.11/183.36 bftMult'(tuple#2(::(@t, nil()), nil()), @acc) 675.11/183.36 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.36 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.36 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.36 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.36 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.36 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.36 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.36 , #add(#0(), @y) -> @y 675.11/183.36 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.36 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.36 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.36 , bftMult'#1(tuple#2(@elem, @queue), @acc) -> 675.11/183.36 bftMult'#3(@elem, @acc, @queue) 675.11/183.36 , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc) 675.11/183.36 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.36 , bftMult'#4(leaf(), @acc, @queue) -> bftMult'(@queue, @acc) 675.11/183.36 , bftMult'#4(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.36 bftMult'#5(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.11/183.36 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.36 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.36 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.36 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.36 , #mult(#pos(@x), #0()) -> #0() 675.11/183.36 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.36 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.36 , #mult(#0(), #0()) -> #0() 675.11/183.36 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.36 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.36 , #mult(#neg(@x), #0()) -> #0() 675.11/183.36 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.36 , +(@x, @y) -> #add(@x, @y) 675.11/183.36 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.36 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.36 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.36 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.36 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.36 tuple#2(@outq, ::(@t, @inq)) 675.11/183.36 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.36 , *(@x, @y) -> #mult(@x, @y) 675.11/183.36 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.36 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.36 , dequeue#2(::(@t, @ts)) -> 675.11/183.36 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.36 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.36 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.36 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.36 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.36 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.36 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.36 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.36 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.36 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.36 Obligation: 675.11/183.36 innermost runtime complexity 675.11/183.36 Answer: 675.11/183.36 YES(O(1),O(n^3)) 675.11/183.36 675.11/183.36 We estimate the number of application of {23} by applications of 675.11/183.36 Pre({23}) = {13}. Here rules are labeled as follows: 675.11/183.36 675.11/183.36 DPs: 675.11/183.36 { 1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.36 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.36 , 2: dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq)) 675.11/183.36 , 3: reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil())) 675.11/183.36 , 4: appendreverse^#(@toreverse, @sofar) -> 675.11/183.36 c_10(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.36 , 5: bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.36 c_3(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.36 matrixMult^#(@acc, @y)) 675.11/183.36 , 6: bftMult'^#(@queue, @acc) -> 675.11/183.36 c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.36 , 7: matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2)) 675.11/183.36 , 8: appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.36 c_5(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.36 , 9: computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.36 c_7(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.36 , 10: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.36 c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.36 lineMult^#(@x, @l, @acc)) 675.11/183.36 , 11: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.36 c_9(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.36 , 12: bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.36 c_21(bftMult'^#(@queue, @acc)) 675.11/183.36 , 13: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.36 c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y), 675.11/183.36 enqueue^#(@t2, enqueue(@t1, @queue)), 675.11/183.36 enqueue^#(@t1, @queue)) 675.11/183.36 , 14: matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.36 c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.36 , 15: computeLine^#(@line, @m, @acc) -> 675.11/183.36 c_20(computeLine#1^#(@line, @acc, @m)) 675.11/183.36 , 16: bftMult^#(@t, @acc) -> 675.11/183.36 c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.36 , 17: lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n)) 675.11/183.36 , 18: lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.36 c_33(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.36 , 19: lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.36 c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil())) 675.11/183.36 , 20: lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.36 c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys)) 675.11/183.36 , 21: dequeue#1^#(nil(), @inq) -> 675.11/183.36 c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) 675.11/183.36 , 22: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.36 c_18(bftMult'#3^#(@elem, @acc, @queue)) 675.11/183.36 , 23: enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t)) 675.11/183.36 , 24: appendreverse#1^#(nil(), @sofar) -> c_4() 675.11/183.36 , 25: computeLine#1^#(nil(), @acc, @m) -> c_6() 675.11/183.36 , 26: computeLine#2^#(nil(), @acc, @x, @xs) -> c_34() 675.11/183.36 , 27: bftMult'#3^#(nil(), @acc, @queue) -> c_8() 675.11/183.36 , 28: matrixMult#1^#(nil(), @m2) -> c_11() 675.11/183.36 , 29: lineMult#1^#(nil(), @l2, @n) -> c_32() 675.11/183.36 , 30: *^#(@x, @y) -> c_28(#mult^#(@x, @y)) 675.11/183.36 , 31: +^#(@x, @y) -> c_25(#add^#(@x, @y)) 675.11/183.36 , 32: dequeue#1^#(::(@t, @ts), @inq) -> c_24() 675.11/183.36 , 33: dequeue#2^#(nil()) -> c_30() 675.11/183.36 , 34: dequeue#2^#(::(@t, @ts)) -> c_31() 675.11/183.36 , 35: #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y)) 675.11/183.36 , 36: #add^#(#pos(#s(#s(@x))), @y) -> 675.11/183.36 c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.36 , 37: #add^#(#0(), @y) -> c_40() 675.11/183.36 , 38: #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y)) 675.11/183.36 , 39: #add^#(#neg(#s(#s(@x))), @y) -> 675.11/183.36 c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.36 , 40: enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() 675.11/183.36 , 41: #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y)) 675.11/183.36 , 42: #mult^#(#pos(@x), #0()) -> c_44() 675.11/183.36 , 43: #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y)) 675.11/183.36 , 44: #mult^#(#0(), #pos(@y)) -> c_46() 675.11/183.36 , 45: #mult^#(#0(), #0()) -> c_47() 675.11/183.36 , 46: #mult^#(#0(), #neg(@y)) -> c_48() 675.11/183.36 , 47: #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y)) 675.11/183.36 , 48: #mult^#(#neg(@x), #0()) -> c_50() 675.11/183.36 , 49: #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y)) 675.11/183.36 , 50: #natmult^#(#0(), @y) -> c_36() 675.11/183.36 , 51: #natmult^#(#s(@x), @y) -> 675.11/183.36 c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y)) 675.11/183.36 , 52: #succ^#(#pos(#s(@x))) -> c_52() 675.11/183.36 , 53: #succ^#(#0()) -> c_53() 675.11/183.36 , 54: #succ^#(#neg(#s(#0()))) -> c_54() 675.11/183.36 , 55: #succ^#(#neg(#s(#s(@x)))) -> c_55() 675.11/183.36 , 56: #pred^#(#pos(#s(#0()))) -> c_56() 675.11/183.36 , 57: #pred^#(#pos(#s(#s(@x)))) -> c_57() 675.11/183.36 , 58: #pred^#(#0()) -> c_58() 675.11/183.36 , 59: #pred^#(#neg(#s(@x))) -> c_59() } 675.11/183.36 675.11/183.36 We are left with following problem, upon which TcT provides the 675.11/183.36 certificate YES(O(1),O(n^3)). 675.11/183.36 675.11/183.36 Strict DPs: 675.11/183.36 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.36 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.36 , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq)) 675.11/183.36 , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil())) 675.11/183.36 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.36 c_10(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.36 , bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.36 c_3(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.36 matrixMult^#(@acc, @y)) 675.11/183.36 , bftMult'^#(@queue, @acc) -> 675.11/183.36 c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.36 , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2)) 675.11/183.36 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.36 c_5(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.36 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.36 c_7(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.36 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.36 c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.36 lineMult^#(@x, @l, @acc)) 675.11/183.36 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.36 c_9(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.36 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.36 c_21(bftMult'^#(@queue, @acc)) 675.11/183.36 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.36 c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y), 675.11/183.36 enqueue^#(@t2, enqueue(@t1, @queue)), 675.11/183.36 enqueue^#(@t1, @queue)) 675.11/183.36 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.36 c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.36 , computeLine^#(@line, @m, @acc) -> 675.11/183.36 c_20(computeLine#1^#(@line, @acc, @m)) 675.11/183.36 , bftMult^#(@t, @acc) -> 675.11/183.36 c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.36 , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n)) 675.11/183.36 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.36 c_33(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.36 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.36 c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil())) 675.11/183.36 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.36 c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys)) 675.11/183.36 , dequeue#1^#(nil(), @inq) -> 675.11/183.36 c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) 675.11/183.36 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.36 c_18(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.36 Weak DPs: 675.11/183.36 { appendreverse#1^#(nil(), @sofar) -> c_4() 675.11/183.36 , computeLine#1^#(nil(), @acc, @m) -> c_6() 675.11/183.36 , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34() 675.11/183.36 , bftMult'#3^#(nil(), @acc, @queue) -> c_8() 675.11/183.36 , matrixMult#1^#(nil(), @m2) -> c_11() 675.11/183.36 , lineMult#1^#(nil(), @l2, @n) -> c_32() 675.11/183.36 , *^#(@x, @y) -> c_28(#mult^#(@x, @y)) 675.11/183.36 , +^#(@x, @y) -> c_25(#add^#(@x, @y)) 675.11/183.36 , dequeue#1^#(::(@t, @ts), @inq) -> c_24() 675.11/183.36 , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t)) 675.11/183.36 , dequeue#2^#(nil()) -> c_30() 675.11/183.36 , dequeue#2^#(::(@t, @ts)) -> c_31() 675.11/183.36 , #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y)) 675.11/183.36 , #add^#(#pos(#s(#s(@x))), @y) -> 675.11/183.36 c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.36 , #add^#(#0(), @y) -> c_40() 675.11/183.36 , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y)) 675.11/183.36 , #add^#(#neg(#s(#s(@x))), @y) -> 675.11/183.36 c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.36 , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() 675.11/183.36 , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y)) 675.11/183.36 , #mult^#(#pos(@x), #0()) -> c_44() 675.11/183.36 , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y)) 675.11/183.36 , #mult^#(#0(), #pos(@y)) -> c_46() 675.11/183.36 , #mult^#(#0(), #0()) -> c_47() 675.11/183.36 , #mult^#(#0(), #neg(@y)) -> c_48() 675.11/183.36 , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y)) 675.11/183.36 , #mult^#(#neg(@x), #0()) -> c_50() 675.11/183.36 , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y)) 675.11/183.36 , #natmult^#(#0(), @y) -> c_36() 675.11/183.36 , #natmult^#(#s(@x), @y) -> 675.11/183.36 c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y)) 675.11/183.36 , #succ^#(#pos(#s(@x))) -> c_52() 675.11/183.36 , #succ^#(#0()) -> c_53() 675.11/183.36 , #succ^#(#neg(#s(#0()))) -> c_54() 675.11/183.36 , #succ^#(#neg(#s(#s(@x)))) -> c_55() 675.11/183.36 , #pred^#(#pos(#s(#0()))) -> c_56() 675.11/183.36 , #pred^#(#pos(#s(#s(@x)))) -> c_57() 675.11/183.36 , #pred^#(#0()) -> c_58() 675.11/183.36 , #pred^#(#neg(#s(@x))) -> c_59() } 675.11/183.36 Weak Trs: 675.11/183.36 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.36 dequeue(@dequeue@1, @dequeue@2) 675.11/183.36 , #natmult(#0(), @y) -> #0() 675.11/183.36 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.36 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.36 , bftMult'#5(@queue', @acc, @y) -> 675.11/183.36 bftMult'(@queue', matrixMult(@acc, @y)) 675.11/183.36 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.36 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.36 appendreverse(@as, ::(@a, @sofar)) 675.11/183.36 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.36 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.36 computeLine#2(@m, @acc, @x, @xs) 675.11/183.36 , bftMult'#3(nil(), @acc, @queue) -> @acc 675.11/183.36 , bftMult'#3(::(@t, @_@3), @acc, @queue) -> 675.11/183.36 bftMult'#4(@t, @acc, @queue) 675.11/183.36 , appendreverse(@toreverse, @sofar) -> 675.11/183.36 appendreverse#1(@toreverse, @sofar) 675.11/183.36 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.36 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.36 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.36 , bftMult(@t, @acc) -> 675.11/183.36 bftMult'(tuple#2(::(@t, nil()), nil()), @acc) 675.11/183.36 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.36 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.36 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.36 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.36 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.36 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.36 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.36 , #add(#0(), @y) -> @y 675.11/183.36 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.36 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.36 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.36 , bftMult'#1(tuple#2(@elem, @queue), @acc) -> 675.11/183.36 bftMult'#3(@elem, @acc, @queue) 675.11/183.36 , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc) 675.11/183.36 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.36 , bftMult'#4(leaf(), @acc, @queue) -> bftMult'(@queue, @acc) 675.11/183.36 , bftMult'#4(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.36 bftMult'#5(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.11/183.36 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.36 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.36 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.36 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.36 , #mult(#pos(@x), #0()) -> #0() 675.11/183.36 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.37 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.37 , #mult(#0(), #0()) -> #0() 675.11/183.37 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.37 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.37 , #mult(#neg(@x), #0()) -> #0() 675.11/183.37 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.37 , +(@x, @y) -> #add(@x, @y) 675.11/183.37 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.37 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.37 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.37 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.37 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.37 tuple#2(@outq, ::(@t, @inq)) 675.11/183.37 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.37 , *(@x, @y) -> #mult(@x, @y) 675.11/183.37 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.37 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.37 , dequeue#2(::(@t, @ts)) -> 675.11/183.37 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.37 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.37 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.37 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.37 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.37 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.37 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.37 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.37 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.37 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.37 Obligation: 675.11/183.37 innermost runtime complexity 675.11/183.37 Answer: 675.11/183.37 YES(O(1),O(n^3)) 675.11/183.37 675.11/183.37 The following weak DPs constitute a sub-graph of the DG that is 675.11/183.37 closed under successors. The DPs are removed. 675.11/183.37 675.11/183.37 { appendreverse#1^#(nil(), @sofar) -> c_4() 675.11/183.37 , computeLine#1^#(nil(), @acc, @m) -> c_6() 675.11/183.37 , computeLine#2^#(nil(), @acc, @x, @xs) -> c_34() 675.11/183.37 , bftMult'#3^#(nil(), @acc, @queue) -> c_8() 675.11/183.37 , matrixMult#1^#(nil(), @m2) -> c_11() 675.11/183.37 , lineMult#1^#(nil(), @l2, @n) -> c_32() 675.11/183.37 , *^#(@x, @y) -> c_28(#mult^#(@x, @y)) 675.11/183.37 , +^#(@x, @y) -> c_25(#add^#(@x, @y)) 675.11/183.37 , dequeue#1^#(::(@t, @ts), @inq) -> c_24() 675.11/183.37 , enqueue^#(@t, @queue) -> c_29(enqueue#1^#(@queue, @t)) 675.11/183.37 , dequeue#2^#(nil()) -> c_30() 675.11/183.37 , dequeue#2^#(::(@t, @ts)) -> c_31() 675.11/183.37 , #add^#(#pos(#s(#0())), @y) -> c_38(#succ^#(@y)) 675.11/183.37 , #add^#(#pos(#s(#s(@x))), @y) -> 675.11/183.37 c_39(#succ^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.37 , #add^#(#0(), @y) -> c_40() 675.11/183.37 , #add^#(#neg(#s(#0())), @y) -> c_41(#pred^#(@y)) 675.11/183.37 , #add^#(#neg(#s(#s(@x))), @y) -> 675.11/183.37 c_42(#pred^#(#add(#pos(#s(@x)), @y)), #add^#(#pos(#s(@x)), @y)) 675.11/183.37 , enqueue#1^#(tuple#2(@outq, @inq), @t) -> c_26() 675.11/183.37 , #mult^#(#pos(@x), #pos(@y)) -> c_43(#natmult^#(@x, @y)) 675.11/183.37 , #mult^#(#pos(@x), #0()) -> c_44() 675.11/183.37 , #mult^#(#pos(@x), #neg(@y)) -> c_45(#natmult^#(@x, @y)) 675.11/183.37 , #mult^#(#0(), #pos(@y)) -> c_46() 675.11/183.37 , #mult^#(#0(), #0()) -> c_47() 675.11/183.37 , #mult^#(#0(), #neg(@y)) -> c_48() 675.11/183.37 , #mult^#(#neg(@x), #pos(@y)) -> c_49(#natmult^#(@x, @y)) 675.11/183.37 , #mult^#(#neg(@x), #0()) -> c_50() 675.11/183.37 , #mult^#(#neg(@x), #neg(@y)) -> c_51(#natmult^#(@x, @y)) 675.11/183.37 , #natmult^#(#0(), @y) -> c_36() 675.11/183.37 , #natmult^#(#s(@x), @y) -> 675.11/183.37 c_37(#add^#(#pos(@y), #natmult(@x, @y)), #natmult^#(@x, @y)) 675.11/183.37 , #succ^#(#pos(#s(@x))) -> c_52() 675.11/183.37 , #succ^#(#0()) -> c_53() 675.11/183.37 , #succ^#(#neg(#s(#0()))) -> c_54() 675.11/183.37 , #succ^#(#neg(#s(#s(@x)))) -> c_55() 675.11/183.37 , #pred^#(#pos(#s(#0()))) -> c_56() 675.11/183.37 , #pred^#(#pos(#s(#s(@x)))) -> c_57() 675.11/183.37 , #pred^#(#0()) -> c_58() 675.11/183.37 , #pred^#(#neg(#s(@x))) -> c_59() } 675.11/183.37 675.11/183.37 We are left with following problem, upon which TcT provides the 675.11/183.37 certificate YES(O(1),O(n^3)). 675.11/183.37 675.11/183.37 Strict DPs: 675.11/183.37 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.37 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.37 , dequeue^#(@outq, @inq) -> c_17(dequeue#1^#(@outq, @inq)) 675.11/183.37 , reverse^#(@xs) -> c_2(appendreverse^#(@xs, nil())) 675.11/183.37 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.37 c_10(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.37 , bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.37 c_3(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.37 matrixMult^#(@acc, @y)) 675.11/183.37 , bftMult'^#(@queue, @acc) -> 675.11/183.37 c_19(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.37 , matrixMult^#(@m1, @m2) -> c_27(matrixMult#1^#(@m1, @m2)) 675.11/183.37 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.37 c_5(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.37 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.37 c_7(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.37 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.37 c_35(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.37 lineMult^#(@x, @l, @acc)) 675.11/183.37 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.37 c_9(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.37 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.37 c_21(bftMult'^#(@queue, @acc)) 675.11/183.37 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.37 c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y), 675.11/183.37 enqueue^#(@t2, enqueue(@t1, @queue)), 675.11/183.37 enqueue^#(@t1, @queue)) 675.11/183.37 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.37 c_12(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.37 , computeLine^#(@line, @m, @acc) -> 675.11/183.37 c_20(computeLine#1^#(@line, @acc, @m)) 675.11/183.37 , bftMult^#(@t, @acc) -> 675.11/183.37 c_13(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.37 , lineMult^#(@n, @l1, @l2) -> c_14(lineMult#1^#(@l1, @l2, @n)) 675.11/183.37 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.37 c_33(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.37 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.37 c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil())) 675.11/183.37 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.37 c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys)) 675.11/183.37 , dequeue#1^#(nil(), @inq) -> 675.11/183.37 c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) 675.11/183.37 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.37 c_18(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.37 Weak Trs: 675.11/183.37 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.37 dequeue(@dequeue@1, @dequeue@2) 675.11/183.37 , #natmult(#0(), @y) -> #0() 675.11/183.37 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.37 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.37 , bftMult'#5(@queue', @acc, @y) -> 675.11/183.37 bftMult'(@queue', matrixMult(@acc, @y)) 675.11/183.37 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.37 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.37 appendreverse(@as, ::(@a, @sofar)) 675.11/183.37 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.37 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.37 computeLine#2(@m, @acc, @x, @xs) 675.11/183.37 , bftMult'#3(nil(), @acc, @queue) -> @acc 675.11/183.37 , bftMult'#3(::(@t, @_@3), @acc, @queue) -> 675.11/183.37 bftMult'#4(@t, @acc, @queue) 675.11/183.37 , appendreverse(@toreverse, @sofar) -> 675.11/183.37 appendreverse#1(@toreverse, @sofar) 675.11/183.37 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.37 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.37 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.37 , bftMult(@t, @acc) -> 675.11/183.37 bftMult'(tuple#2(::(@t, nil()), nil()), @acc) 675.11/183.37 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.37 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.37 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.37 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.37 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.37 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.37 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.37 , #add(#0(), @y) -> @y 675.11/183.37 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.37 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.37 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.37 , bftMult'#1(tuple#2(@elem, @queue), @acc) -> 675.11/183.37 bftMult'#3(@elem, @acc, @queue) 675.11/183.37 , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc) 675.11/183.37 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.37 , bftMult'#4(leaf(), @acc, @queue) -> bftMult'(@queue, @acc) 675.11/183.37 , bftMult'#4(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.37 bftMult'#5(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.11/183.37 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.37 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.37 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.37 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.37 , #mult(#pos(@x), #0()) -> #0() 675.11/183.37 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.37 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.37 , #mult(#0(), #0()) -> #0() 675.11/183.37 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.37 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.37 , #mult(#neg(@x), #0()) -> #0() 675.11/183.37 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.37 , +(@x, @y) -> #add(@x, @y) 675.11/183.37 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.37 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.37 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.37 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.37 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.37 tuple#2(@outq, ::(@t, @inq)) 675.11/183.37 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.37 , *(@x, @y) -> #mult(@x, @y) 675.11/183.37 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.37 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.37 , dequeue#2(::(@t, @ts)) -> 675.11/183.37 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.37 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.37 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.37 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.37 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.37 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.37 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.37 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.37 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.37 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.37 Obligation: 675.11/183.37 innermost runtime complexity 675.11/183.37 Answer: 675.11/183.37 YES(O(1),O(n^3)) 675.11/183.37 675.11/183.37 Due to missing edges in the dependency-graph, the right-hand sides 675.11/183.37 of following rules could be simplified: 675.11/183.37 675.11/183.37 { bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.37 c_22(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y), 675.11/183.37 enqueue^#(@t2, enqueue(@t1, @queue)), 675.11/183.37 enqueue^#(@t1, @queue)) 675.11/183.37 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.37 c_15(*^#(@x, @n), lineMult^#(@n, @xs, nil())) 675.11/183.37 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.37 c_16(+^#(*(@x, @n), @y), *^#(@x, @n), lineMult^#(@n, @xs, @ys)) 675.11/183.37 , dequeue#1^#(nil(), @inq) -> 675.11/183.37 c_23(dequeue#2^#(reverse(@inq)), reverse^#(@inq)) } 675.11/183.37 675.11/183.37 We are left with following problem, upon which TcT provides the 675.11/183.37 certificate YES(O(1),O(n^3)). 675.11/183.37 675.11/183.37 Strict DPs: 675.11/183.37 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.37 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.37 , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.11/183.37 , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.11/183.37 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.37 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.37 , bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.37 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.37 matrixMult^#(@acc, @y)) 675.11/183.37 , bftMult'^#(@queue, @acc) -> 675.11/183.37 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.37 , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.11/183.37 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.37 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.37 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.37 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.37 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.37 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.37 lineMult^#(@x, @l, @acc)) 675.11/183.37 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.37 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.37 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.37 c_12(bftMult'^#(@queue, @acc)) 675.11/183.37 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.37 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.37 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.37 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.37 , computeLine^#(@line, @m, @acc) -> 675.11/183.37 c_15(computeLine#1^#(@line, @acc, @m)) 675.11/183.37 , bftMult^#(@t, @acc) -> 675.11/183.37 c_16(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.37 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.11/183.37 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.37 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.37 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.37 c_19(lineMult^#(@n, @xs, nil())) 675.11/183.37 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.37 c_20(lineMult^#(@n, @xs, @ys)) 675.11/183.37 , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) 675.11/183.37 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.37 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.37 Weak Trs: 675.11/183.37 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.37 dequeue(@dequeue@1, @dequeue@2) 675.11/183.37 , #natmult(#0(), @y) -> #0() 675.11/183.37 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.37 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.37 , bftMult'#5(@queue', @acc, @y) -> 675.11/183.37 bftMult'(@queue', matrixMult(@acc, @y)) 675.11/183.37 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.37 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.37 appendreverse(@as, ::(@a, @sofar)) 675.11/183.37 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.37 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.37 computeLine#2(@m, @acc, @x, @xs) 675.11/183.37 , bftMult'#3(nil(), @acc, @queue) -> @acc 675.11/183.37 , bftMult'#3(::(@t, @_@3), @acc, @queue) -> 675.11/183.37 bftMult'#4(@t, @acc, @queue) 675.11/183.37 , appendreverse(@toreverse, @sofar) -> 675.11/183.37 appendreverse#1(@toreverse, @sofar) 675.11/183.37 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.37 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.37 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.37 , bftMult(@t, @acc) -> 675.11/183.37 bftMult'(tuple#2(::(@t, nil()), nil()), @acc) 675.11/183.37 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.37 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.37 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.37 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.37 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.37 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.37 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.37 , #add(#0(), @y) -> @y 675.11/183.37 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.37 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.37 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.37 , bftMult'#1(tuple#2(@elem, @queue), @acc) -> 675.11/183.37 bftMult'#3(@elem, @acc, @queue) 675.11/183.37 , bftMult'(@queue, @acc) -> bftMult'#1(bftMult'#2(@queue), @acc) 675.11/183.37 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.37 , bftMult'#4(leaf(), @acc, @queue) -> bftMult'(@queue, @acc) 675.11/183.37 , bftMult'#4(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.37 bftMult'#5(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.11/183.37 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.37 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.37 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.37 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.37 , #mult(#pos(@x), #0()) -> #0() 675.11/183.37 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.37 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.37 , #mult(#0(), #0()) -> #0() 675.11/183.37 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.37 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.37 , #mult(#neg(@x), #0()) -> #0() 675.11/183.37 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.37 , +(@x, @y) -> #add(@x, @y) 675.11/183.37 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.37 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.37 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.37 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.37 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.37 tuple#2(@outq, ::(@t, @inq)) 675.11/183.37 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.37 , *(@x, @y) -> #mult(@x, @y) 675.11/183.37 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.37 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.37 , dequeue#2(::(@t, @ts)) -> 675.11/183.37 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.37 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.37 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.37 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.37 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.37 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.37 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.37 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.37 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.37 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.37 Obligation: 675.11/183.37 innermost runtime complexity 675.11/183.37 Answer: 675.11/183.37 YES(O(1),O(n^3)) 675.11/183.37 675.11/183.37 We replace rewrite rules by usable rules: 675.11/183.37 675.11/183.37 Weak Usable Rules: 675.11/183.37 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.37 dequeue(@dequeue@1, @dequeue@2) 675.11/183.37 , #natmult(#0(), @y) -> #0() 675.11/183.37 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.37 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.37 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.37 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.37 appendreverse(@as, ::(@a, @sofar)) 675.11/183.37 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.37 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.37 computeLine#2(@m, @acc, @x, @xs) 675.11/183.37 , appendreverse(@toreverse, @sofar) -> 675.11/183.37 appendreverse#1(@toreverse, @sofar) 675.11/183.37 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.37 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.37 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.37 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.37 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.37 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.37 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.37 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.37 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.37 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.37 , #add(#0(), @y) -> @y 675.11/183.37 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.37 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.37 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.37 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.37 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.37 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.37 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.37 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.37 , #mult(#pos(@x), #0()) -> #0() 675.11/183.37 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.37 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.37 , #mult(#0(), #0()) -> #0() 675.11/183.37 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.37 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.37 , #mult(#neg(@x), #0()) -> #0() 675.11/183.37 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.37 , +(@x, @y) -> #add(@x, @y) 675.11/183.37 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.37 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.37 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.37 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.37 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.37 tuple#2(@outq, ::(@t, @inq)) 675.11/183.37 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.37 , *(@x, @y) -> #mult(@x, @y) 675.11/183.37 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.37 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.37 , dequeue#2(::(@t, @ts)) -> 675.11/183.37 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.37 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.37 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.37 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.37 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.37 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.37 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.37 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.37 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.37 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.37 675.11/183.37 We are left with following problem, upon which TcT provides the 675.11/183.37 certificate YES(O(1),O(n^3)). 675.11/183.37 675.11/183.37 Strict DPs: 675.11/183.37 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.37 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.37 , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.11/183.37 , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.11/183.37 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.37 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.37 , bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.37 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.37 matrixMult^#(@acc, @y)) 675.11/183.37 , bftMult'^#(@queue, @acc) -> 675.11/183.37 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.37 , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.11/183.37 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.37 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.37 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.37 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.37 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.37 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.37 lineMult^#(@x, @l, @acc)) 675.11/183.37 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.37 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.37 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.37 c_12(bftMult'^#(@queue, @acc)) 675.11/183.37 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.37 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.37 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.37 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.37 , computeLine^#(@line, @m, @acc) -> 675.11/183.38 c_15(computeLine#1^#(@line, @acc, @m)) 675.11/183.38 , bftMult^#(@t, @acc) -> 675.11/183.38 c_16(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.38 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.11/183.38 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.38 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.38 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.38 c_19(lineMult^#(@n, @xs, nil())) 675.11/183.38 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.38 c_20(lineMult^#(@n, @xs, @ys)) 675.11/183.38 , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) 675.11/183.38 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.38 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.38 Weak Trs: 675.11/183.38 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.38 dequeue(@dequeue@1, @dequeue@2) 675.11/183.38 , #natmult(#0(), @y) -> #0() 675.11/183.38 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.38 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.38 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.38 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.38 appendreverse(@as, ::(@a, @sofar)) 675.11/183.38 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.38 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.38 computeLine#2(@m, @acc, @x, @xs) 675.11/183.38 , appendreverse(@toreverse, @sofar) -> 675.11/183.38 appendreverse#1(@toreverse, @sofar) 675.11/183.38 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.38 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.38 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.38 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.38 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.38 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.38 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.38 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.38 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.38 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.38 , #add(#0(), @y) -> @y 675.11/183.38 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.38 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.38 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.38 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.38 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.38 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.38 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.38 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.38 , #mult(#pos(@x), #0()) -> #0() 675.11/183.38 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.38 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.38 , #mult(#0(), #0()) -> #0() 675.11/183.38 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.38 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.38 , #mult(#neg(@x), #0()) -> #0() 675.11/183.38 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.38 , +(@x, @y) -> #add(@x, @y) 675.11/183.38 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.38 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.38 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.38 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.38 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.38 tuple#2(@outq, ::(@t, @inq)) 675.11/183.38 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.38 , *(@x, @y) -> #mult(@x, @y) 675.11/183.38 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.38 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.38 , dequeue#2(::(@t, @ts)) -> 675.11/183.38 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.38 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.38 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.38 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.38 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.38 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.38 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.38 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.38 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.38 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.38 Obligation: 675.11/183.38 innermost runtime complexity 675.11/183.38 Answer: 675.11/183.38 YES(O(1),O(n^3)) 675.11/183.38 675.11/183.38 Consider the dependency graph 675.11/183.38 675.11/183.38 1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.38 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.38 -->_1 dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) :2 675.11/183.38 675.11/183.38 2: dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.11/183.38 -->_1 dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) :21 675.11/183.38 675.11/183.38 3: reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.11/183.38 -->_1 appendreverse^#(@toreverse, @sofar) -> 675.11/183.38 c_4(appendreverse#1^#(@toreverse, @sofar)) :4 675.11/183.38 675.11/183.38 4: appendreverse^#(@toreverse, @sofar) -> 675.11/183.38 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.38 -->_1 appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.38 c_8(appendreverse^#(@as, ::(@a, @sofar))) :8 675.11/183.38 675.11/183.38 5: bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.38 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.38 matrixMult^#(@acc, @y)) 675.11/183.38 -->_2 matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) :7 675.11/183.38 -->_1 bftMult'^#(@queue, @acc) -> 675.11/183.38 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), 675.11/183.38 bftMult'#2^#(@queue)) :6 675.11/183.38 675.11/183.38 6: bftMult'^#(@queue, @acc) -> 675.11/183.38 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.38 -->_1 bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.38 c_22(bftMult'#3^#(@elem, @acc, @queue)) :22 675.11/183.38 -->_2 bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.38 c_1(dequeue^#(@dequeue@1, @dequeue@2)) :1 675.11/183.38 675.11/183.38 7: matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.11/183.38 -->_1 matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.38 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) :14 675.11/183.38 675.11/183.38 8: appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.38 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.38 -->_1 appendreverse^#(@toreverse, @sofar) -> 675.11/183.38 c_4(appendreverse#1^#(@toreverse, @sofar)) :4 675.11/183.38 675.11/183.38 9: computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.38 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.38 -->_1 computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.38 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.38 lineMult^#(@x, @l, @acc)) :10 675.11/183.38 675.11/183.38 10: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.38 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.38 lineMult^#(@x, @l, @acc)) 675.11/183.38 -->_2 lineMult^#(@n, @l1, @l2) -> 675.11/183.38 c_17(lineMult#1^#(@l1, @l2, @n)) :17 675.11/183.38 -->_1 computeLine^#(@line, @m, @acc) -> 675.11/183.38 c_15(computeLine#1^#(@line, @acc, @m)) :15 675.11/183.38 675.11/183.38 11: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.38 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.38 -->_1 bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.38 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), 675.11/183.38 @acc, 675.11/183.38 @y)) :13 675.11/183.38 -->_1 bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.38 c_12(bftMult'^#(@queue, @acc)) :12 675.11/183.38 675.11/183.38 12: bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.38 c_12(bftMult'^#(@queue, @acc)) 675.11/183.38 -->_1 bftMult'^#(@queue, @acc) -> 675.11/183.38 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), 675.11/183.38 bftMult'#2^#(@queue)) :6 675.11/183.38 675.11/183.38 13: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.38 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.38 -->_1 bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.38 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.38 matrixMult^#(@acc, @y)) :5 675.11/183.38 675.11/183.38 14: matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.38 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.38 -->_1 computeLine^#(@line, @m, @acc) -> 675.11/183.38 c_15(computeLine#1^#(@line, @acc, @m)) :15 675.11/183.38 -->_2 matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) :7 675.11/183.38 675.11/183.38 15: computeLine^#(@line, @m, @acc) -> 675.11/183.38 c_15(computeLine#1^#(@line, @acc, @m)) 675.11/183.38 -->_1 computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.38 c_9(computeLine#2^#(@m, @acc, @x, @xs)) :9 675.11/183.38 675.11/183.38 16: bftMult^#(@t, @acc) -> 675.11/183.38 c_16(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) 675.11/183.38 -->_1 bftMult'^#(@queue, @acc) -> 675.11/183.38 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), 675.11/183.38 bftMult'#2^#(@queue)) :6 675.11/183.38 675.11/183.38 17: lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.11/183.38 -->_1 lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.38 c_18(lineMult#2^#(@l2, @n, @x, @xs)) :18 675.11/183.38 675.11/183.38 18: lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.38 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.38 -->_1 lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.38 c_20(lineMult^#(@n, @xs, @ys)) :20 675.11/183.38 -->_1 lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.38 c_19(lineMult^#(@n, @xs, nil())) :19 675.11/183.38 675.11/183.38 19: lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.38 c_19(lineMult^#(@n, @xs, nil())) 675.11/183.38 -->_1 lineMult^#(@n, @l1, @l2) -> 675.11/183.38 c_17(lineMult#1^#(@l1, @l2, @n)) :17 675.11/183.38 675.11/183.38 20: lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.38 c_20(lineMult^#(@n, @xs, @ys)) 675.11/183.38 -->_1 lineMult^#(@n, @l1, @l2) -> 675.11/183.38 c_17(lineMult#1^#(@l1, @l2, @n)) :17 675.11/183.38 675.11/183.38 21: dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) 675.11/183.38 -->_1 reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) :3 675.11/183.38 675.11/183.38 22: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.38 c_22(bftMult'#3^#(@elem, @acc, @queue)) 675.11/183.38 -->_1 bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.38 c_11(bftMult'#4^#(@t, @acc, @queue)) :11 675.11/183.38 675.11/183.38 675.11/183.38 Following roots of the dependency graph are removed, as the 675.11/183.38 considered set of starting terms is closed under reduction with 675.11/183.38 respect to these rules (modulo compound contexts). 675.11/183.38 675.11/183.38 { bftMult^#(@t, @acc) -> 675.11/183.38 c_16(bftMult'^#(tuple#2(::(@t, nil()), nil()), @acc)) } 675.11/183.38 675.11/183.38 675.11/183.38 We are left with following problem, upon which TcT provides the 675.11/183.38 certificate YES(O(1),O(n^3)). 675.11/183.38 675.11/183.38 Strict DPs: 675.11/183.38 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.38 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.38 , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.11/183.38 , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.11/183.38 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.38 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.38 , bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.38 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.38 matrixMult^#(@acc, @y)) 675.11/183.38 , bftMult'^#(@queue, @acc) -> 675.11/183.38 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.38 , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.11/183.38 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.38 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.38 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.38 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.38 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.38 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.38 lineMult^#(@x, @l, @acc)) 675.11/183.38 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.38 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.38 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.38 c_12(bftMult'^#(@queue, @acc)) 675.11/183.38 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.38 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.38 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.38 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.38 , computeLine^#(@line, @m, @acc) -> 675.11/183.38 c_15(computeLine#1^#(@line, @acc, @m)) 675.11/183.38 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.11/183.38 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.38 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.38 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.38 c_19(lineMult^#(@n, @xs, nil())) 675.11/183.38 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.38 c_20(lineMult^#(@n, @xs, @ys)) 675.11/183.38 , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) 675.11/183.38 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.38 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.38 Weak Trs: 675.11/183.38 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.38 dequeue(@dequeue@1, @dequeue@2) 675.11/183.38 , #natmult(#0(), @y) -> #0() 675.11/183.38 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.38 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.38 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.38 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.38 appendreverse(@as, ::(@a, @sofar)) 675.11/183.38 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.38 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.38 computeLine#2(@m, @acc, @x, @xs) 675.11/183.38 , appendreverse(@toreverse, @sofar) -> 675.11/183.38 appendreverse#1(@toreverse, @sofar) 675.11/183.38 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.38 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.38 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.38 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.38 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.38 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.38 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.38 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.38 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.38 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.38 , #add(#0(), @y) -> @y 675.11/183.38 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.38 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.38 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.38 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.38 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.38 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.38 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.38 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.38 , #mult(#pos(@x), #0()) -> #0() 675.11/183.38 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.38 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.38 , #mult(#0(), #0()) -> #0() 675.11/183.38 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.38 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.38 , #mult(#neg(@x), #0()) -> #0() 675.11/183.38 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.38 , +(@x, @y) -> #add(@x, @y) 675.11/183.38 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.38 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.38 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.38 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.38 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.38 tuple#2(@outq, ::(@t, @inq)) 675.11/183.38 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.38 , *(@x, @y) -> #mult(@x, @y) 675.11/183.38 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.38 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.38 , dequeue#2(::(@t, @ts)) -> 675.11/183.38 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.38 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.38 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.38 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.38 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.38 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.38 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.38 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.38 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.38 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.38 Obligation: 675.11/183.38 innermost runtime complexity 675.11/183.38 Answer: 675.11/183.38 YES(O(1),O(n^3)) 675.11/183.38 675.11/183.38 We decompose the input problem according to the dependency graph 675.11/183.38 into the upper component 675.11/183.38 675.11/183.38 { bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.38 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.38 matrixMult^#(@acc, @y)) 675.11/183.38 , bftMult'^#(@queue, @acc) -> 675.11/183.38 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.38 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.38 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.38 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.38 c_12(bftMult'^#(@queue, @acc)) 675.11/183.38 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.38 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.38 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.38 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.38 675.11/183.38 and lower component 675.11/183.38 675.11/183.38 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.38 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.11/183.38 , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.11/183.38 , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.11/183.38 , appendreverse^#(@toreverse, @sofar) -> 675.11/183.38 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.11/183.38 , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.11/183.38 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.11/183.38 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.11/183.38 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.11/183.38 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.11/183.38 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.38 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.11/183.38 lineMult^#(@x, @l, @acc)) 675.11/183.38 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.11/183.38 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.11/183.38 , computeLine^#(@line, @m, @acc) -> 675.11/183.38 c_15(computeLine#1^#(@line, @acc, @m)) 675.11/183.38 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.11/183.38 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.11/183.38 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.11/183.38 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.11/183.38 c_19(lineMult^#(@n, @xs, nil())) 675.11/183.38 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.11/183.38 c_20(lineMult^#(@n, @xs, @ys)) 675.11/183.38 , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) } 675.11/183.38 675.11/183.38 Further, following extension rules are added to the lower 675.11/183.38 component. 675.11/183.38 675.11/183.38 { bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.38 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.11/183.38 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.11/183.38 , bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue) 675.11/183.38 , bftMult'^#(@queue, @acc) -> 675.11/183.38 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.11/183.38 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.38 bftMult'#4^#(@t, @acc, @queue) 675.11/183.38 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.11/183.38 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.38 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.11/183.38 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.38 bftMult'#3^#(@elem, @acc, @queue) } 675.11/183.38 675.11/183.38 TcT solves the upper component with certificate YES(O(1),O(n^1)). 675.11/183.38 675.11/183.38 Sub-proof: 675.11/183.38 ---------- 675.11/183.38 We are left with following problem, upon which TcT provides the 675.11/183.38 certificate YES(O(1),O(n^1)). 675.11/183.38 675.11/183.38 Strict DPs: 675.11/183.38 { bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.38 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.38 matrixMult^#(@acc, @y)) 675.11/183.38 , bftMult'^#(@queue, @acc) -> 675.11/183.38 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.38 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.38 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.38 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.38 c_12(bftMult'^#(@queue, @acc)) 675.11/183.38 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.38 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.38 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.38 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.38 Weak Trs: 675.11/183.38 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.38 dequeue(@dequeue@1, @dequeue@2) 675.11/183.38 , #natmult(#0(), @y) -> #0() 675.11/183.38 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.38 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.38 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.38 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.38 appendreverse(@as, ::(@a, @sofar)) 675.11/183.38 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.38 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.38 computeLine#2(@m, @acc, @x, @xs) 675.11/183.38 , appendreverse(@toreverse, @sofar) -> 675.11/183.38 appendreverse#1(@toreverse, @sofar) 675.11/183.38 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.38 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.38 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.38 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.38 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.38 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.38 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.38 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.38 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.38 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.38 , #add(#0(), @y) -> @y 675.11/183.38 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.38 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.38 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.38 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.38 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.38 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.38 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.38 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.38 , #mult(#pos(@x), #0()) -> #0() 675.11/183.38 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.38 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.38 , #mult(#0(), #0()) -> #0() 675.11/183.38 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.38 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.38 , #mult(#neg(@x), #0()) -> #0() 675.11/183.38 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.38 , +(@x, @y) -> #add(@x, @y) 675.11/183.38 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.38 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.38 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.38 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.38 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.38 tuple#2(@outq, ::(@t, @inq)) 675.11/183.38 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.38 , *(@x, @y) -> #mult(@x, @y) 675.11/183.38 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.38 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.38 , dequeue#2(::(@t, @ts)) -> 675.11/183.38 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.38 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.38 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.38 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.38 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.38 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.38 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.38 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.38 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.38 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.38 Obligation: 675.11/183.38 innermost runtime complexity 675.11/183.38 Answer: 675.11/183.38 YES(O(1),O(n^1)) 675.11/183.38 675.11/183.38 We use the processor 'matrix interpretation of dimension 1' to 675.11/183.38 orient following rules strictly. 675.11/183.38 675.11/183.38 DPs: 675.11/183.38 { 3: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.38 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.38 , 4: bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.38 c_12(bftMult'^#(@queue, @acc)) 675.11/183.38 , 6: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.38 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.38 675.11/183.38 Sub-proof: 675.11/183.38 ---------- 675.11/183.38 The following argument positions are usable: 675.11/183.38 Uargs(c_5) = {1}, Uargs(c_6) = {1}, Uargs(c_11) = {1}, 675.11/183.38 Uargs(c_12) = {1}, Uargs(c_13) = {1}, Uargs(c_22) = {1} 675.11/183.38 675.11/183.38 TcT has computed the following constructor-based matrix 675.11/183.38 interpretation satisfying not(EDA). 675.11/183.38 675.11/183.38 [bftMult'#2](x1) = [1] x1 + [1] 675.11/183.38 675.11/183.38 [#natmult](x1, x2) = [0] 675.11/183.38 675.11/183.38 [reverse](x1) = [1] x1 + [0] 675.11/183.38 675.11/183.38 [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.11/183.38 675.11/183.38 [computeLine#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.11/183.38 675.11/183.38 [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] 675.11/183.38 675.11/183.38 [matrixMult#1](x1, x2) = [4] x2 + [0] 675.11/183.38 675.11/183.38 [leaf] = [2] 675.11/183.38 675.11/183.38 [lineMult](x1, x2, x3) = [0] 675.11/183.38 675.11/183.38 [lineMult#2](x1, x2, x3, x4) = [2] x4 + [0] 675.11/183.38 675.11/183.38 [#pos](x1) = [0] 675.11/183.38 675.11/183.38 [#add](x1, x2) = [0] 675.11/183.38 675.11/183.38 [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [3] 675.11/183.38 675.11/183.38 [dequeue](x1, x2) = [1] x1 + [1] x2 + [2] 675.11/183.38 675.11/183.38 [tuple#2](x1, x2) = [1] x1 + [1] x2 + [1] 675.11/183.38 675.11/183.38 [nil] = [0] 675.11/183.38 675.11/183.38 [computeLine](x1, x2, x3) = [4] x1 + [0] 675.11/183.38 675.11/183.38 [dequeue#1](x1, x2) = [1] x1 + [1] x2 + [2] 675.11/183.38 675.11/183.38 [::](x1, x2) = [1] x1 + [1] x2 + [1] 675.11/183.38 675.11/183.38 [#mult](x1, x2) = [0] 675.11/183.38 675.11/183.38 [+](x1, x2) = [4] x2 + [0] 675.11/183.38 675.11/183.38 [#succ](x1) = [0] 675.11/183.38 675.11/183.38 [#0] = [0] 675.11/183.38 675.11/183.38 [enqueue#1](x1, x2) = [1] x1 + [1] x2 + [1] 675.11/183.38 675.11/183.38 [#neg](x1) = [0] 675.11/183.38 675.11/183.38 [matrixMult](x1, x2) = [0] 675.11/183.39 675.11/183.39 [*](x1, x2) = [0] 675.11/183.39 675.11/183.39 [enqueue](x1, x2) = [1] x1 + [1] x2 + [1] 675.11/183.39 675.11/183.39 [dequeue#2](x1) = [1] x1 + [2] 675.11/183.39 675.11/183.39 [#pred](x1) = [0] 675.11/183.39 675.11/183.39 [lineMult#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.11/183.39 675.11/183.39 [#s](x1) = [0] 675.11/183.39 675.11/183.39 [computeLine#2](x1, x2, x3, x4) = [4] x2 + [4] x3 + [4] x4 + [0] 675.11/183.39 675.11/183.39 [bftMult'#2^#](x1) = [7] x1 + [7] 675.11/183.39 675.11/183.39 [bftMult'#5^#](x1, x2, x3) = [4] x1 + [4] 675.11/183.39 675.11/183.39 [bftMult'^#](x1, x2) = [4] x1 + [4] 675.11/183.39 675.11/183.39 [matrixMult^#](x1, x2) = [7] x1 + [7] x2 + [7] 675.11/183.39 675.11/183.39 [bftMult'#3^#](x1, x2, x3) = [4] x1 + [4] x3 + [0] 675.11/183.39 675.11/183.39 [bftMult'#4^#](x1, x2, x3) = [4] x1 + [4] x3 + [0] 675.11/183.39 675.11/183.39 [bftMult'#1^#](x1, x2) = [4] x1 + [0] 675.11/183.39 675.11/183.39 [c_5](x1, x2) = [1] x1 + [0] 675.11/183.39 675.11/183.39 [c_6](x1, x2) = [1] x1 + [0] 675.11/183.39 675.11/183.39 [c_11](x1) = [1] x1 + [3] 675.11/183.39 675.11/183.39 [c_12](x1) = [1] x1 + [3] 675.11/183.39 675.11/183.39 [c_13](x1) = [1] x1 + [0] 675.11/183.39 675.11/183.39 [c_22](x1) = [1] x1 + [1] 675.11/183.39 675.11/183.39 The order satisfies the following ordering constraints: 675.11/183.39 675.11/183.39 [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] = [1] @dequeue@1 + [1] @dequeue@2 + [2] 675.11/183.39 >= [1] @dequeue@1 + [1] @dequeue@2 + [2] 675.11/183.39 = [dequeue(@dequeue@1, @dequeue@2)] 675.11/183.39 675.11/183.39 [#natmult(#0(), @y)] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#0()] 675.11/183.39 675.11/183.39 [#natmult(#s(@x), @y)] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#add(#pos(@y), #natmult(@x, @y))] 675.11/183.39 675.11/183.39 [reverse(@xs)] = [1] @xs + [0] 675.11/183.39 >= [1] @xs + [0] 675.11/183.39 = [appendreverse(@xs, nil())] 675.11/183.39 675.11/183.39 [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] 675.11/183.39 >= [1] @sofar + [0] 675.11/183.39 = [@sofar] 675.11/183.39 675.11/183.39 [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [1] 675.11/183.39 >= [1] @sofar + [1] @a + [1] @as + [1] 675.11/183.39 = [appendreverse(@as, ::(@a, @sofar))] 675.11/183.39 675.11/183.39 [computeLine#1(nil(), @acc, @m)] = [4] @acc + [4] @m + [0] 675.11/183.39 >= [1] @acc + [0] 675.11/183.39 = [@acc] 675.11/183.39 675.11/183.39 [computeLine#1(::(@x, @xs), @acc, @m)] = [4] @acc + [4] @m + [0] 675.11/183.39 ? [4] @x + [4] @acc + [4] @xs + [0] 675.11/183.39 = [computeLine#2(@m, @acc, @x, @xs)] 675.11/183.39 675.11/183.39 [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] 675.11/183.39 >= [1] @toreverse + [1] @sofar + [0] 675.11/183.39 = [appendreverse#1(@toreverse, @sofar)] 675.11/183.39 675.11/183.39 [matrixMult#1(nil(), @m2)] = [4] @m2 + [0] 675.11/183.39 >= [0] 675.11/183.39 = [nil()] 675.11/183.39 675.11/183.39 [matrixMult#1(::(@l, @ls), @m2)] = [4] @m2 + [0] 675.11/183.39 ? [4] @l + [1] 675.11/183.39 = [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))] 675.11/183.39 675.11/183.39 [lineMult(@n, @l1, @l2)] = [0] 675.11/183.39 ? [4] @n + [4] @l2 + [0] 675.11/183.39 = [lineMult#1(@l1, @l2, @n)] 675.11/183.39 675.11/183.39 [lineMult#2(nil(), @n, @x, @xs)] = [2] @xs + [0] 675.11/183.39 ? [1] 675.11/183.39 = [::(*(@x, @n), lineMult(@n, @xs, nil()))] 675.11/183.39 675.11/183.39 [lineMult#2(::(@y, @ys), @n, @x, @xs)] = [2] @xs + [0] 675.11/183.39 ? [4] @y + [1] 675.11/183.39 = [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))] 675.11/183.39 675.11/183.39 [#add(#pos(#s(#0())), @y)] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#succ(@y)] 675.11/183.39 675.11/183.39 [#add(#pos(#s(#s(@x))), @y)] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#succ(#add(#pos(#s(@x)), @y))] 675.11/183.39 675.11/183.39 [#add(#0(), @y)] = [0] 675.11/183.39 ? [1] @y + [0] 675.11/183.39 = [@y] 675.11/183.39 675.11/183.39 [#add(#neg(#s(#0())), @y)] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#pred(@y)] 675.11/183.39 675.11/183.39 [#add(#neg(#s(#s(@x))), @y)] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#pred(#add(#pos(#s(@x)), @y))] 675.11/183.39 675.11/183.39 [dequeue(@outq, @inq)] = [1] @outq + [1] @inq + [2] 675.11/183.39 >= [1] @outq + [1] @inq + [2] 675.11/183.39 = [dequeue#1(@outq, @inq)] 675.11/183.39 675.11/183.39 [computeLine(@line, @m, @acc)] = [4] @line + [0] 675.11/183.39 ? [4] @acc + [4] @m + [0] 675.11/183.39 = [computeLine#1(@line, @acc, @m)] 675.11/183.39 675.11/183.39 [dequeue#1(nil(), @inq)] = [1] @inq + [2] 675.11/183.39 >= [1] @inq + [2] 675.11/183.39 = [dequeue#2(reverse(@inq))] 675.11/183.39 675.11/183.39 [dequeue#1(::(@t, @ts), @inq)] = [1] @t + [1] @inq + [1] @ts + [3] 675.11/183.39 >= [1] @t + [1] @inq + [1] @ts + [3] 675.11/183.39 = [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))] 675.11/183.39 675.11/183.39 [#mult(#pos(@x), #pos(@y))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#pos(#natmult(@x, @y))] 675.11/183.39 675.11/183.39 [#mult(#pos(@x), #0())] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#0()] 675.11/183.39 675.11/183.39 [#mult(#pos(@x), #neg(@y))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#neg(#natmult(@x, @y))] 675.11/183.39 675.11/183.39 [#mult(#0(), #pos(@y))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#0()] 675.11/183.39 675.11/183.39 [#mult(#0(), #0())] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#0()] 675.11/183.39 675.11/183.39 [#mult(#0(), #neg(@y))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#0()] 675.11/183.39 675.11/183.39 [#mult(#neg(@x), #pos(@y))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#neg(#natmult(@x, @y))] 675.11/183.39 675.11/183.39 [#mult(#neg(@x), #0())] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#0()] 675.11/183.39 675.11/183.39 [#mult(#neg(@x), #neg(@y))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#pos(#natmult(@x, @y))] 675.11/183.39 675.11/183.39 [+(@x, @y)] = [4] @y + [0] 675.11/183.39 >= [0] 675.11/183.39 = [#add(@x, @y)] 675.11/183.39 675.11/183.39 [#succ(#pos(#s(@x)))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#pos(#s(#s(@x)))] 675.11/183.39 675.11/183.39 [#succ(#0())] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#pos(#s(#0()))] 675.11/183.39 675.11/183.39 [#succ(#neg(#s(#0())))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#0()] 675.11/183.39 675.11/183.39 [#succ(#neg(#s(#s(@x))))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#neg(#s(@x))] 675.11/183.39 675.11/183.39 [enqueue#1(tuple#2(@outq, @inq), @t)] = [1] @t + [1] @outq + [1] @inq + [2] 675.11/183.39 >= [1] @t + [1] @outq + [1] @inq + [2] 675.11/183.39 = [tuple#2(@outq, ::(@t, @inq))] 675.11/183.39 675.11/183.39 [matrixMult(@m1, @m2)] = [0] 675.11/183.39 ? [4] @m2 + [0] 675.11/183.39 = [matrixMult#1(@m1, @m2)] 675.11/183.39 675.11/183.39 [*(@x, @y)] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#mult(@x, @y)] 675.11/183.39 675.11/183.39 [enqueue(@t, @queue)] = [1] @t + [1] @queue + [1] 675.11/183.39 >= [1] @t + [1] @queue + [1] 675.11/183.39 = [enqueue#1(@queue, @t)] 675.11/183.39 675.11/183.39 [dequeue#2(nil())] = [2] 675.11/183.39 >= [2] 675.11/183.39 = [tuple#2(nil(), tuple#2(nil(), nil()))] 675.11/183.39 675.11/183.39 [dequeue#2(::(@t, @ts))] = [1] @t + [1] @ts + [3] 675.11/183.39 >= [1] @t + [1] @ts + [3] 675.11/183.39 = [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))] 675.11/183.39 675.11/183.39 [#pred(#pos(#s(#0())))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#0()] 675.11/183.39 675.11/183.39 [#pred(#pos(#s(#s(@x))))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#pos(#s(@x))] 675.11/183.39 675.11/183.39 [#pred(#0())] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#neg(#s(#0()))] 675.11/183.39 675.11/183.39 [#pred(#neg(#s(@x)))] = [0] 675.11/183.39 >= [0] 675.11/183.39 = [#neg(#s(#s(@x)))] 675.11/183.39 675.11/183.39 [lineMult#1(nil(), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.11/183.39 >= [0] 675.11/183.39 = [nil()] 675.11/183.39 675.11/183.39 [lineMult#1(::(@x, @xs), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.11/183.39 ? [2] @xs + [0] 675.11/183.39 = [lineMult#2(@l2, @n, @x, @xs)] 675.11/183.39 675.11/183.39 [computeLine#2(nil(), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.11/183.39 >= [0] 675.11/183.39 = [nil()] 675.11/183.39 675.11/183.39 [computeLine#2(::(@l, @ls), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.11/183.39 >= [4] @xs + [0] 675.11/183.39 = [computeLine(@xs, @ls, lineMult(@x, @l, @acc))] 675.11/183.39 675.11/183.39 [bftMult'#5^#(@queue', @acc, @y)] = [4] @queue' + [4] 675.11/183.39 >= [4] @queue' + [4] 675.11/183.39 = [c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.39 matrixMult^#(@acc, @y))] 675.11/183.39 675.11/183.39 [bftMult'^#(@queue, @acc)] = [4] @queue + [4] 675.11/183.39 >= [4] @queue + [4] 675.11/183.39 = [c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue))] 675.11/183.39 675.11/183.39 [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] = [4] @t + [4] @queue + [4] @_@3 + [4] 675.11/183.39 > [4] @t + [4] @queue + [3] 675.11/183.39 = [c_11(bftMult'#4^#(@t, @acc, @queue))] 675.11/183.39 675.11/183.39 [bftMult'#4^#(leaf(), @acc, @queue)] = [4] @queue + [8] 675.11/183.39 > [4] @queue + [7] 675.11/183.39 = [c_12(bftMult'^#(@queue, @acc))] 675.11/183.39 675.11/183.39 [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] = [4] @y + [4] @queue + [4] @t1 + [4] @t2 + [12] 675.11/183.39 >= [4] @queue + [4] @t1 + [4] @t2 + [12] 675.11/183.39 = [c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y))] 675.11/183.39 675.11/183.39 [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] = [4] @queue + [4] @elem + [4] 675.11/183.39 > [4] @queue + [4] @elem + [1] 675.11/183.39 = [c_22(bftMult'#3^#(@elem, @acc, @queue))] 675.11/183.39 675.11/183.39 675.11/183.39 We return to the main proof. Consider the set of all dependency 675.11/183.39 pairs 675.11/183.39 675.11/183.39 : 675.11/183.39 { 1: bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.39 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.39 matrixMult^#(@acc, @y)) 675.11/183.39 , 2: bftMult'^#(@queue, @acc) -> 675.11/183.39 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.39 , 3: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.39 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.39 , 4: bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.39 c_12(bftMult'^#(@queue, @acc)) 675.11/183.39 , 5: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.39 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.39 , 6: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.39 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.39 675.11/183.39 Processor 'matrix interpretation of dimension 1' induces the 675.11/183.39 complexity certificate YES(?,O(n^1)) on application of dependency 675.11/183.39 pairs {3,4,6}. These cover all (indirect) predecessors of 675.11/183.39 dependency pairs {1,2,3,4,5,6}, their number of application is 675.11/183.39 equally bounded. The dependency pairs are shifted into the weak 675.11/183.39 component. 675.11/183.39 675.11/183.39 We are left with following problem, upon which TcT provides the 675.11/183.39 certificate YES(O(1),O(1)). 675.11/183.39 675.11/183.39 Weak DPs: 675.11/183.39 { bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.39 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.39 matrixMult^#(@acc, @y)) 675.11/183.39 , bftMult'^#(@queue, @acc) -> 675.11/183.39 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.39 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.39 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.39 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.39 c_12(bftMult'^#(@queue, @acc)) 675.11/183.39 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.39 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.39 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.39 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.39 Weak Trs: 675.11/183.39 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.39 dequeue(@dequeue@1, @dequeue@2) 675.11/183.39 , #natmult(#0(), @y) -> #0() 675.11/183.39 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.39 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.39 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.39 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.39 appendreverse(@as, ::(@a, @sofar)) 675.11/183.39 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.39 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.39 computeLine#2(@m, @acc, @x, @xs) 675.11/183.39 , appendreverse(@toreverse, @sofar) -> 675.11/183.39 appendreverse#1(@toreverse, @sofar) 675.11/183.39 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.39 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.39 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.39 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.39 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.39 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.39 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.39 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.39 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.39 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.39 , #add(#0(), @y) -> @y 675.11/183.39 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.39 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.39 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.39 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.39 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.39 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.39 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.39 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.39 , #mult(#pos(@x), #0()) -> #0() 675.11/183.39 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.39 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.39 , #mult(#0(), #0()) -> #0() 675.11/183.39 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.39 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.39 , #mult(#neg(@x), #0()) -> #0() 675.11/183.39 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.39 , +(@x, @y) -> #add(@x, @y) 675.11/183.39 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.39 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.39 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.39 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.39 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.39 tuple#2(@outq, ::(@t, @inq)) 675.11/183.39 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.39 , *(@x, @y) -> #mult(@x, @y) 675.11/183.39 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.39 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.39 , dequeue#2(::(@t, @ts)) -> 675.11/183.39 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.39 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.39 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.39 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.39 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.39 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.39 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.39 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.39 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.39 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.39 Obligation: 675.11/183.39 innermost runtime complexity 675.11/183.39 Answer: 675.11/183.39 YES(O(1),O(1)) 675.11/183.39 675.11/183.39 The following weak DPs constitute a sub-graph of the DG that is 675.11/183.39 closed under successors. The DPs are removed. 675.11/183.39 675.11/183.39 { bftMult'#5^#(@queue', @acc, @y) -> 675.11/183.39 c_5(bftMult'^#(@queue', matrixMult(@acc, @y)), 675.11/183.39 matrixMult^#(@acc, @y)) 675.11/183.39 , bftMult'^#(@queue, @acc) -> 675.11/183.39 c_6(bftMult'#1^#(bftMult'#2(@queue), @acc), bftMult'#2^#(@queue)) 675.11/183.39 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.11/183.39 c_11(bftMult'#4^#(@t, @acc, @queue)) 675.11/183.39 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.11/183.39 c_12(bftMult'^#(@queue, @acc)) 675.11/183.39 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.11/183.39 c_13(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.11/183.39 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.11/183.39 c_22(bftMult'#3^#(@elem, @acc, @queue)) } 675.11/183.39 675.11/183.39 We are left with following problem, upon which TcT provides the 675.11/183.39 certificate YES(O(1),O(1)). 675.11/183.39 675.11/183.39 Weak Trs: 675.11/183.39 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.11/183.39 dequeue(@dequeue@1, @dequeue@2) 675.11/183.39 , #natmult(#0(), @y) -> #0() 675.11/183.39 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.11/183.39 , reverse(@xs) -> appendreverse(@xs, nil()) 675.11/183.39 , appendreverse#1(nil(), @sofar) -> @sofar 675.11/183.39 , appendreverse#1(::(@a, @as), @sofar) -> 675.11/183.39 appendreverse(@as, ::(@a, @sofar)) 675.11/183.39 , computeLine#1(nil(), @acc, @m) -> @acc 675.11/183.39 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.11/183.39 computeLine#2(@m, @acc, @x, @xs) 675.11/183.39 , appendreverse(@toreverse, @sofar) -> 675.11/183.39 appendreverse#1(@toreverse, @sofar) 675.11/183.39 , matrixMult#1(nil(), @m2) -> nil() 675.11/183.39 , matrixMult#1(::(@l, @ls), @m2) -> 675.11/183.39 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.11/183.39 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.11/183.39 , lineMult#2(nil(), @n, @x, @xs) -> 675.11/183.39 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.11/183.39 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.11/183.39 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.11/183.39 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.11/183.39 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.11/183.39 , #add(#0(), @y) -> @y 675.11/183.39 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.11/183.39 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.11/183.39 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.11/183.39 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.11/183.39 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.11/183.39 , dequeue#1(::(@t, @ts), @inq) -> 675.11/183.39 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.11/183.39 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.39 , #mult(#pos(@x), #0()) -> #0() 675.11/183.39 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.39 , #mult(#0(), #pos(@y)) -> #0() 675.11/183.39 , #mult(#0(), #0()) -> #0() 675.11/183.39 , #mult(#0(), #neg(@y)) -> #0() 675.11/183.39 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.11/183.39 , #mult(#neg(@x), #0()) -> #0() 675.11/183.39 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.11/183.39 , +(@x, @y) -> #add(@x, @y) 675.11/183.39 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.11/183.39 , #succ(#0()) -> #pos(#s(#0())) 675.11/183.39 , #succ(#neg(#s(#0()))) -> #0() 675.11/183.39 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.11/183.39 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.11/183.39 tuple#2(@outq, ::(@t, @inq)) 675.11/183.39 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.11/183.39 , *(@x, @y) -> #mult(@x, @y) 675.11/183.39 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.11/183.39 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.11/183.39 , dequeue#2(::(@t, @ts)) -> 675.11/183.39 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.11/183.39 , #pred(#pos(#s(#0()))) -> #0() 675.11/183.39 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.11/183.39 , #pred(#0()) -> #neg(#s(#0())) 675.11/183.39 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.11/183.39 , lineMult#1(nil(), @l2, @n) -> nil() 675.11/183.39 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.11/183.39 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.11/183.39 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.11/183.39 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.11/183.39 Obligation: 675.11/183.39 innermost runtime complexity 675.11/183.39 Answer: 675.11/183.39 YES(O(1),O(1)) 675.11/183.39 675.11/183.39 No rule is usable, rules are removed from the input problem. 675.35/183.40 675.35/183.40 We are left with following problem, upon which TcT provides the 675.35/183.40 certificate YES(O(1),O(1)). 675.35/183.40 675.35/183.40 Rules: Empty 675.35/183.40 Obligation: 675.35/183.40 innermost runtime complexity 675.35/183.40 Answer: 675.35/183.40 YES(O(1),O(1)) 675.35/183.40 675.35/183.40 Empty rules are trivially bounded 675.35/183.40 675.35/183.40 We return to the main proof. 675.35/183.40 675.35/183.40 We are left with following problem, upon which TcT provides the 675.35/183.40 certificate YES(O(1),O(n^2)). 675.35/183.40 675.35/183.40 Strict DPs: 675.35/183.40 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.40 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.35/183.40 , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.35/183.40 , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.35/183.40 , appendreverse^#(@toreverse, @sofar) -> 675.35/183.40 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.35/183.40 , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.40 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.35/183.40 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.35/183.40 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.40 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.40 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.40 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.40 lineMult^#(@x, @l, @acc)) 675.35/183.40 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.40 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.40 , computeLine^#(@line, @m, @acc) -> 675.35/183.40 c_15(computeLine#1^#(@line, @acc, @m)) 675.35/183.40 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.40 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.40 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.40 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.40 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.40 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.40 c_20(lineMult^#(@n, @xs, @ys)) 675.35/183.40 , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) } 675.35/183.40 Weak DPs: 675.35/183.40 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.40 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.40 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.40 , bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue) 675.35/183.40 , bftMult'^#(@queue, @acc) -> 675.35/183.40 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.40 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.40 bftMult'#4^#(@t, @acc, @queue) 675.35/183.40 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.40 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.40 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.40 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.40 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.40 Weak Trs: 675.35/183.40 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.40 dequeue(@dequeue@1, @dequeue@2) 675.35/183.40 , #natmult(#0(), @y) -> #0() 675.35/183.40 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.40 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.40 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.40 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.40 appendreverse(@as, ::(@a, @sofar)) 675.35/183.40 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.40 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.40 computeLine#2(@m, @acc, @x, @xs) 675.35/183.40 , appendreverse(@toreverse, @sofar) -> 675.35/183.40 appendreverse#1(@toreverse, @sofar) 675.35/183.40 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.40 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.40 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.40 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.40 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.40 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.40 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.40 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.40 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.40 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.40 , #add(#0(), @y) -> @y 675.35/183.40 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.40 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.40 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.40 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.40 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.40 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.40 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.40 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.40 , #mult(#pos(@x), #0()) -> #0() 675.35/183.40 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.40 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.40 , #mult(#0(), #0()) -> #0() 675.35/183.40 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.40 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.40 , #mult(#neg(@x), #0()) -> #0() 675.35/183.40 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.40 , +(@x, @y) -> #add(@x, @y) 675.35/183.40 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.40 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.40 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.40 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.40 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.40 tuple#2(@outq, ::(@t, @inq)) 675.35/183.40 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.40 , *(@x, @y) -> #mult(@x, @y) 675.35/183.40 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.40 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.40 , dequeue#2(::(@t, @ts)) -> 675.35/183.40 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.40 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.40 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.40 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.40 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.40 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.40 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.40 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.40 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.40 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.40 Obligation: 675.35/183.40 innermost runtime complexity 675.35/183.40 Answer: 675.35/183.40 YES(O(1),O(n^2)) 675.35/183.40 675.35/183.40 We use the processor 'matrix interpretation of dimension 1' to 675.35/183.40 orient following rules strictly. 675.35/183.40 675.35/183.40 DPs: 675.35/183.40 { 1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.40 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.35/183.40 , 6: appendreverse#1^#(::(@a, @as), @sofar) -> 675.35/183.40 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.35/183.40 , 17: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.40 , 23: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.40 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.40 675.35/183.40 Sub-proof: 675.35/183.40 ---------- 675.35/183.40 The following argument positions are usable: 675.35/183.40 Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_3) = {1}, 675.35/183.40 Uargs(c_4) = {1}, Uargs(c_7) = {1}, Uargs(c_8) = {1}, 675.35/183.40 Uargs(c_9) = {1}, Uargs(c_10) = {1, 2}, Uargs(c_14) = {1, 2}, 675.35/183.40 Uargs(c_15) = {1}, Uargs(c_17) = {1}, Uargs(c_18) = {1}, 675.35/183.40 Uargs(c_19) = {1}, Uargs(c_20) = {1}, Uargs(c_21) = {1} 675.35/183.40 675.35/183.40 TcT has computed the following constructor-based matrix 675.35/183.40 interpretation satisfying not(EDA). 675.35/183.40 675.35/183.40 [bftMult'#2](x1) = [1] x1 + [0] 675.35/183.40 675.35/183.40 [#natmult](x1, x2) = [0] 675.35/183.40 675.35/183.40 [reverse](x1) = [1] x1 + [0] 675.35/183.40 675.35/183.40 [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.40 675.35/183.40 [computeLine#1](x1, x2, x3) = [0] 675.35/183.40 675.35/183.40 [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.40 675.35/183.40 [matrixMult#1](x1, x2) = [4] x2 + [0] 675.35/183.40 675.35/183.40 [leaf] = [0] 675.35/183.40 675.35/183.40 [lineMult](x1, x2, x3) = [0] 675.35/183.40 675.35/183.40 [lineMult#2](x1, x2, x3, x4) = [2] x4 + [0] 675.35/183.40 675.35/183.40 [#pos](x1) = [0] 675.35/183.40 675.35/183.40 [#add](x1, x2) = [0] 675.35/183.40 675.35/183.40 [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [2] 675.35/183.40 675.35/183.40 [dequeue](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.40 675.35/183.40 [tuple#2](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.40 675.35/183.40 [nil] = [0] 675.35/183.40 675.35/183.40 [computeLine](x1, x2, x3) = [4] x1 + [0] 675.35/183.40 675.35/183.40 [dequeue#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.40 675.35/183.40 [::](x1, x2) = [1] x1 + [1] x2 + [1] 675.35/183.40 675.35/183.40 [#mult](x1, x2) = [0] 675.35/183.40 675.35/183.40 [+](x1, x2) = [4] x2 + [0] 675.35/183.40 675.35/183.40 [#succ](x1) = [0] 675.35/183.40 675.35/183.40 [#0] = [0] 675.35/183.40 675.35/183.40 [enqueue#1](x1, x2) = [1] x1 + [1] x2 + [1] 675.35/183.40 675.35/183.40 [#neg](x1) = [0] 675.35/183.40 675.35/183.40 [matrixMult](x1, x2) = [3] x1 + [0] 675.35/183.40 675.35/183.40 [*](x1, x2) = [0] 675.35/183.40 675.35/183.40 [enqueue](x1, x2) = [1] x1 + [1] x2 + [1] 675.35/183.40 675.35/183.40 [dequeue#2](x1) = [1] x1 + [0] 675.35/183.40 675.35/183.40 [#pred](x1) = [0] 675.35/183.40 675.35/183.40 [lineMult#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.35/183.40 675.35/183.40 [#s](x1) = [0] 675.35/183.40 675.35/183.40 [computeLine#2](x1, x2, x3, x4) = [4] x2 + [4] x3 + [4] x4 + [0] 675.35/183.40 675.35/183.40 [bftMult'#2^#](x1) = [4] x1 + [4] 675.35/183.40 675.35/183.40 [dequeue^#](x1, x2) = [4] x2 + [0] 675.35/183.40 675.35/183.40 [reverse^#](x1) = [4] x1 + [0] 675.35/183.40 675.35/183.40 [appendreverse^#](x1, x2) = [4] x1 + [0] 675.35/183.40 675.35/183.40 [bftMult'#5^#](x1, x2, x3) = [4] x1 + [2] x3 + [4] 675.35/183.40 675.35/183.40 [bftMult'^#](x1, x2) = [4] x1 + [4] 675.35/183.40 675.35/183.40 [matrixMult^#](x1, x2) = [0] 675.35/183.40 675.35/183.40 [appendreverse#1^#](x1, x2) = [4] x1 + [0] 675.35/183.40 675.35/183.40 [computeLine#1^#](x1, x2, x3) = [0] 675.35/183.40 675.35/183.40 [computeLine#2^#](x1, x2, x3, x4) = [0] 675.35/183.40 675.35/183.40 [bftMult'#3^#](x1, x2, x3) = [4] x1 + [4] x3 + [0] 675.35/183.40 675.35/183.40 [bftMult'#4^#](x1, x2, x3) = [4] x1 + [4] x3 + [4] 675.35/183.40 675.35/183.40 [matrixMult#1^#](x1, x2) = [0] 675.35/183.40 675.35/183.40 [computeLine^#](x1, x2, x3) = [0] 675.35/183.40 675.35/183.40 [lineMult^#](x1, x2, x3) = [0] 675.35/183.40 675.35/183.40 [lineMult#1^#](x1, x2, x3) = [0] 675.35/183.40 675.35/183.40 [lineMult#2^#](x1, x2, x3, x4) = [0] 675.35/183.40 675.35/183.40 [dequeue#1^#](x1, x2) = [4] x2 + [0] 675.35/183.40 675.35/183.40 [bftMult'#1^#](x1, x2) = [4] x1 + [4] 675.35/183.40 675.35/183.40 [c_1](x1) = [1] x1 + [1] 675.35/183.40 675.35/183.40 [c_2](x1) = [1] x1 + [0] 675.35/183.40 675.35/183.40 [c_3](x1) = [1] x1 + [0] 675.35/183.40 675.35/183.40 [c_4](x1) = [1] x1 + [0] 675.35/183.40 675.35/183.40 [c_7](x1) = [2] x1 + [0] 675.35/183.40 675.35/183.40 [c_8](x1) = [1] x1 + [1] 675.35/183.40 675.35/183.40 [c_9](x1) = [2] x1 + [0] 675.35/183.40 675.35/183.40 [c_10](x1, x2) = [4] x1 + [4] x2 + [0] 675.35/183.40 675.35/183.40 [c_14](x1, x2) = [4] x1 + [4] x2 + [0] 675.35/183.40 675.35/183.40 [c_15](x1) = [2] x1 + [0] 675.35/183.40 675.35/183.40 [c_17](x1) = [4] x1 + [0] 675.35/183.40 675.35/183.40 [c_18](x1) = [2] x1 + [0] 675.35/183.40 675.35/183.40 [c_19](x1) = [2] x1 + [0] 675.35/183.40 675.35/183.40 [c_20](x1) = [4] x1 + [0] 675.35/183.40 675.35/183.40 [c_21](x1) = [1] x1 + [0] 675.35/183.40 675.35/183.40 The order satisfies the following ordering constraints: 675.35/183.40 675.35/183.40 [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] = [1] @dequeue@1 + [1] @dequeue@2 + [0] 675.35/183.40 >= [1] @dequeue@1 + [1] @dequeue@2 + [0] 675.35/183.40 = [dequeue(@dequeue@1, @dequeue@2)] 675.35/183.40 675.35/183.40 [#natmult(#0(), @y)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#0()] 675.35/183.40 675.35/183.40 [#natmult(#s(@x), @y)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#add(#pos(@y), #natmult(@x, @y))] 675.35/183.40 675.35/183.40 [reverse(@xs)] = [1] @xs + [0] 675.35/183.40 >= [1] @xs + [0] 675.35/183.40 = [appendreverse(@xs, nil())] 675.35/183.40 675.35/183.40 [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] 675.35/183.40 >= [1] @sofar + [0] 675.35/183.40 = [@sofar] 675.35/183.40 675.35/183.40 [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [1] 675.35/183.40 >= [1] @sofar + [1] @a + [1] @as + [1] 675.35/183.40 = [appendreverse(@as, ::(@a, @sofar))] 675.35/183.40 675.35/183.40 [computeLine#1(nil(), @acc, @m)] = [0] 675.35/183.40 ? [1] @acc + [0] 675.35/183.40 = [@acc] 675.35/183.40 675.35/183.40 [computeLine#1(::(@x, @xs), @acc, @m)] = [0] 675.35/183.40 ? [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.40 = [computeLine#2(@m, @acc, @x, @xs)] 675.35/183.40 675.35/183.40 [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] 675.35/183.40 >= [1] @toreverse + [1] @sofar + [0] 675.35/183.40 = [appendreverse#1(@toreverse, @sofar)] 675.35/183.40 675.35/183.40 [matrixMult#1(nil(), @m2)] = [4] @m2 + [0] 675.35/183.40 >= [0] 675.35/183.40 = [nil()] 675.35/183.40 675.35/183.40 [matrixMult#1(::(@l, @ls), @m2)] = [4] @m2 + [0] 675.35/183.40 ? [4] @l + [3] @ls + [1] 675.35/183.40 = [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))] 675.35/183.40 675.35/183.40 [lineMult(@n, @l1, @l2)] = [0] 675.35/183.40 ? [4] @n + [4] @l2 + [0] 675.35/183.40 = [lineMult#1(@l1, @l2, @n)] 675.35/183.40 675.35/183.40 [lineMult#2(nil(), @n, @x, @xs)] = [2] @xs + [0] 675.35/183.40 ? [1] 675.35/183.40 = [::(*(@x, @n), lineMult(@n, @xs, nil()))] 675.35/183.40 675.35/183.40 [lineMult#2(::(@y, @ys), @n, @x, @xs)] = [2] @xs + [0] 675.35/183.40 ? [4] @y + [1] 675.35/183.40 = [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))] 675.35/183.40 675.35/183.40 [#add(#pos(#s(#0())), @y)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#succ(@y)] 675.35/183.40 675.35/183.40 [#add(#pos(#s(#s(@x))), @y)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#succ(#add(#pos(#s(@x)), @y))] 675.35/183.40 675.35/183.40 [#add(#0(), @y)] = [0] 675.35/183.40 ? [1] @y + [0] 675.35/183.40 = [@y] 675.35/183.40 675.35/183.40 [#add(#neg(#s(#0())), @y)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#pred(@y)] 675.35/183.40 675.35/183.40 [#add(#neg(#s(#s(@x))), @y)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#pred(#add(#pos(#s(@x)), @y))] 675.35/183.40 675.35/183.40 [dequeue(@outq, @inq)] = [1] @outq + [1] @inq + [0] 675.35/183.40 >= [1] @outq + [1] @inq + [0] 675.35/183.40 = [dequeue#1(@outq, @inq)] 675.35/183.40 675.35/183.40 [computeLine(@line, @m, @acc)] = [4] @line + [0] 675.35/183.40 >= [0] 675.35/183.40 = [computeLine#1(@line, @acc, @m)] 675.35/183.40 675.35/183.40 [dequeue#1(nil(), @inq)] = [1] @inq + [0] 675.35/183.40 >= [1] @inq + [0] 675.35/183.40 = [dequeue#2(reverse(@inq))] 675.35/183.40 675.35/183.40 [dequeue#1(::(@t, @ts), @inq)] = [1] @t + [1] @inq + [1] @ts + [1] 675.35/183.40 >= [1] @t + [1] @inq + [1] @ts + [1] 675.35/183.40 = [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))] 675.35/183.40 675.35/183.40 [#mult(#pos(@x), #pos(@y))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#pos(#natmult(@x, @y))] 675.35/183.40 675.35/183.40 [#mult(#pos(@x), #0())] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#0()] 675.35/183.40 675.35/183.40 [#mult(#pos(@x), #neg(@y))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#neg(#natmult(@x, @y))] 675.35/183.40 675.35/183.40 [#mult(#0(), #pos(@y))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#0()] 675.35/183.40 675.35/183.40 [#mult(#0(), #0())] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#0()] 675.35/183.40 675.35/183.40 [#mult(#0(), #neg(@y))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#0()] 675.35/183.40 675.35/183.40 [#mult(#neg(@x), #pos(@y))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#neg(#natmult(@x, @y))] 675.35/183.40 675.35/183.40 [#mult(#neg(@x), #0())] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#0()] 675.35/183.40 675.35/183.40 [#mult(#neg(@x), #neg(@y))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#pos(#natmult(@x, @y))] 675.35/183.40 675.35/183.40 [+(@x, @y)] = [4] @y + [0] 675.35/183.40 >= [0] 675.35/183.40 = [#add(@x, @y)] 675.35/183.40 675.35/183.40 [#succ(#pos(#s(@x)))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#pos(#s(#s(@x)))] 675.35/183.40 675.35/183.40 [#succ(#0())] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#pos(#s(#0()))] 675.35/183.40 675.35/183.40 [#succ(#neg(#s(#0())))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#0()] 675.35/183.40 675.35/183.40 [#succ(#neg(#s(#s(@x))))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#neg(#s(@x))] 675.35/183.40 675.35/183.40 [enqueue#1(tuple#2(@outq, @inq), @t)] = [1] @t + [1] @outq + [1] @inq + [1] 675.35/183.40 >= [1] @t + [1] @outq + [1] @inq + [1] 675.35/183.40 = [tuple#2(@outq, ::(@t, @inq))] 675.35/183.40 675.35/183.40 [matrixMult(@m1, @m2)] = [3] @m1 + [0] 675.35/183.40 ? [4] @m2 + [0] 675.35/183.40 = [matrixMult#1(@m1, @m2)] 675.35/183.40 675.35/183.40 [*(@x, @y)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#mult(@x, @y)] 675.35/183.40 675.35/183.40 [enqueue(@t, @queue)] = [1] @t + [1] @queue + [1] 675.35/183.40 >= [1] @t + [1] @queue + [1] 675.35/183.40 = [enqueue#1(@queue, @t)] 675.35/183.40 675.35/183.40 [dequeue#2(nil())] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [tuple#2(nil(), tuple#2(nil(), nil()))] 675.35/183.40 675.35/183.40 [dequeue#2(::(@t, @ts))] = [1] @t + [1] @ts + [1] 675.35/183.40 >= [1] @t + [1] @ts + [1] 675.35/183.40 = [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))] 675.35/183.40 675.35/183.40 [#pred(#pos(#s(#0())))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#0()] 675.35/183.40 675.35/183.40 [#pred(#pos(#s(#s(@x))))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#pos(#s(@x))] 675.35/183.40 675.35/183.40 [#pred(#0())] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#neg(#s(#0()))] 675.35/183.40 675.35/183.40 [#pred(#neg(#s(@x)))] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [#neg(#s(#s(@x)))] 675.35/183.40 675.35/183.40 [lineMult#1(nil(), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.40 >= [0] 675.35/183.40 = [nil()] 675.35/183.40 675.35/183.40 [lineMult#1(::(@x, @xs), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.40 ? [2] @xs + [0] 675.35/183.40 = [lineMult#2(@l2, @n, @x, @xs)] 675.35/183.40 675.35/183.40 [computeLine#2(nil(), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.40 >= [0] 675.35/183.40 = [nil()] 675.35/183.40 675.35/183.40 [computeLine#2(::(@l, @ls), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.40 >= [4] @xs + [0] 675.35/183.40 = [computeLine(@xs, @ls, lineMult(@x, @l, @acc))] 675.35/183.40 675.35/183.40 [bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2))] = [4] @dequeue@1 + [4] @dequeue@2 + [4] 675.35/183.40 > [4] @dequeue@2 + [1] 675.35/183.40 = [c_1(dequeue^#(@dequeue@1, @dequeue@2))] 675.35/183.40 675.35/183.40 [dequeue^#(@outq, @inq)] = [4] @inq + [0] 675.35/183.40 >= [4] @inq + [0] 675.35/183.40 = [c_2(dequeue#1^#(@outq, @inq))] 675.35/183.40 675.35/183.40 [reverse^#(@xs)] = [4] @xs + [0] 675.35/183.40 >= [4] @xs + [0] 675.35/183.40 = [c_3(appendreverse^#(@xs, nil()))] 675.35/183.40 675.35/183.40 [appendreverse^#(@toreverse, @sofar)] = [4] @toreverse + [0] 675.35/183.40 >= [4] @toreverse + [0] 675.35/183.40 = [c_4(appendreverse#1^#(@toreverse, @sofar))] 675.35/183.40 675.35/183.40 [bftMult'#5^#(@queue', @acc, @y)] = [2] @y + [4] @queue' + [4] 675.35/183.40 >= [4] @queue' + [4] 675.35/183.40 = [bftMult'^#(@queue', matrixMult(@acc, @y))] 675.35/183.40 675.35/183.40 [bftMult'#5^#(@queue', @acc, @y)] = [2] @y + [4] @queue' + [4] 675.35/183.40 > [0] 675.35/183.40 = [matrixMult^#(@acc, @y)] 675.35/183.40 675.35/183.40 [bftMult'^#(@queue, @acc)] = [4] @queue + [4] 675.35/183.40 >= [4] @queue + [4] 675.35/183.40 = [bftMult'#2^#(@queue)] 675.35/183.40 675.35/183.40 [bftMult'^#(@queue, @acc)] = [4] @queue + [4] 675.35/183.40 >= [4] @queue + [4] 675.35/183.40 = [bftMult'#1^#(bftMult'#2(@queue), @acc)] 675.35/183.40 675.35/183.40 [matrixMult^#(@m1, @m2)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [c_7(matrixMult#1^#(@m1, @m2))] 675.35/183.40 675.35/183.40 [appendreverse#1^#(::(@a, @as), @sofar)] = [4] @a + [4] @as + [4] 675.35/183.40 > [4] @as + [1] 675.35/183.40 = [c_8(appendreverse^#(@as, ::(@a, @sofar)))] 675.35/183.40 675.35/183.40 [computeLine#1^#(::(@x, @xs), @acc, @m)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [c_9(computeLine#2^#(@m, @acc, @x, @xs))] 675.35/183.40 675.35/183.40 [computeLine#2^#(::(@l, @ls), @acc, @x, @xs)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.40 lineMult^#(@x, @l, @acc))] 675.35/183.40 675.35/183.40 [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] = [4] @t + [4] @queue + [4] @_@3 + [4] 675.35/183.40 >= [4] @t + [4] @queue + [4] 675.35/183.40 = [bftMult'#4^#(@t, @acc, @queue)] 675.35/183.40 675.35/183.40 [bftMult'#4^#(leaf(), @acc, @queue)] = [4] @queue + [4] 675.35/183.40 >= [4] @queue + [4] 675.35/183.40 = [bftMult'^#(@queue, @acc)] 675.35/183.40 675.35/183.40 [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] = [4] @y + [4] @queue + [4] @t1 + [4] @t2 + [12] 675.35/183.40 >= [2] @y + [4] @queue + [4] @t1 + [4] @t2 + [12] 675.35/183.40 = [bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)] 675.35/183.40 675.35/183.40 [matrixMult#1^#(::(@l, @ls), @m2)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))] 675.35/183.40 675.35/183.40 [computeLine^#(@line, @m, @acc)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [c_15(computeLine#1^#(@line, @acc, @m))] 675.35/183.40 675.35/183.40 [lineMult^#(@n, @l1, @l2)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [c_17(lineMult#1^#(@l1, @l2, @n))] 675.35/183.40 675.35/183.40 [lineMult#1^#(::(@x, @xs), @l2, @n)] = [0] 675.35/183.40 >= [0] 675.35/183.40 = [c_18(lineMult#2^#(@l2, @n, @x, @xs))] 675.35/183.41 675.35/183.41 [lineMult#2^#(nil(), @n, @x, @xs)] = [0] 675.35/183.41 >= [0] 675.35/183.41 = [c_19(lineMult^#(@n, @xs, nil()))] 675.35/183.41 675.35/183.41 [lineMult#2^#(::(@y, @ys), @n, @x, @xs)] = [0] 675.35/183.41 >= [0] 675.35/183.41 = [c_20(lineMult^#(@n, @xs, @ys))] 675.35/183.41 675.35/183.41 [dequeue#1^#(nil(), @inq)] = [4] @inq + [0] 675.35/183.41 >= [4] @inq + [0] 675.35/183.41 = [c_21(reverse^#(@inq))] 675.35/183.41 675.35/183.41 [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] = [4] @queue + [4] @elem + [4] 675.35/183.41 > [4] @queue + [4] @elem + [0] 675.35/183.41 = [bftMult'#3^#(@elem, @acc, @queue)] 675.35/183.41 675.35/183.41 675.35/183.41 We return to the main proof. Consider the set of all dependency 675.35/183.41 pairs 675.35/183.41 675.35/183.41 : 675.35/183.41 { 1: bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.41 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.35/183.41 , 2: dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.35/183.41 , 3: reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.35/183.41 , 4: appendreverse^#(@toreverse, @sofar) -> 675.35/183.41 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.35/183.41 , 5: matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.41 , 6: appendreverse#1^#(::(@a, @as), @sofar) -> 675.35/183.41 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.35/183.41 , 7: computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.41 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.41 , 8: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.41 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.41 lineMult^#(@x, @l, @acc)) 675.35/183.41 , 9: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.41 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.41 , 10: computeLine^#(@line, @m, @acc) -> 675.35/183.41 c_15(computeLine#1^#(@line, @acc, @m)) 675.35/183.41 , 11: lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.41 , 12: lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.41 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.41 , 13: lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.41 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.41 , 14: lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.41 c_20(lineMult^#(@n, @xs, @ys)) 675.35/183.41 , 15: dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) 675.35/183.41 , 16: bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.41 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.41 , 17: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.41 , 18: bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue) 675.35/183.41 , 19: bftMult'^#(@queue, @acc) -> 675.35/183.41 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.41 , 20: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.41 bftMult'#4^#(@t, @acc, @queue) 675.35/183.41 , 21: bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.41 bftMult'^#(@queue, @acc) 675.35/183.41 , 22: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.41 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.41 , 23: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.41 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.41 675.35/183.41 Processor 'matrix interpretation of dimension 1' induces the 675.35/183.41 complexity certificate YES(?,O(n^1)) on application of dependency 675.35/183.41 pairs {1,6,17,23}. These cover all (indirect) predecessors of 675.35/183.41 dependency pairs {1,2,3,4,6,15,16,17,18,19,20,21,22,23}, their 675.35/183.41 number of application is equally bounded. The dependency pairs are 675.35/183.41 shifted into the weak component. 675.35/183.41 675.35/183.41 We are left with following problem, upon which TcT provides the 675.35/183.41 certificate YES(O(1),O(n^2)). 675.35/183.41 675.35/183.41 Strict DPs: 675.35/183.41 { matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.41 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.41 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.41 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.41 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.41 lineMult^#(@x, @l, @acc)) 675.35/183.41 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.41 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.41 , computeLine^#(@line, @m, @acc) -> 675.35/183.41 c_15(computeLine#1^#(@line, @acc, @m)) 675.35/183.41 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.41 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.41 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.41 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.41 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.41 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.41 c_20(lineMult^#(@n, @xs, @ys)) } 675.35/183.41 Weak DPs: 675.35/183.41 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.41 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.35/183.41 , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.35/183.41 , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.35/183.41 , appendreverse^#(@toreverse, @sofar) -> 675.35/183.41 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.35/183.41 , bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.41 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.41 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.41 , bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue) 675.35/183.41 , bftMult'^#(@queue, @acc) -> 675.35/183.41 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.41 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.35/183.41 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.35/183.41 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.41 bftMult'#4^#(@t, @acc, @queue) 675.35/183.41 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.41 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.41 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.41 , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) 675.35/183.41 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.41 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.41 Weak Trs: 675.35/183.41 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.41 dequeue(@dequeue@1, @dequeue@2) 675.35/183.41 , #natmult(#0(), @y) -> #0() 675.35/183.41 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.41 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.41 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.41 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.41 appendreverse(@as, ::(@a, @sofar)) 675.35/183.41 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.41 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.41 computeLine#2(@m, @acc, @x, @xs) 675.35/183.41 , appendreverse(@toreverse, @sofar) -> 675.35/183.41 appendreverse#1(@toreverse, @sofar) 675.35/183.41 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.41 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.41 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.41 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.41 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.41 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.41 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.41 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.41 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.41 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.41 , #add(#0(), @y) -> @y 675.35/183.41 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.41 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.41 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.41 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.41 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.41 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.41 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.41 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.41 , #mult(#pos(@x), #0()) -> #0() 675.35/183.41 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.41 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.41 , #mult(#0(), #0()) -> #0() 675.35/183.41 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.41 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.41 , #mult(#neg(@x), #0()) -> #0() 675.35/183.41 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.41 , +(@x, @y) -> #add(@x, @y) 675.35/183.41 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.41 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.41 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.41 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.41 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.41 tuple#2(@outq, ::(@t, @inq)) 675.35/183.41 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.41 , *(@x, @y) -> #mult(@x, @y) 675.35/183.41 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.41 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.41 , dequeue#2(::(@t, @ts)) -> 675.35/183.41 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.41 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.41 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.41 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.41 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.41 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.41 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.41 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.41 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.41 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.41 Obligation: 675.35/183.41 innermost runtime complexity 675.35/183.41 Answer: 675.35/183.41 YES(O(1),O(n^2)) 675.35/183.41 675.35/183.41 The following weak DPs constitute a sub-graph of the DG that is 675.35/183.41 closed under successors. The DPs are removed. 675.35/183.41 675.35/183.41 { bftMult'#2^#(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.41 c_1(dequeue^#(@dequeue@1, @dequeue@2)) 675.35/183.41 , dequeue^#(@outq, @inq) -> c_2(dequeue#1^#(@outq, @inq)) 675.35/183.41 , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) 675.35/183.41 , appendreverse^#(@toreverse, @sofar) -> 675.35/183.41 c_4(appendreverse#1^#(@toreverse, @sofar)) 675.35/183.41 , bftMult'^#(@queue, @acc) -> bftMult'#2^#(@queue) 675.35/183.41 , appendreverse#1^#(::(@a, @as), @sofar) -> 675.35/183.41 c_8(appendreverse^#(@as, ::(@a, @sofar))) 675.35/183.41 , dequeue#1^#(nil(), @inq) -> c_21(reverse^#(@inq)) } 675.35/183.41 675.35/183.41 We are left with following problem, upon which TcT provides the 675.35/183.41 certificate YES(O(1),O(n^2)). 675.35/183.41 675.35/183.41 Strict DPs: 675.35/183.41 { matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.41 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.41 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.41 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.41 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.41 lineMult^#(@x, @l, @acc)) 675.35/183.41 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.41 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.41 , computeLine^#(@line, @m, @acc) -> 675.35/183.41 c_15(computeLine#1^#(@line, @acc, @m)) 675.35/183.41 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.41 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.41 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.41 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.41 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.41 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.41 c_20(lineMult^#(@n, @xs, @ys)) } 675.35/183.41 Weak DPs: 675.35/183.41 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.41 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.41 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.41 , bftMult'^#(@queue, @acc) -> 675.35/183.41 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.41 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.41 bftMult'#4^#(@t, @acc, @queue) 675.35/183.41 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.41 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.41 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.41 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.41 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.41 Weak Trs: 675.35/183.41 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.41 dequeue(@dequeue@1, @dequeue@2) 675.35/183.41 , #natmult(#0(), @y) -> #0() 675.35/183.41 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.41 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.41 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.41 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.41 appendreverse(@as, ::(@a, @sofar)) 675.35/183.41 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.41 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.41 computeLine#2(@m, @acc, @x, @xs) 675.35/183.41 , appendreverse(@toreverse, @sofar) -> 675.35/183.41 appendreverse#1(@toreverse, @sofar) 675.35/183.41 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.41 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.41 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.41 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.41 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.41 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.41 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.41 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.41 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.41 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.41 , #add(#0(), @y) -> @y 675.35/183.41 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.41 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.41 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.41 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.41 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.41 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.41 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.41 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.41 , #mult(#pos(@x), #0()) -> #0() 675.35/183.41 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.41 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.41 , #mult(#0(), #0()) -> #0() 675.35/183.41 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.41 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.41 , #mult(#neg(@x), #0()) -> #0() 675.35/183.41 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.41 , +(@x, @y) -> #add(@x, @y) 675.35/183.41 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.41 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.41 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.41 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.41 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.41 tuple#2(@outq, ::(@t, @inq)) 675.35/183.41 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.41 , *(@x, @y) -> #mult(@x, @y) 675.35/183.41 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.41 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.41 , dequeue#2(::(@t, @ts)) -> 675.35/183.41 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.41 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.41 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.41 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.41 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.41 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.41 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.41 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.41 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.41 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.41 Obligation: 675.35/183.41 innermost runtime complexity 675.35/183.41 Answer: 675.35/183.41 YES(O(1),O(n^2)) 675.35/183.41 675.35/183.41 We decompose the input problem according to the dependency graph 675.35/183.41 into the upper component 675.35/183.41 675.35/183.41 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.41 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.41 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.41 , bftMult'^#(@queue, @acc) -> 675.35/183.41 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.41 , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.41 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.41 bftMult'#4^#(@t, @acc, @queue) 675.35/183.41 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.41 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.41 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.41 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.41 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.41 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.41 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.41 675.35/183.41 and lower component 675.35/183.41 675.35/183.41 { computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.41 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.41 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.41 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.41 lineMult^#(@x, @l, @acc)) 675.35/183.41 , computeLine^#(@line, @m, @acc) -> 675.35/183.41 c_15(computeLine#1^#(@line, @acc, @m)) 675.35/183.41 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.41 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.41 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.41 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.41 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.41 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.41 c_20(lineMult^#(@n, @xs, @ys)) } 675.35/183.41 675.35/183.41 Further, following extension rules are added to the lower 675.35/183.41 component. 675.35/183.41 675.35/183.41 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.41 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.41 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.41 , bftMult'^#(@queue, @acc) -> 675.35/183.41 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.41 , matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2) 675.35/183.41 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.41 bftMult'#4^#(@t, @acc, @queue) 675.35/183.41 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.41 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.41 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.41 , matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2) 675.35/183.41 , matrixMult#1^#(::(@l, @ls), @m2) -> computeLine^#(@l, @m2, nil()) 675.35/183.41 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.41 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.41 675.35/183.41 TcT solves the upper component with certificate YES(O(1),O(n^1)). 675.35/183.41 675.35/183.41 Sub-proof: 675.35/183.41 ---------- 675.35/183.41 We are left with following problem, upon which TcT provides the 675.35/183.41 certificate YES(O(1),O(n^1)). 675.35/183.41 675.35/183.41 Strict DPs: 675.35/183.41 { matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.41 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.41 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) } 675.35/183.41 Weak DPs: 675.35/183.41 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.41 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.41 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.41 , bftMult'^#(@queue, @acc) -> 675.35/183.41 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.41 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.41 bftMult'#4^#(@t, @acc, @queue) 675.35/183.41 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.41 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.41 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.41 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.41 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.41 Weak Trs: 675.35/183.41 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.41 dequeue(@dequeue@1, @dequeue@2) 675.35/183.41 , #natmult(#0(), @y) -> #0() 675.35/183.41 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.41 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.41 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.41 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.41 appendreverse(@as, ::(@a, @sofar)) 675.35/183.41 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.41 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.41 computeLine#2(@m, @acc, @x, @xs) 675.35/183.41 , appendreverse(@toreverse, @sofar) -> 675.35/183.41 appendreverse#1(@toreverse, @sofar) 675.35/183.41 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.41 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.41 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.41 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.41 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.41 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.41 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.41 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.41 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.41 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.41 , #add(#0(), @y) -> @y 675.35/183.41 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.41 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.41 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.41 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.41 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.41 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.41 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.41 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.41 , #mult(#pos(@x), #0()) -> #0() 675.35/183.41 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.41 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.41 , #mult(#0(), #0()) -> #0() 675.35/183.41 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.41 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.41 , #mult(#neg(@x), #0()) -> #0() 675.35/183.41 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.41 , +(@x, @y) -> #add(@x, @y) 675.35/183.41 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.41 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.41 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.41 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.41 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.41 tuple#2(@outq, ::(@t, @inq)) 675.35/183.41 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.41 , *(@x, @y) -> #mult(@x, @y) 675.35/183.41 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.41 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.41 , dequeue#2(::(@t, @ts)) -> 675.35/183.41 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.41 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.41 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.41 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.41 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.41 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.41 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.41 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.41 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.41 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.41 Obligation: 675.35/183.41 innermost runtime complexity 675.35/183.41 Answer: 675.35/183.41 YES(O(1),O(n^1)) 675.35/183.41 675.35/183.41 We use the processor 'matrix interpretation of dimension 1' to 675.35/183.41 orient following rules strictly. 675.35/183.41 675.35/183.41 DPs: 675.35/183.41 { 2: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.41 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) } 675.35/183.41 Trs: 675.35/183.41 { dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.41 , +(@x, @y) -> #add(@x, @y) } 675.35/183.41 675.35/183.41 Sub-proof: 675.35/183.41 ---------- 675.35/183.41 The following argument positions are usable: 675.35/183.41 Uargs(c_7) = {1}, Uargs(c_14) = {2} 675.35/183.41 675.35/183.41 TcT has computed the following constructor-based matrix 675.35/183.41 interpretation satisfying not(EDA). 675.35/183.41 675.35/183.41 [bftMult'#2](x1) = [0] 675.35/183.41 675.35/183.41 [#natmult](x1, x2) = [0] 675.35/183.41 675.35/183.41 [reverse](x1) = [0] 675.35/183.41 675.35/183.41 [appendreverse#1](x1, x2) = [4] x2 + [0] 675.35/183.41 675.35/183.41 [computeLine#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.35/183.41 675.35/183.41 [appendreverse](x1, x2) = [3] x1 + [0] 675.35/183.41 675.35/183.41 [matrixMult#1](x1, x2) = [1] x1 + [0] 675.35/183.41 675.35/183.41 [leaf] = [7] 675.35/183.41 675.35/183.41 [lineMult](x1, x2, x3) = [0] 675.35/183.41 675.35/183.41 [lineMult#2](x1, x2, x3, x4) = [2] x4 + [0] 675.35/183.41 675.35/183.41 [#pos](x1) = [0] 675.35/183.41 675.35/183.41 [#add](x1, x2) = [0] 675.35/183.41 675.35/183.41 [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [7] 675.35/183.41 675.35/183.41 [dequeue](x1, x2) = [7] x1 + [7] x2 + [1] 675.35/183.41 675.35/183.41 [tuple#2](x1, x2) = [0] 675.35/183.41 675.35/183.41 [nil] = [0] 675.35/183.41 675.35/183.41 [computeLine](x1, x2, x3) = [4] x1 + [0] 675.35/183.41 675.35/183.41 [dequeue#1](x1, x2) = [2] x2 + [0] 675.35/183.41 675.35/183.41 [::](x1, x2) = [1] x2 + [1] 675.35/183.41 675.35/183.41 [#mult](x1, x2) = [0] 675.35/183.41 675.35/183.41 [+](x1, x2) = [7] x2 + [7] 675.35/183.41 675.35/183.41 [#succ](x1) = [0] 675.35/183.41 675.35/183.41 [#0] = [0] 675.35/183.41 675.35/183.41 [enqueue#1](x1, x2) = [4] x1 + [4] x2 + [0] 675.35/183.41 675.35/183.41 [#neg](x1) = [0] 675.35/183.41 675.35/183.41 [matrixMult](x1, x2) = [1] x1 + [0] 675.35/183.41 675.35/183.41 [*](x1, x2) = [0] 675.35/183.41 675.35/183.41 [enqueue](x1, x2) = [4] x1 + [0] 675.35/183.41 675.35/183.41 [dequeue#2](x1) = [0] 675.35/183.41 675.35/183.41 [#pred](x1) = [0] 675.35/183.41 675.35/183.41 [lineMult#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.35/183.41 675.35/183.41 [#s](x1) = [0] 675.35/183.41 675.35/183.41 [computeLine#2](x1, x2, x3, x4) = [4] x2 + [4] x3 + [4] x4 + [0] 675.35/183.41 675.35/183.41 [bftMult'#5^#](x1, x2, x3) = [1] x2 + [0] 675.35/183.41 675.35/183.41 [bftMult'^#](x1, x2) = [1] x2 + [0] 675.35/183.41 675.35/183.41 [matrixMult^#](x1, x2) = [1] x1 + [0] 675.35/183.41 675.35/183.41 [bftMult'#3^#](x1, x2, x3) = [1] x2 + [0] 675.35/183.41 675.35/183.41 [bftMult'#4^#](x1, x2, x3) = [1] x2 + [0] 675.35/183.41 675.35/183.41 [matrixMult#1^#](x1, x2) = [1] x1 + [0] 675.35/183.41 675.35/183.41 [computeLine^#](x1, x2, x3) = [7] x1 + [7] x2 + [7] x3 + [7] 675.35/183.41 675.35/183.41 [bftMult'#1^#](x1, x2) = [1] x2 + [0] 675.35/183.41 675.35/183.41 [c_7](x1) = [1] x1 + [0] 675.35/183.41 675.35/183.41 [c_14](x1, x2) = [1] x2 + [0] 675.35/183.41 675.35/183.41 The order satisfies the following ordering constraints: 675.35/183.41 675.35/183.41 [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] = [0] 675.35/183.41 ? [7] @dequeue@1 + [7] @dequeue@2 + [1] 675.35/183.41 = [dequeue(@dequeue@1, @dequeue@2)] 675.35/183.41 675.35/183.41 [#natmult(#0(), @y)] = [0] 675.35/183.41 >= [0] 675.35/183.41 = [#0()] 675.35/183.41 675.35/183.41 [#natmult(#s(@x), @y)] = [0] 675.35/183.41 >= [0] 675.35/183.41 = [#add(#pos(@y), #natmult(@x, @y))] 675.35/183.41 675.35/183.41 [reverse(@xs)] = [0] 675.35/183.41 ? [3] @xs + [0] 675.35/183.41 = [appendreverse(@xs, nil())] 675.35/183.41 675.35/183.41 [appendreverse#1(nil(), @sofar)] = [4] @sofar + [0] 675.35/183.41 >= [1] @sofar + [0] 675.35/183.41 = [@sofar] 675.35/183.41 675.35/183.41 [appendreverse#1(::(@a, @as), @sofar)] = [4] @sofar + [0] 675.35/183.41 ? [3] @as + [0] 675.35/183.41 = [appendreverse(@as, ::(@a, @sofar))] 675.35/183.41 675.35/183.41 [computeLine#1(nil(), @acc, @m)] = [4] @acc + [4] @m + [0] 675.35/183.41 >= [1] @acc + [0] 675.35/183.41 = [@acc] 675.35/183.41 675.35/183.41 [computeLine#1(::(@x, @xs), @acc, @m)] = [4] @acc + [4] @m + [0] 675.35/183.41 ? [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.41 = [computeLine#2(@m, @acc, @x, @xs)] 675.35/183.41 675.35/183.41 [appendreverse(@toreverse, @sofar)] = [3] @toreverse + [0] 675.35/183.41 ? [4] @sofar + [0] 675.35/183.41 = [appendreverse#1(@toreverse, @sofar)] 675.35/183.41 675.35/183.41 [matrixMult#1(nil(), @m2)] = [0] 675.35/183.41 >= [0] 675.35/183.41 = [nil()] 675.35/183.41 675.35/183.41 [matrixMult#1(::(@l, @ls), @m2)] = [1] @ls + [1] 675.35/183.41 >= [1] @ls + [1] 675.35/183.41 = [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))] 675.35/183.41 675.35/183.41 [lineMult(@n, @l1, @l2)] = [0] 675.35/183.42 ? [4] @n + [4] @l2 + [0] 675.35/183.42 = [lineMult#1(@l1, @l2, @n)] 675.35/183.42 675.35/183.42 [lineMult#2(nil(), @n, @x, @xs)] = [2] @xs + [0] 675.35/183.42 ? [1] 675.35/183.42 = [::(*(@x, @n), lineMult(@n, @xs, nil()))] 675.35/183.42 675.35/183.42 [lineMult#2(::(@y, @ys), @n, @x, @xs)] = [2] @xs + [0] 675.35/183.42 ? [1] 675.35/183.42 = [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))] 675.35/183.42 675.35/183.42 [#add(#pos(#s(#0())), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#succ(@y)] 675.35/183.42 675.35/183.42 [#add(#pos(#s(#s(@x))), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#succ(#add(#pos(#s(@x)), @y))] 675.35/183.42 675.35/183.42 [#add(#0(), @y)] = [0] 675.35/183.42 ? [1] @y + [0] 675.35/183.42 = [@y] 675.35/183.42 675.35/183.42 [#add(#neg(#s(#0())), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pred(@y)] 675.35/183.42 675.35/183.42 [#add(#neg(#s(#s(@x))), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pred(#add(#pos(#s(@x)), @y))] 675.35/183.42 675.35/183.42 [dequeue(@outq, @inq)] = [7] @outq + [7] @inq + [1] 675.35/183.42 > [2] @inq + [0] 675.35/183.42 = [dequeue#1(@outq, @inq)] 675.35/183.42 675.35/183.42 [computeLine(@line, @m, @acc)] = [4] @line + [0] 675.35/183.42 ? [4] @acc + [4] @m + [0] 675.35/183.42 = [computeLine#1(@line, @acc, @m)] 675.35/183.42 675.35/183.42 [dequeue#1(nil(), @inq)] = [2] @inq + [0] 675.35/183.42 >= [0] 675.35/183.42 = [dequeue#2(reverse(@inq))] 675.35/183.42 675.35/183.42 [dequeue#1(::(@t, @ts), @inq)] = [2] @inq + [0] 675.35/183.42 >= [0] 675.35/183.42 = [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))] 675.35/183.42 675.35/183.42 [#mult(#pos(@x), #pos(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#natmult(@x, @y))] 675.35/183.42 675.35/183.42 [#mult(#pos(@x), #0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#pos(@x), #neg(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#natmult(@x, @y))] 675.35/183.42 675.35/183.42 [#mult(#0(), #pos(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#0(), #0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#0(), #neg(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#neg(@x), #pos(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#natmult(@x, @y))] 675.35/183.42 675.35/183.42 [#mult(#neg(@x), #0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#neg(@x), #neg(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#natmult(@x, @y))] 675.35/183.42 675.35/183.42 [+(@x, @y)] = [7] @y + [7] 675.35/183.42 > [0] 675.35/183.42 = [#add(@x, @y)] 675.35/183.42 675.35/183.42 [#succ(#pos(#s(@x)))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#s(#s(@x)))] 675.35/183.42 675.35/183.42 [#succ(#0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#s(#0()))] 675.35/183.42 675.35/183.42 [#succ(#neg(#s(#0())))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#succ(#neg(#s(#s(@x))))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#s(@x))] 675.35/183.42 675.35/183.42 [enqueue#1(tuple#2(@outq, @inq), @t)] = [4] @t + [0] 675.35/183.42 >= [0] 675.35/183.42 = [tuple#2(@outq, ::(@t, @inq))] 675.35/183.42 675.35/183.42 [matrixMult(@m1, @m2)] = [1] @m1 + [0] 675.35/183.42 >= [1] @m1 + [0] 675.35/183.42 = [matrixMult#1(@m1, @m2)] 675.35/183.42 675.35/183.42 [*(@x, @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#mult(@x, @y)] 675.35/183.42 675.35/183.42 [enqueue(@t, @queue)] = [4] @t + [0] 675.35/183.42 ? [4] @t + [4] @queue + [0] 675.35/183.42 = [enqueue#1(@queue, @t)] 675.35/183.42 675.35/183.42 [dequeue#2(nil())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [tuple#2(nil(), tuple#2(nil(), nil()))] 675.35/183.42 675.35/183.42 [dequeue#2(::(@t, @ts))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))] 675.35/183.42 675.35/183.42 [#pred(#pos(#s(#0())))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#pred(#pos(#s(#s(@x))))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#s(@x))] 675.35/183.42 675.35/183.42 [#pred(#0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#s(#0()))] 675.35/183.42 675.35/183.42 [#pred(#neg(#s(@x)))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#s(#s(@x)))] 675.35/183.42 675.35/183.42 [lineMult#1(nil(), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.42 >= [0] 675.35/183.42 = [nil()] 675.35/183.42 675.35/183.42 [lineMult#1(::(@x, @xs), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.42 ? [2] @xs + [0] 675.35/183.42 = [lineMult#2(@l2, @n, @x, @xs)] 675.35/183.42 675.35/183.42 [computeLine#2(nil(), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.42 >= [0] 675.35/183.42 = [nil()] 675.35/183.42 675.35/183.42 [computeLine#2(::(@l, @ls), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.42 >= [4] @xs + [0] 675.35/183.42 = [computeLine(@xs, @ls, lineMult(@x, @l, @acc))] 675.35/183.42 675.35/183.42 [bftMult'#5^#(@queue', @acc, @y)] = [1] @acc + [0] 675.35/183.42 >= [1] @acc + [0] 675.35/183.42 = [bftMult'^#(@queue', matrixMult(@acc, @y))] 675.35/183.42 675.35/183.42 [bftMult'#5^#(@queue', @acc, @y)] = [1] @acc + [0] 675.35/183.42 >= [1] @acc + [0] 675.35/183.42 = [matrixMult^#(@acc, @y)] 675.35/183.42 675.35/183.42 [bftMult'^#(@queue, @acc)] = [1] @acc + [0] 675.35/183.42 >= [1] @acc + [0] 675.35/183.42 = [bftMult'#1^#(bftMult'#2(@queue), @acc)] 675.35/183.42 675.35/183.42 [matrixMult^#(@m1, @m2)] = [1] @m1 + [0] 675.35/183.42 >= [1] @m1 + [0] 675.35/183.42 = [c_7(matrixMult#1^#(@m1, @m2))] 675.35/183.42 675.35/183.42 [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] = [1] @acc + [0] 675.35/183.42 >= [1] @acc + [0] 675.35/183.42 = [bftMult'#4^#(@t, @acc, @queue)] 675.35/183.42 675.35/183.42 [bftMult'#4^#(leaf(), @acc, @queue)] = [1] @acc + [0] 675.35/183.42 >= [1] @acc + [0] 675.35/183.42 = [bftMult'^#(@queue, @acc)] 675.35/183.42 675.35/183.42 [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] = [1] @acc + [0] 675.35/183.42 >= [1] @acc + [0] 675.35/183.42 = [bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)] 675.35/183.42 675.35/183.42 [matrixMult#1^#(::(@l, @ls), @m2)] = [1] @ls + [1] 675.35/183.42 > [1] @ls + [0] 675.35/183.42 = [c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))] 675.35/183.42 675.35/183.42 [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] = [1] @acc + [0] 675.35/183.42 >= [1] @acc + [0] 675.35/183.42 = [bftMult'#3^#(@elem, @acc, @queue)] 675.35/183.42 675.35/183.42 675.35/183.42 The strictly oriented rules are moved into the weak component. 675.35/183.42 675.35/183.42 We are left with following problem, upon which TcT provides the 675.35/183.42 certificate YES(O(1),O(n^1)). 675.35/183.42 675.35/183.42 Strict DPs: 675.35/183.42 { matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) } 675.35/183.42 Weak DPs: 675.35/183.42 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.42 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.42 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.42 , bftMult'^#(@queue, @acc) -> 675.35/183.42 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.42 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.42 bftMult'#4^#(@t, @acc, @queue) 675.35/183.42 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.42 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.42 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.42 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.42 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.42 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.42 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.42 Weak Trs: 675.35/183.42 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.42 dequeue(@dequeue@1, @dequeue@2) 675.35/183.42 , #natmult(#0(), @y) -> #0() 675.35/183.42 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.42 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.42 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.42 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.42 appendreverse(@as, ::(@a, @sofar)) 675.35/183.42 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.42 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.42 computeLine#2(@m, @acc, @x, @xs) 675.35/183.42 , appendreverse(@toreverse, @sofar) -> 675.35/183.42 appendreverse#1(@toreverse, @sofar) 675.35/183.42 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.42 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.42 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.42 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.42 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.42 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.42 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.42 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.42 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.42 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.42 , #add(#0(), @y) -> @y 675.35/183.42 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.42 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.42 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.42 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.42 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.42 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.42 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.42 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.42 , #mult(#pos(@x), #0()) -> #0() 675.35/183.42 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.42 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.42 , #mult(#0(), #0()) -> #0() 675.35/183.42 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.42 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.42 , #mult(#neg(@x), #0()) -> #0() 675.35/183.42 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.42 , +(@x, @y) -> #add(@x, @y) 675.35/183.42 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.42 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.42 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.42 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.42 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.42 tuple#2(@outq, ::(@t, @inq)) 675.35/183.42 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.42 , *(@x, @y) -> #mult(@x, @y) 675.35/183.42 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.42 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.42 , dequeue#2(::(@t, @ts)) -> 675.35/183.42 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.42 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.42 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.42 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.42 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.42 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.42 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.42 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.42 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.42 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.42 Obligation: 675.35/183.42 innermost runtime complexity 675.35/183.42 Answer: 675.35/183.42 YES(O(1),O(n^1)) 675.35/183.42 675.35/183.42 We use the processor 'matrix interpretation of dimension 1' to 675.35/183.42 orient following rules strictly. 675.35/183.42 675.35/183.42 DPs: 675.35/183.42 { 3: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.42 , 8: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.42 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) } 675.35/183.42 Trs: 675.35/183.42 { dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.42 , +(@x, @y) -> #add(@x, @y) } 675.35/183.42 675.35/183.42 Sub-proof: 675.35/183.42 ---------- 675.35/183.42 The following argument positions are usable: 675.35/183.42 Uargs(c_7) = {1}, Uargs(c_14) = {2} 675.35/183.42 675.35/183.42 TcT has computed the following constructor-based matrix 675.35/183.42 interpretation satisfying not(EDA). 675.35/183.42 675.35/183.42 [bftMult'#2](x1) = [0] 675.35/183.42 675.35/183.42 [#natmult](x1, x2) = [0] 675.35/183.42 675.35/183.42 [reverse](x1) = [0] 675.35/183.42 675.35/183.42 [appendreverse#1](x1, x2) = [4] x2 + [0] 675.35/183.42 675.35/183.42 [computeLine#1](x1, x2, x3) = [0] 675.35/183.42 675.35/183.42 [appendreverse](x1, x2) = [3] x1 + [0] 675.35/183.42 675.35/183.42 [matrixMult#1](x1, x2) = [1] x1 + [0] 675.35/183.42 675.35/183.42 [leaf] = [7] 675.35/183.42 675.35/183.42 [lineMult](x1, x2, x3) = [0] 675.35/183.42 675.35/183.42 [lineMult#2](x1, x2, x3, x4) = [3] x4 + [0] 675.35/183.42 675.35/183.42 [#pos](x1) = [0] 675.35/183.42 675.35/183.42 [#add](x1, x2) = [0] 675.35/183.42 675.35/183.42 [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [7] 675.35/183.42 675.35/183.42 [dequeue](x1, x2) = [7] x1 + [7] x2 + [1] 675.35/183.42 675.35/183.42 [tuple#2](x1, x2) = [0] 675.35/183.42 675.35/183.42 [nil] = [0] 675.35/183.42 675.35/183.42 [computeLine](x1, x2, x3) = [4] x1 + [0] 675.35/183.42 675.35/183.42 [dequeue#1](x1, x2) = [0] 675.35/183.42 675.35/183.42 [::](x1, x2) = [1] x2 + [1] 675.35/183.42 675.35/183.42 [#mult](x1, x2) = [0] 675.35/183.42 675.35/183.42 [+](x1, x2) = [7] x2 + [7] 675.35/183.42 675.35/183.42 [#succ](x1) = [0] 675.35/183.42 675.35/183.42 [#0] = [0] 675.35/183.42 675.35/183.42 [enqueue#1](x1, x2) = [4] x1 + [4] x2 + [0] 675.35/183.42 675.35/183.42 [#neg](x1) = [0] 675.35/183.42 675.35/183.42 [matrixMult](x1, x2) = [1] x1 + [0] 675.35/183.42 675.35/183.42 [*](x1, x2) = [0] 675.35/183.42 675.35/183.42 [enqueue](x1, x2) = [4] x1 + [0] 675.35/183.42 675.35/183.42 [dequeue#2](x1) = [0] 675.35/183.42 675.35/183.42 [#pred](x1) = [0] 675.35/183.42 675.35/183.42 [lineMult#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.35/183.42 675.35/183.42 [#s](x1) = [0] 675.35/183.42 675.35/183.42 [computeLine#2](x1, x2, x3, x4) = [4] x2 + [4] x3 + [4] x4 + [0] 675.35/183.42 675.35/183.42 [bftMult'#5^#](x1, x2, x3) = [1] x2 + [1] 675.35/183.42 675.35/183.42 [bftMult'^#](x1, x2) = [1] x2 + [1] 675.35/183.42 675.35/183.42 [matrixMult^#](x1, x2) = [1] x1 + [0] 675.35/183.42 675.35/183.42 [bftMult'#3^#](x1, x2, x3) = [1] x2 + [1] 675.35/183.42 675.35/183.42 [bftMult'#4^#](x1, x2, x3) = [1] x2 + [1] 675.35/183.42 675.35/183.42 [matrixMult#1^#](x1, x2) = [1] x1 + [0] 675.35/183.42 675.35/183.42 [computeLine^#](x1, x2, x3) = [7] x1 + [7] x2 + [7] x3 + [7] 675.35/183.42 675.35/183.42 [bftMult'#1^#](x1, x2) = [1] x2 + [1] 675.35/183.42 675.35/183.42 [c_7](x1) = [1] x1 + [0] 675.35/183.42 675.35/183.42 [c_14](x1, x2) = [1] x2 + [0] 675.35/183.42 675.35/183.42 The order satisfies the following ordering constraints: 675.35/183.42 675.35/183.42 [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] = [0] 675.35/183.42 ? [7] @dequeue@1 + [7] @dequeue@2 + [1] 675.35/183.42 = [dequeue(@dequeue@1, @dequeue@2)] 675.35/183.42 675.35/183.42 [#natmult(#0(), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#natmult(#s(@x), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#add(#pos(@y), #natmult(@x, @y))] 675.35/183.42 675.35/183.42 [reverse(@xs)] = [0] 675.35/183.42 ? [3] @xs + [0] 675.35/183.42 = [appendreverse(@xs, nil())] 675.35/183.42 675.35/183.42 [appendreverse#1(nil(), @sofar)] = [4] @sofar + [0] 675.35/183.42 >= [1] @sofar + [0] 675.35/183.42 = [@sofar] 675.35/183.42 675.35/183.42 [appendreverse#1(::(@a, @as), @sofar)] = [4] @sofar + [0] 675.35/183.42 ? [3] @as + [0] 675.35/183.42 = [appendreverse(@as, ::(@a, @sofar))] 675.35/183.42 675.35/183.42 [computeLine#1(nil(), @acc, @m)] = [0] 675.35/183.42 ? [1] @acc + [0] 675.35/183.42 = [@acc] 675.35/183.42 675.35/183.42 [computeLine#1(::(@x, @xs), @acc, @m)] = [0] 675.35/183.42 ? [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.42 = [computeLine#2(@m, @acc, @x, @xs)] 675.35/183.42 675.35/183.42 [appendreverse(@toreverse, @sofar)] = [3] @toreverse + [0] 675.35/183.42 ? [4] @sofar + [0] 675.35/183.42 = [appendreverse#1(@toreverse, @sofar)] 675.35/183.42 675.35/183.42 [matrixMult#1(nil(), @m2)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [nil()] 675.35/183.42 675.35/183.42 [matrixMult#1(::(@l, @ls), @m2)] = [1] @ls + [1] 675.35/183.42 >= [1] @ls + [1] 675.35/183.42 = [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))] 675.35/183.42 675.35/183.42 [lineMult(@n, @l1, @l2)] = [0] 675.35/183.42 ? [4] @n + [4] @l2 + [0] 675.35/183.42 = [lineMult#1(@l1, @l2, @n)] 675.35/183.42 675.35/183.42 [lineMult#2(nil(), @n, @x, @xs)] = [3] @xs + [0] 675.35/183.42 ? [1] 675.35/183.42 = [::(*(@x, @n), lineMult(@n, @xs, nil()))] 675.35/183.42 675.35/183.42 [lineMult#2(::(@y, @ys), @n, @x, @xs)] = [3] @xs + [0] 675.35/183.42 ? [1] 675.35/183.42 = [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))] 675.35/183.42 675.35/183.42 [#add(#pos(#s(#0())), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#succ(@y)] 675.35/183.42 675.35/183.42 [#add(#pos(#s(#s(@x))), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#succ(#add(#pos(#s(@x)), @y))] 675.35/183.42 675.35/183.42 [#add(#0(), @y)] = [0] 675.35/183.42 ? [1] @y + [0] 675.35/183.42 = [@y] 675.35/183.42 675.35/183.42 [#add(#neg(#s(#0())), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pred(@y)] 675.35/183.42 675.35/183.42 [#add(#neg(#s(#s(@x))), @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pred(#add(#pos(#s(@x)), @y))] 675.35/183.42 675.35/183.42 [dequeue(@outq, @inq)] = [7] @outq + [7] @inq + [1] 675.35/183.42 > [0] 675.35/183.42 = [dequeue#1(@outq, @inq)] 675.35/183.42 675.35/183.42 [computeLine(@line, @m, @acc)] = [4] @line + [0] 675.35/183.42 >= [0] 675.35/183.42 = [computeLine#1(@line, @acc, @m)] 675.35/183.42 675.35/183.42 [dequeue#1(nil(), @inq)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [dequeue#2(reverse(@inq))] 675.35/183.42 675.35/183.42 [dequeue#1(::(@t, @ts), @inq)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))] 675.35/183.42 675.35/183.42 [#mult(#pos(@x), #pos(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#natmult(@x, @y))] 675.35/183.42 675.35/183.42 [#mult(#pos(@x), #0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#pos(@x), #neg(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#natmult(@x, @y))] 675.35/183.42 675.35/183.42 [#mult(#0(), #pos(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#0(), #0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#0(), #neg(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#neg(@x), #pos(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#natmult(@x, @y))] 675.35/183.42 675.35/183.42 [#mult(#neg(@x), #0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#mult(#neg(@x), #neg(@y))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#natmult(@x, @y))] 675.35/183.42 675.35/183.42 [+(@x, @y)] = [7] @y + [7] 675.35/183.42 > [0] 675.35/183.42 = [#add(@x, @y)] 675.35/183.42 675.35/183.42 [#succ(#pos(#s(@x)))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#s(#s(@x)))] 675.35/183.42 675.35/183.42 [#succ(#0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#s(#0()))] 675.35/183.42 675.35/183.42 [#succ(#neg(#s(#0())))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#succ(#neg(#s(#s(@x))))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#s(@x))] 675.35/183.42 675.35/183.42 [enqueue#1(tuple#2(@outq, @inq), @t)] = [4] @t + [0] 675.35/183.42 >= [0] 675.35/183.42 = [tuple#2(@outq, ::(@t, @inq))] 675.35/183.42 675.35/183.42 [matrixMult(@m1, @m2)] = [1] @m1 + [0] 675.35/183.42 >= [1] @m1 + [0] 675.35/183.42 = [matrixMult#1(@m1, @m2)] 675.35/183.42 675.35/183.42 [*(@x, @y)] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#mult(@x, @y)] 675.35/183.42 675.35/183.42 [enqueue(@t, @queue)] = [4] @t + [0] 675.35/183.42 ? [4] @t + [4] @queue + [0] 675.35/183.42 = [enqueue#1(@queue, @t)] 675.35/183.42 675.35/183.42 [dequeue#2(nil())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [tuple#2(nil(), tuple#2(nil(), nil()))] 675.35/183.42 675.35/183.42 [dequeue#2(::(@t, @ts))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))] 675.35/183.42 675.35/183.42 [#pred(#pos(#s(#0())))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#0()] 675.35/183.42 675.35/183.42 [#pred(#pos(#s(#s(@x))))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#pos(#s(@x))] 675.35/183.42 675.35/183.42 [#pred(#0())] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#s(#0()))] 675.35/183.42 675.35/183.42 [#pred(#neg(#s(@x)))] = [0] 675.35/183.42 >= [0] 675.35/183.42 = [#neg(#s(#s(@x)))] 675.35/183.42 675.35/183.43 [lineMult#1(nil(), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.43 >= [0] 675.35/183.43 = [nil()] 675.35/183.43 675.35/183.43 [lineMult#1(::(@x, @xs), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.43 ? [3] @xs + [0] 675.35/183.43 = [lineMult#2(@l2, @n, @x, @xs)] 675.35/183.43 675.35/183.43 [computeLine#2(nil(), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.43 >= [0] 675.35/183.43 = [nil()] 675.35/183.43 675.35/183.43 [computeLine#2(::(@l, @ls), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.43 >= [4] @xs + [0] 675.35/183.43 = [computeLine(@xs, @ls, lineMult(@x, @l, @acc))] 675.35/183.43 675.35/183.43 [bftMult'#5^#(@queue', @acc, @y)] = [1] @acc + [1] 675.35/183.43 >= [1] @acc + [1] 675.35/183.43 = [bftMult'^#(@queue', matrixMult(@acc, @y))] 675.35/183.43 675.35/183.43 [bftMult'#5^#(@queue', @acc, @y)] = [1] @acc + [1] 675.35/183.43 > [1] @acc + [0] 675.35/183.43 = [matrixMult^#(@acc, @y)] 675.35/183.43 675.35/183.43 [bftMult'^#(@queue, @acc)] = [1] @acc + [1] 675.35/183.43 >= [1] @acc + [1] 675.35/183.43 = [bftMult'#1^#(bftMult'#2(@queue), @acc)] 675.35/183.43 675.35/183.43 [matrixMult^#(@m1, @m2)] = [1] @m1 + [0] 675.35/183.43 >= [1] @m1 + [0] 675.35/183.43 = [c_7(matrixMult#1^#(@m1, @m2))] 675.35/183.43 675.35/183.43 [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] = [1] @acc + [1] 675.35/183.43 >= [1] @acc + [1] 675.35/183.43 = [bftMult'#4^#(@t, @acc, @queue)] 675.35/183.43 675.35/183.43 [bftMult'#4^#(leaf(), @acc, @queue)] = [1] @acc + [1] 675.35/183.43 >= [1] @acc + [1] 675.35/183.43 = [bftMult'^#(@queue, @acc)] 675.35/183.43 675.35/183.43 [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] = [1] @acc + [1] 675.35/183.43 >= [1] @acc + [1] 675.35/183.43 = [bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)] 675.35/183.43 675.35/183.43 [matrixMult#1^#(::(@l, @ls), @m2)] = [1] @ls + [1] 675.35/183.43 > [1] @ls + [0] 675.35/183.43 = [c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2))] 675.35/183.43 675.35/183.43 [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] = [1] @acc + [1] 675.35/183.43 >= [1] @acc + [1] 675.35/183.43 = [bftMult'#3^#(@elem, @acc, @queue)] 675.35/183.43 675.35/183.43 675.35/183.43 We return to the main proof. Consider the set of all dependency 675.35/183.43 pairs 675.35/183.43 675.35/183.43 : 675.35/183.43 { 1: matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.43 , 2: bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.43 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.43 , 3: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.43 , 4: bftMult'^#(@queue, @acc) -> 675.35/183.43 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.43 , 5: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.43 bftMult'#4^#(@t, @acc, @queue) 675.35/183.43 , 6: bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.43 , 7: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.43 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.43 , 8: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.43 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.43 , 9: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.43 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.43 675.35/183.43 Processor 'matrix interpretation of dimension 1' induces the 675.35/183.43 complexity certificate YES(?,O(n^1)) on application of dependency 675.35/183.43 pairs {3,8}. These cover all (indirect) predecessors of dependency 675.35/183.43 pairs {1,3,8}, their number of application is equally bounded. The 675.35/183.43 dependency pairs are shifted into the weak component. 675.35/183.43 675.35/183.43 We are left with following problem, upon which TcT provides the 675.35/183.43 certificate YES(O(1),O(1)). 675.35/183.43 675.35/183.43 Weak DPs: 675.35/183.43 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.43 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.43 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.43 , bftMult'^#(@queue, @acc) -> 675.35/183.43 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.43 , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.43 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.43 bftMult'#4^#(@t, @acc, @queue) 675.35/183.43 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.43 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.43 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.43 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.43 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.43 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.43 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.43 Weak Trs: 675.35/183.43 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.43 dequeue(@dequeue@1, @dequeue@2) 675.35/183.43 , #natmult(#0(), @y) -> #0() 675.35/183.43 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.43 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.43 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.43 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.43 appendreverse(@as, ::(@a, @sofar)) 675.35/183.43 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.43 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.43 computeLine#2(@m, @acc, @x, @xs) 675.35/183.43 , appendreverse(@toreverse, @sofar) -> 675.35/183.43 appendreverse#1(@toreverse, @sofar) 675.35/183.43 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.43 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.43 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.43 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.43 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.43 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.43 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.43 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.43 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.43 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.43 , #add(#0(), @y) -> @y 675.35/183.43 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.43 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.43 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.43 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.43 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.43 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.43 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.43 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.43 , #mult(#pos(@x), #0()) -> #0() 675.35/183.43 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.43 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.43 , #mult(#0(), #0()) -> #0() 675.35/183.43 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.43 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.43 , #mult(#neg(@x), #0()) -> #0() 675.35/183.43 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.43 , +(@x, @y) -> #add(@x, @y) 675.35/183.43 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.43 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.43 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.43 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.43 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.43 tuple#2(@outq, ::(@t, @inq)) 675.35/183.43 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.43 , *(@x, @y) -> #mult(@x, @y) 675.35/183.43 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.43 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.43 , dequeue#2(::(@t, @ts)) -> 675.35/183.43 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.43 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.43 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.43 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.43 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.43 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.43 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.43 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.43 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.43 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.43 Obligation: 675.35/183.43 innermost runtime complexity 675.35/183.43 Answer: 675.35/183.43 YES(O(1),O(1)) 675.35/183.43 675.35/183.43 The following weak DPs constitute a sub-graph of the DG that is 675.35/183.43 closed under successors. The DPs are removed. 675.35/183.43 675.35/183.43 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.43 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.43 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.43 , bftMult'^#(@queue, @acc) -> 675.35/183.43 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.43 , matrixMult^#(@m1, @m2) -> c_7(matrixMult#1^#(@m1, @m2)) 675.35/183.43 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.43 bftMult'#4^#(@t, @acc, @queue) 675.35/183.43 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.43 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.43 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.43 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.43 c_14(computeLine^#(@l, @m2, nil()), matrixMult^#(@ls, @m2)) 675.35/183.43 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.43 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.43 675.35/183.43 We are left with following problem, upon which TcT provides the 675.35/183.43 certificate YES(O(1),O(1)). 675.35/183.43 675.35/183.43 Weak Trs: 675.35/183.43 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.43 dequeue(@dequeue@1, @dequeue@2) 675.35/183.43 , #natmult(#0(), @y) -> #0() 675.35/183.43 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.43 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.43 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.43 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.43 appendreverse(@as, ::(@a, @sofar)) 675.35/183.43 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.43 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.43 computeLine#2(@m, @acc, @x, @xs) 675.35/183.43 , appendreverse(@toreverse, @sofar) -> 675.35/183.43 appendreverse#1(@toreverse, @sofar) 675.35/183.43 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.43 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.43 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.43 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.43 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.43 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.43 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.43 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.43 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.43 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.43 , #add(#0(), @y) -> @y 675.35/183.43 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.43 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.43 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.43 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.43 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.43 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.43 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.43 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.43 , #mult(#pos(@x), #0()) -> #0() 675.35/183.43 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.43 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.43 , #mult(#0(), #0()) -> #0() 675.35/183.43 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.43 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.43 , #mult(#neg(@x), #0()) -> #0() 675.35/183.43 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.43 , +(@x, @y) -> #add(@x, @y) 675.35/183.43 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.43 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.43 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.43 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.43 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.43 tuple#2(@outq, ::(@t, @inq)) 675.35/183.43 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.43 , *(@x, @y) -> #mult(@x, @y) 675.35/183.43 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.43 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.43 , dequeue#2(::(@t, @ts)) -> 675.35/183.43 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.43 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.43 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.43 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.43 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.43 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.43 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.43 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.43 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.43 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.43 Obligation: 675.35/183.43 innermost runtime complexity 675.35/183.43 Answer: 675.35/183.43 YES(O(1),O(1)) 675.35/183.43 675.35/183.43 No rule is usable, rules are removed from the input problem. 675.35/183.43 675.35/183.43 We are left with following problem, upon which TcT provides the 675.35/183.43 certificate YES(O(1),O(1)). 675.35/183.43 675.35/183.43 Rules: Empty 675.35/183.43 Obligation: 675.35/183.43 innermost runtime complexity 675.35/183.43 Answer: 675.35/183.43 YES(O(1),O(1)) 675.35/183.43 675.35/183.43 Empty rules are trivially bounded 675.35/183.43 675.35/183.43 We return to the main proof. 675.35/183.43 675.35/183.43 We are left with following problem, upon which TcT provides the 675.35/183.43 certificate YES(O(1),O(n^1)). 675.35/183.43 675.35/183.43 Strict DPs: 675.35/183.43 { computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.43 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.43 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.43 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.43 lineMult^#(@x, @l, @acc)) 675.35/183.43 , computeLine^#(@line, @m, @acc) -> 675.35/183.43 c_15(computeLine#1^#(@line, @acc, @m)) 675.35/183.43 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.43 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.43 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.43 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.43 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.43 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.43 c_20(lineMult^#(@n, @xs, @ys)) } 675.35/183.43 Weak DPs: 675.35/183.43 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.43 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.43 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.43 , bftMult'^#(@queue, @acc) -> 675.35/183.43 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.43 , matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2) 675.35/183.43 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.43 bftMult'#4^#(@t, @acc, @queue) 675.35/183.43 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.43 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.43 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.43 , matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2) 675.35/183.43 , matrixMult#1^#(::(@l, @ls), @m2) -> computeLine^#(@l, @m2, nil()) 675.35/183.43 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.43 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.43 Weak Trs: 675.35/183.43 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.43 dequeue(@dequeue@1, @dequeue@2) 675.35/183.43 , #natmult(#0(), @y) -> #0() 675.35/183.43 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.43 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.43 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.43 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.43 appendreverse(@as, ::(@a, @sofar)) 675.35/183.43 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.43 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.43 computeLine#2(@m, @acc, @x, @xs) 675.35/183.43 , appendreverse(@toreverse, @sofar) -> 675.35/183.43 appendreverse#1(@toreverse, @sofar) 675.35/183.43 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.43 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.43 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.43 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.43 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.43 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.43 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.43 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.43 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.43 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.43 , #add(#0(), @y) -> @y 675.35/183.43 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.43 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.43 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.43 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.43 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.43 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.43 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.43 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.43 , #mult(#pos(@x), #0()) -> #0() 675.35/183.43 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.43 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.43 , #mult(#0(), #0()) -> #0() 675.35/183.43 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.43 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.43 , #mult(#neg(@x), #0()) -> #0() 675.35/183.43 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.43 , +(@x, @y) -> #add(@x, @y) 675.35/183.43 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.43 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.43 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.43 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.43 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.43 tuple#2(@outq, ::(@t, @inq)) 675.35/183.43 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.43 , *(@x, @y) -> #mult(@x, @y) 675.35/183.43 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.43 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.43 , dequeue#2(::(@t, @ts)) -> 675.35/183.43 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.43 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.43 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.43 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.43 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.43 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.43 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.43 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.43 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.43 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.43 Obligation: 675.35/183.43 innermost runtime complexity 675.35/183.43 Answer: 675.35/183.43 YES(O(1),O(n^1)) 675.35/183.43 675.35/183.43 We use the processor 'matrix interpretation of dimension 1' to 675.35/183.43 orient following rules strictly. 675.35/183.43 675.35/183.43 DPs: 675.35/183.43 { 2: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.43 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.43 lineMult^#(@x, @l, @acc)) 675.35/183.43 , 5: lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.43 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.43 , 13: bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.43 bftMult'^#(@queue, @acc) 675.35/183.43 , 14: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.43 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) } 675.35/183.43 Trs: 675.35/183.43 { +(@x, @y) -> #add(@x, @y) 675.35/183.43 , *(@x, @y) -> #mult(@x, @y) } 675.35/183.43 675.35/183.43 Sub-proof: 675.35/183.43 ---------- 675.35/183.43 The following argument positions are usable: 675.35/183.43 Uargs(c_9) = {1}, Uargs(c_10) = {1, 2}, Uargs(c_15) = {1}, 675.35/183.43 Uargs(c_17) = {1}, Uargs(c_18) = {1}, Uargs(c_19) = {1}, 675.35/183.43 Uargs(c_20) = {1} 675.35/183.43 675.35/183.43 TcT has computed the following constructor-based matrix 675.35/183.43 interpretation satisfying not(EDA). 675.35/183.43 675.35/183.43 [bftMult'#2](x1) = [1] x1 + [0] 675.35/183.43 675.35/183.43 [#natmult](x1, x2) = [0] 675.35/183.43 675.35/183.43 [reverse](x1) = [1] x1 + [0] 675.35/183.43 675.35/183.43 [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.43 675.35/183.43 [computeLine#1](x1, x2, x3) = [0] 675.35/183.43 675.35/183.43 [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.43 675.35/183.43 [matrixMult#1](x1, x2) = [4] x2 + [0] 675.35/183.43 675.35/183.43 [leaf] = [0] 675.35/183.43 675.35/183.43 [lineMult](x1, x2, x3) = [0] 675.35/183.43 675.35/183.43 [lineMult#2](x1, x2, x3, x4) = [2] x4 + [0] 675.35/183.43 675.35/183.43 [#pos](x1) = [0] 675.35/183.43 675.35/183.43 [#add](x1, x2) = [0] 675.35/183.43 675.35/183.43 [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [4] 675.35/183.43 675.35/183.43 [dequeue](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.43 675.35/183.43 [tuple#2](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.43 675.35/183.43 [nil] = [0] 675.35/183.43 675.35/183.43 [computeLine](x1, x2, x3) = [4] x1 + [0] 675.35/183.43 675.35/183.43 [dequeue#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.43 675.35/183.43 [::](x1, x2) = [1] x1 + [1] x2 + [2] 675.35/183.43 675.35/183.43 [#mult](x1, x2) = [0] 675.35/183.43 675.35/183.43 [+](x1, x2) = [4] x2 + [2] 675.35/183.43 675.35/183.43 [#succ](x1) = [0] 675.35/183.43 675.35/183.43 [#0] = [0] 675.35/183.43 675.35/183.43 [enqueue#1](x1, x2) = [1] x1 + [1] x2 + [2] 675.35/183.43 675.35/183.43 [#neg](x1) = [0] 675.35/183.43 675.35/183.43 [matrixMult](x1, x2) = [3] x1 + [0] 675.35/183.43 675.35/183.43 [*](x1, x2) = [6] 675.35/183.43 675.35/183.43 [enqueue](x1, x2) = [1] x1 + [1] x2 + [2] 675.35/183.43 675.35/183.43 [dequeue#2](x1) = [1] x1 + [0] 675.35/183.43 675.35/183.43 [#pred](x1) = [0] 675.35/183.43 675.35/183.43 [lineMult#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.35/183.43 675.35/183.43 [#s](x1) = [0] 675.35/183.43 675.35/183.43 [computeLine#2](x1, x2, x3, x4) = [4] x2 + [4] x3 + [4] x4 + [0] 675.35/183.43 675.35/183.43 [bftMult'#5^#](x1, x2, x3) = [2] x1 + [2] x3 + [0] 675.35/183.43 675.35/183.43 [bftMult'^#](x1, x2) = [2] x1 + [0] 675.35/183.43 675.35/183.43 [matrixMult^#](x1, x2) = [2] x2 + [0] 675.35/183.43 675.35/183.43 [computeLine#1^#](x1, x2, x3) = [2] x3 + [0] 675.35/183.43 675.35/183.43 [computeLine#2^#](x1, x2, x3, x4) = [2] x1 + [0] 675.35/183.43 675.35/183.43 [bftMult'#3^#](x1, x2, x3) = [2] x1 + [2] x3 + [0] 675.35/183.43 675.35/183.43 [bftMult'#4^#](x1, x2, x3) = [2] x1 + [2] x3 + [4] 675.35/183.43 675.35/183.43 [matrixMult#1^#](x1, x2) = [2] x2 + [0] 675.35/183.43 675.35/183.43 [computeLine^#](x1, x2, x3) = [2] x2 + [0] 675.35/183.43 675.35/183.43 [lineMult^#](x1, x2, x3) = [2] x2 + [0] 675.35/183.43 675.35/183.43 [lineMult#1^#](x1, x2, x3) = [2] x1 + [0] 675.35/183.43 675.35/183.43 [lineMult#2^#](x1, x2, x3, x4) = [2] x3 + [2] x4 + [0] 675.35/183.43 675.35/183.43 [bftMult'#1^#](x1, x2) = [2] x1 + [0] 675.35/183.43 675.35/183.43 [c_9](x1) = [1] x1 + [0] 675.35/183.43 675.35/183.43 [c_10](x1, x2) = [1] x1 + [1] x2 + [3] 675.35/183.43 675.35/183.43 [c_15](x1) = [1] x1 + [0] 675.35/183.43 675.35/183.43 [c_17](x1) = [1] x1 + [0] 675.35/183.43 675.35/183.43 [c_18](x1) = [1] x1 + [1] 675.35/183.43 675.35/183.43 [c_19](x1) = [1] x1 + [0] 675.35/183.43 675.35/183.43 [c_20](x1) = [1] x1 + [0] 675.35/183.43 675.35/183.43 The order satisfies the following ordering constraints: 675.35/183.43 675.35/183.43 [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] = [1] @dequeue@1 + [1] @dequeue@2 + [0] 675.35/183.43 >= [1] @dequeue@1 + [1] @dequeue@2 + [0] 675.35/183.43 = [dequeue(@dequeue@1, @dequeue@2)] 675.35/183.43 675.35/183.43 [#natmult(#0(), @y)] = [0] 675.35/183.43 >= [0] 675.35/183.43 = [#0()] 675.35/183.43 675.35/183.43 [#natmult(#s(@x), @y)] = [0] 675.35/183.43 >= [0] 675.35/183.43 = [#add(#pos(@y), #natmult(@x, @y))] 675.35/183.43 675.35/183.43 [reverse(@xs)] = [1] @xs + [0] 675.35/183.43 >= [1] @xs + [0] 675.35/183.43 = [appendreverse(@xs, nil())] 675.35/183.43 675.35/183.43 [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] 675.35/183.43 >= [1] @sofar + [0] 675.35/183.44 = [@sofar] 675.35/183.44 675.35/183.44 [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [2] 675.35/183.44 >= [1] @sofar + [1] @a + [1] @as + [2] 675.35/183.44 = [appendreverse(@as, ::(@a, @sofar))] 675.35/183.44 675.35/183.44 [computeLine#1(nil(), @acc, @m)] = [0] 675.35/183.44 ? [1] @acc + [0] 675.35/183.44 = [@acc] 675.35/183.44 675.35/183.44 [computeLine#1(::(@x, @xs), @acc, @m)] = [0] 675.35/183.44 ? [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.44 = [computeLine#2(@m, @acc, @x, @xs)] 675.35/183.44 675.35/183.44 [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] 675.35/183.44 >= [1] @toreverse + [1] @sofar + [0] 675.35/183.44 = [appendreverse#1(@toreverse, @sofar)] 675.35/183.44 675.35/183.44 [matrixMult#1(nil(), @m2)] = [4] @m2 + [0] 675.35/183.44 >= [0] 675.35/183.44 = [nil()] 675.35/183.44 675.35/183.44 [matrixMult#1(::(@l, @ls), @m2)] = [4] @m2 + [0] 675.35/183.44 ? [4] @l + [3] @ls + [2] 675.35/183.44 = [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))] 675.35/183.44 675.35/183.44 [lineMult(@n, @l1, @l2)] = [0] 675.35/183.44 ? [4] @n + [4] @l2 + [0] 675.35/183.44 = [lineMult#1(@l1, @l2, @n)] 675.35/183.44 675.35/183.44 [lineMult#2(nil(), @n, @x, @xs)] = [2] @xs + [0] 675.35/183.44 ? [8] 675.35/183.44 = [::(*(@x, @n), lineMult(@n, @xs, nil()))] 675.35/183.44 675.35/183.44 [lineMult#2(::(@y, @ys), @n, @x, @xs)] = [2] @xs + [0] 675.35/183.44 ? [4] @y + [4] 675.35/183.44 = [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))] 675.35/183.44 675.35/183.44 [#add(#pos(#s(#0())), @y)] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#succ(@y)] 675.35/183.44 675.35/183.44 [#add(#pos(#s(#s(@x))), @y)] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#succ(#add(#pos(#s(@x)), @y))] 675.35/183.44 675.35/183.44 [#add(#0(), @y)] = [0] 675.35/183.44 ? [1] @y + [0] 675.35/183.44 = [@y] 675.35/183.44 675.35/183.44 [#add(#neg(#s(#0())), @y)] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#pred(@y)] 675.35/183.44 675.35/183.44 [#add(#neg(#s(#s(@x))), @y)] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#pred(#add(#pos(#s(@x)), @y))] 675.35/183.44 675.35/183.44 [dequeue(@outq, @inq)] = [1] @outq + [1] @inq + [0] 675.35/183.44 >= [1] @outq + [1] @inq + [0] 675.35/183.44 = [dequeue#1(@outq, @inq)] 675.35/183.44 675.35/183.44 [computeLine(@line, @m, @acc)] = [4] @line + [0] 675.35/183.44 >= [0] 675.35/183.44 = [computeLine#1(@line, @acc, @m)] 675.35/183.44 675.35/183.44 [dequeue#1(nil(), @inq)] = [1] @inq + [0] 675.35/183.44 >= [1] @inq + [0] 675.35/183.44 = [dequeue#2(reverse(@inq))] 675.35/183.44 675.35/183.44 [dequeue#1(::(@t, @ts), @inq)] = [1] @t + [1] @inq + [1] @ts + [2] 675.35/183.44 >= [1] @t + [1] @inq + [1] @ts + [2] 675.35/183.44 = [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))] 675.35/183.44 675.35/183.44 [#mult(#pos(@x), #pos(@y))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#pos(#natmult(@x, @y))] 675.35/183.44 675.35/183.44 [#mult(#pos(@x), #0())] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#0()] 675.35/183.44 675.35/183.44 [#mult(#pos(@x), #neg(@y))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#neg(#natmult(@x, @y))] 675.35/183.44 675.35/183.44 [#mult(#0(), #pos(@y))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#0()] 675.35/183.44 675.35/183.44 [#mult(#0(), #0())] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#0()] 675.35/183.44 675.35/183.44 [#mult(#0(), #neg(@y))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#0()] 675.35/183.44 675.35/183.44 [#mult(#neg(@x), #pos(@y))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#neg(#natmult(@x, @y))] 675.35/183.44 675.35/183.44 [#mult(#neg(@x), #0())] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#0()] 675.35/183.44 675.35/183.44 [#mult(#neg(@x), #neg(@y))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#pos(#natmult(@x, @y))] 675.35/183.44 675.35/183.44 [+(@x, @y)] = [4] @y + [2] 675.35/183.44 > [0] 675.35/183.44 = [#add(@x, @y)] 675.35/183.44 675.35/183.44 [#succ(#pos(#s(@x)))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#pos(#s(#s(@x)))] 675.35/183.44 675.35/183.44 [#succ(#0())] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#pos(#s(#0()))] 675.35/183.44 675.35/183.44 [#succ(#neg(#s(#0())))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#0()] 675.35/183.44 675.35/183.44 [#succ(#neg(#s(#s(@x))))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#neg(#s(@x))] 675.35/183.44 675.35/183.44 [enqueue#1(tuple#2(@outq, @inq), @t)] = [1] @t + [1] @outq + [1] @inq + [2] 675.35/183.44 >= [1] @t + [1] @outq + [1] @inq + [2] 675.35/183.44 = [tuple#2(@outq, ::(@t, @inq))] 675.35/183.44 675.35/183.44 [matrixMult(@m1, @m2)] = [3] @m1 + [0] 675.35/183.44 ? [4] @m2 + [0] 675.35/183.44 = [matrixMult#1(@m1, @m2)] 675.35/183.44 675.35/183.44 [*(@x, @y)] = [6] 675.35/183.44 > [0] 675.35/183.44 = [#mult(@x, @y)] 675.35/183.44 675.35/183.44 [enqueue(@t, @queue)] = [1] @t + [1] @queue + [2] 675.35/183.44 >= [1] @t + [1] @queue + [2] 675.35/183.44 = [enqueue#1(@queue, @t)] 675.35/183.44 675.35/183.44 [dequeue#2(nil())] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [tuple#2(nil(), tuple#2(nil(), nil()))] 675.35/183.44 675.35/183.44 [dequeue#2(::(@t, @ts))] = [1] @t + [1] @ts + [2] 675.35/183.44 >= [1] @t + [1] @ts + [2] 675.35/183.44 = [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))] 675.35/183.44 675.35/183.44 [#pred(#pos(#s(#0())))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#0()] 675.35/183.44 675.35/183.44 [#pred(#pos(#s(#s(@x))))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#pos(#s(@x))] 675.35/183.44 675.35/183.44 [#pred(#0())] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#neg(#s(#0()))] 675.35/183.44 675.35/183.44 [#pred(#neg(#s(@x)))] = [0] 675.35/183.44 >= [0] 675.35/183.44 = [#neg(#s(#s(@x)))] 675.35/183.44 675.35/183.44 [lineMult#1(nil(), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.44 >= [0] 675.35/183.44 = [nil()] 675.35/183.44 675.35/183.44 [lineMult#1(::(@x, @xs), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.44 ? [2] @xs + [0] 675.35/183.44 = [lineMult#2(@l2, @n, @x, @xs)] 675.35/183.44 675.35/183.44 [computeLine#2(nil(), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.44 >= [0] 675.35/183.44 = [nil()] 675.35/183.44 675.35/183.44 [computeLine#2(::(@l, @ls), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.44 >= [4] @xs + [0] 675.35/183.44 = [computeLine(@xs, @ls, lineMult(@x, @l, @acc))] 675.35/183.44 675.35/183.44 [bftMult'#5^#(@queue', @acc, @y)] = [2] @y + [2] @queue' + [0] 675.35/183.44 >= [2] @queue' + [0] 675.35/183.44 = [bftMult'^#(@queue', matrixMult(@acc, @y))] 675.35/183.44 675.35/183.44 [bftMult'#5^#(@queue', @acc, @y)] = [2] @y + [2] @queue' + [0] 675.35/183.44 >= [2] @y + [0] 675.35/183.44 = [matrixMult^#(@acc, @y)] 675.35/183.44 675.35/183.44 [bftMult'^#(@queue, @acc)] = [2] @queue + [0] 675.35/183.44 >= [2] @queue + [0] 675.35/183.44 = [bftMult'#1^#(bftMult'#2(@queue), @acc)] 675.35/183.44 675.35/183.44 [matrixMult^#(@m1, @m2)] = [2] @m2 + [0] 675.35/183.44 >= [2] @m2 + [0] 675.35/183.44 = [matrixMult#1^#(@m1, @m2)] 675.35/183.44 675.35/183.44 [computeLine#1^#(::(@x, @xs), @acc, @m)] = [2] @m + [0] 675.35/183.44 >= [2] @m + [0] 675.35/183.44 = [c_9(computeLine#2^#(@m, @acc, @x, @xs))] 675.35/183.44 675.35/183.44 [computeLine#2^#(::(@l, @ls), @acc, @x, @xs)] = [2] @l + [2] @ls + [4] 675.35/183.44 > [2] @l + [2] @ls + [3] 675.35/183.44 = [c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.44 lineMult^#(@x, @l, @acc))] 675.35/183.44 675.35/183.44 [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] = [2] @t + [2] @queue + [2] @_@3 + [4] 675.35/183.44 >= [2] @t + [2] @queue + [4] 675.35/183.44 = [bftMult'#4^#(@t, @acc, @queue)] 675.35/183.44 675.35/183.44 [bftMult'#4^#(leaf(), @acc, @queue)] = [2] @queue + [4] 675.35/183.44 > [2] @queue + [0] 675.35/183.44 = [bftMult'^#(@queue, @acc)] 675.35/183.44 675.35/183.44 [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] = [2] @y + [2] @queue + [2] @t1 + [2] @t2 + [12] 675.35/183.44 > [2] @y + [2] @queue + [2] @t1 + [2] @t2 + [8] 675.35/183.44 = [bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)] 675.35/183.44 675.35/183.44 [matrixMult#1^#(::(@l, @ls), @m2)] = [2] @m2 + [0] 675.35/183.44 >= [2] @m2 + [0] 675.35/183.44 = [matrixMult^#(@ls, @m2)] 675.35/183.44 675.35/183.44 [matrixMult#1^#(::(@l, @ls), @m2)] = [2] @m2 + [0] 675.35/183.44 >= [2] @m2 + [0] 675.35/183.44 = [computeLine^#(@l, @m2, nil())] 675.35/183.44 675.35/183.44 [computeLine^#(@line, @m, @acc)] = [2] @m + [0] 675.35/183.44 >= [2] @m + [0] 675.35/183.44 = [c_15(computeLine#1^#(@line, @acc, @m))] 675.35/183.44 675.35/183.44 [lineMult^#(@n, @l1, @l2)] = [2] @l1 + [0] 675.35/183.44 >= [2] @l1 + [0] 675.35/183.44 = [c_17(lineMult#1^#(@l1, @l2, @n))] 675.35/183.44 675.35/183.44 [lineMult#1^#(::(@x, @xs), @l2, @n)] = [2] @x + [2] @xs + [4] 675.35/183.44 > [2] @x + [2] @xs + [1] 675.35/183.44 = [c_18(lineMult#2^#(@l2, @n, @x, @xs))] 675.35/183.44 675.35/183.44 [lineMult#2^#(nil(), @n, @x, @xs)] = [2] @x + [2] @xs + [0] 675.35/183.44 >= [2] @xs + [0] 675.35/183.44 = [c_19(lineMult^#(@n, @xs, nil()))] 675.35/183.44 675.35/183.44 [lineMult#2^#(::(@y, @ys), @n, @x, @xs)] = [2] @x + [2] @xs + [0] 675.35/183.44 >= [2] @xs + [0] 675.35/183.44 = [c_20(lineMult^#(@n, @xs, @ys))] 675.35/183.44 675.35/183.44 [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] = [2] @queue + [2] @elem + [0] 675.35/183.44 >= [2] @queue + [2] @elem + [0] 675.35/183.44 = [bftMult'#3^#(@elem, @acc, @queue)] 675.35/183.44 675.35/183.44 675.35/183.44 We return to the main proof. Consider the set of all dependency 675.35/183.44 pairs 675.35/183.44 675.35/183.44 : 675.35/183.44 { 1: computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.44 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.44 , 2: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.44 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.44 lineMult^#(@x, @l, @acc)) 675.35/183.44 , 3: computeLine^#(@line, @m, @acc) -> 675.35/183.44 c_15(computeLine#1^#(@line, @acc, @m)) 675.35/183.44 , 4: lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.44 , 5: lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.44 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.44 , 6: lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.44 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.44 , 7: lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.44 c_20(lineMult^#(@n, @xs, @ys)) 675.35/183.44 , 8: bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.44 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.44 , 9: bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.44 , 10: bftMult'^#(@queue, @acc) -> 675.35/183.44 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.44 , 11: matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2) 675.35/183.44 , 12: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.44 bftMult'#4^#(@t, @acc, @queue) 675.35/183.44 , 13: bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.44 bftMult'^#(@queue, @acc) 675.35/183.44 , 14: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.44 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.44 , 15: matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2) 675.35/183.44 , 16: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.44 computeLine^#(@l, @m2, nil()) 675.35/183.44 , 17: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.44 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.44 675.35/183.44 Processor 'matrix interpretation of dimension 1' induces the 675.35/183.44 complexity certificate YES(?,O(n^1)) on application of dependency 675.35/183.44 pairs {2,5,13,14}. These cover all (indirect) predecessors of 675.35/183.44 dependency pairs {2,4,5,6,7,8,9,10,12,13,14,17}, their number of 675.35/183.44 application is equally bounded. The dependency pairs are shifted 675.35/183.44 into the weak component. 675.35/183.44 675.35/183.44 We are left with following problem, upon which TcT provides the 675.35/183.44 certificate YES(O(1),O(n^1)). 675.35/183.44 675.35/183.44 Strict DPs: 675.35/183.44 { computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.44 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.44 , computeLine^#(@line, @m, @acc) -> 675.35/183.44 c_15(computeLine#1^#(@line, @acc, @m)) } 675.35/183.44 Weak DPs: 675.35/183.44 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.44 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.44 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.44 , bftMult'^#(@queue, @acc) -> 675.35/183.44 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.44 , matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2) 675.35/183.44 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.44 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.44 lineMult^#(@x, @l, @acc)) 675.35/183.44 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.44 bftMult'#4^#(@t, @acc, @queue) 675.35/183.44 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.44 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.44 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.44 , matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2) 675.35/183.44 , matrixMult#1^#(::(@l, @ls), @m2) -> computeLine^#(@l, @m2, nil()) 675.35/183.44 , lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.44 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.44 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.44 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.44 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.44 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.44 c_20(lineMult^#(@n, @xs, @ys)) 675.35/183.44 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.44 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.44 Weak Trs: 675.35/183.44 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.44 dequeue(@dequeue@1, @dequeue@2) 675.35/183.44 , #natmult(#0(), @y) -> #0() 675.35/183.44 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.44 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.44 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.44 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.44 appendreverse(@as, ::(@a, @sofar)) 675.35/183.44 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.44 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.44 computeLine#2(@m, @acc, @x, @xs) 675.35/183.44 , appendreverse(@toreverse, @sofar) -> 675.35/183.44 appendreverse#1(@toreverse, @sofar) 675.35/183.44 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.44 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.44 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.44 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.44 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.44 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.44 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.44 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.44 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.45 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.45 , #add(#0(), @y) -> @y 675.35/183.45 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.45 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.45 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.45 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.45 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.45 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.45 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.45 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.45 , #mult(#pos(@x), #0()) -> #0() 675.35/183.45 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.45 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.45 , #mult(#0(), #0()) -> #0() 675.35/183.45 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.45 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.45 , #mult(#neg(@x), #0()) -> #0() 675.35/183.45 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.45 , +(@x, @y) -> #add(@x, @y) 675.35/183.45 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.45 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.45 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.45 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.45 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.45 tuple#2(@outq, ::(@t, @inq)) 675.35/183.45 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.45 , *(@x, @y) -> #mult(@x, @y) 675.35/183.45 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.45 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.45 , dequeue#2(::(@t, @ts)) -> 675.35/183.45 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.45 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.45 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.45 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.45 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.45 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.45 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.45 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.45 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.45 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.45 Obligation: 675.35/183.45 innermost runtime complexity 675.35/183.45 Answer: 675.35/183.45 YES(O(1),O(n^1)) 675.35/183.45 675.35/183.45 The following weak DPs constitute a sub-graph of the DG that is 675.35/183.45 closed under successors. The DPs are removed. 675.35/183.45 675.35/183.45 { lineMult^#(@n, @l1, @l2) -> c_17(lineMult#1^#(@l1, @l2, @n)) 675.35/183.45 , lineMult#1^#(::(@x, @xs), @l2, @n) -> 675.35/183.45 c_18(lineMult#2^#(@l2, @n, @x, @xs)) 675.35/183.45 , lineMult#2^#(nil(), @n, @x, @xs) -> 675.35/183.45 c_19(lineMult^#(@n, @xs, nil())) 675.35/183.45 , lineMult#2^#(::(@y, @ys), @n, @x, @xs) -> 675.35/183.45 c_20(lineMult^#(@n, @xs, @ys)) } 675.35/183.45 675.35/183.45 We are left with following problem, upon which TcT provides the 675.35/183.45 certificate YES(O(1),O(n^1)). 675.35/183.45 675.35/183.45 Strict DPs: 675.35/183.45 { computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.45 c_9(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.45 , computeLine^#(@line, @m, @acc) -> 675.35/183.45 c_15(computeLine#1^#(@line, @acc, @m)) } 675.35/183.45 Weak DPs: 675.35/183.45 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.45 bftMult'^#(@queue', matrixMult(@acc, @y)) 675.35/183.45 , bftMult'#5^#(@queue', @acc, @y) -> matrixMult^#(@acc, @y) 675.35/183.45 , bftMult'^#(@queue, @acc) -> 675.35/183.45 bftMult'#1^#(bftMult'#2(@queue), @acc) 675.35/183.45 , matrixMult^#(@m1, @m2) -> matrixMult#1^#(@m1, @m2) 675.35/183.45 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.45 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.45 lineMult^#(@x, @l, @acc)) 675.35/183.45 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.45 bftMult'#4^#(@t, @acc, @queue) 675.35/183.45 , bftMult'#4^#(leaf(), @acc, @queue) -> bftMult'^#(@queue, @acc) 675.35/183.45 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.45 bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y) 675.35/183.45 , matrixMult#1^#(::(@l, @ls), @m2) -> matrixMult^#(@ls, @m2) 675.35/183.45 , matrixMult#1^#(::(@l, @ls), @m2) -> computeLine^#(@l, @m2, nil()) 675.35/183.45 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.45 bftMult'#3^#(@elem, @acc, @queue) } 675.35/183.45 Weak Trs: 675.35/183.45 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.45 dequeue(@dequeue@1, @dequeue@2) 675.35/183.45 , #natmult(#0(), @y) -> #0() 675.35/183.45 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.45 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.45 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.45 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.45 appendreverse(@as, ::(@a, @sofar)) 675.35/183.45 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.45 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.45 computeLine#2(@m, @acc, @x, @xs) 675.35/183.45 , appendreverse(@toreverse, @sofar) -> 675.35/183.45 appendreverse#1(@toreverse, @sofar) 675.35/183.45 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.45 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.45 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.45 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.45 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.45 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.45 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.45 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.45 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.45 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.45 , #add(#0(), @y) -> @y 675.35/183.45 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.45 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.45 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.45 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.45 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.45 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.45 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.45 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.45 , #mult(#pos(@x), #0()) -> #0() 675.35/183.45 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.45 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.45 , #mult(#0(), #0()) -> #0() 675.35/183.45 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.45 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.45 , #mult(#neg(@x), #0()) -> #0() 675.35/183.45 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.45 , +(@x, @y) -> #add(@x, @y) 675.35/183.45 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.45 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.45 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.45 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.45 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.45 tuple#2(@outq, ::(@t, @inq)) 675.35/183.45 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.45 , *(@x, @y) -> #mult(@x, @y) 675.35/183.45 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.45 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.45 , dequeue#2(::(@t, @ts)) -> 675.35/183.45 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.45 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.45 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.45 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.45 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.45 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.45 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.45 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.45 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.45 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.45 Obligation: 675.35/183.45 innermost runtime complexity 675.35/183.45 Answer: 675.35/183.45 YES(O(1),O(n^1)) 675.35/183.45 675.35/183.45 Due to missing edges in the dependency-graph, the right-hand sides 675.35/183.45 of following rules could be simplified: 675.35/183.45 675.35/183.45 { computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.45 c_10(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)), 675.35/183.45 lineMult^#(@x, @l, @acc)) } 675.35/183.45 675.35/183.45 We are left with following problem, upon which TcT provides the 675.35/183.45 certificate YES(O(1),O(n^1)). 675.35/183.45 675.35/183.45 Strict DPs: 675.35/183.45 { computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.45 c_1(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.45 , computeLine^#(@line, @m, @acc) -> 675.35/183.45 c_2(computeLine#1^#(@line, @acc, @m)) } 675.35/183.45 Weak DPs: 675.35/183.45 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.45 c_3(bftMult'^#(@queue', matrixMult(@acc, @y))) 675.35/183.45 , bftMult'#5^#(@queue', @acc, @y) -> c_4(matrixMult^#(@acc, @y)) 675.35/183.45 , bftMult'^#(@queue, @acc) -> 675.35/183.45 c_5(bftMult'#1^#(bftMult'#2(@queue), @acc)) 675.35/183.45 , matrixMult^#(@m1, @m2) -> c_6(matrixMult#1^#(@m1, @m2)) 675.35/183.45 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.45 c_7(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc))) 675.35/183.45 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.45 c_8(bftMult'#4^#(@t, @acc, @queue)) 675.35/183.45 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.45 c_9(bftMult'^#(@queue, @acc)) 675.35/183.45 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.45 c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.35/183.45 , matrixMult#1^#(::(@l, @ls), @m2) -> c_11(matrixMult^#(@ls, @m2)) 675.35/183.45 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.45 c_12(computeLine^#(@l, @m2, nil())) 675.35/183.45 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.45 c_13(bftMult'#3^#(@elem, @acc, @queue)) } 675.35/183.45 Weak Trs: 675.35/183.45 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.45 dequeue(@dequeue@1, @dequeue@2) 675.35/183.45 , #natmult(#0(), @y) -> #0() 675.35/183.45 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.45 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.45 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.45 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.45 appendreverse(@as, ::(@a, @sofar)) 675.35/183.45 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.45 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.45 computeLine#2(@m, @acc, @x, @xs) 675.35/183.45 , appendreverse(@toreverse, @sofar) -> 675.35/183.45 appendreverse#1(@toreverse, @sofar) 675.35/183.45 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.45 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.45 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.45 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.45 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.45 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.45 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.45 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.45 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.45 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.45 , #add(#0(), @y) -> @y 675.35/183.45 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.45 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.45 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.45 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.45 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.45 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.45 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.45 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.45 , #mult(#pos(@x), #0()) -> #0() 675.35/183.45 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.45 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.45 , #mult(#0(), #0()) -> #0() 675.35/183.45 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.45 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.45 , #mult(#neg(@x), #0()) -> #0() 675.35/183.45 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.45 , +(@x, @y) -> #add(@x, @y) 675.35/183.45 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.45 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.45 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.45 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.45 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.45 tuple#2(@outq, ::(@t, @inq)) 675.35/183.45 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.45 , *(@x, @y) -> #mult(@x, @y) 675.35/183.45 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.45 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.45 , dequeue#2(::(@t, @ts)) -> 675.35/183.45 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.45 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.45 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.45 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.45 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.45 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.45 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.45 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.45 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.45 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.45 Obligation: 675.35/183.45 innermost runtime complexity 675.35/183.45 Answer: 675.35/183.45 YES(O(1),O(n^1)) 675.35/183.45 675.35/183.45 We use the processor 'matrix interpretation of dimension 1' to 675.35/183.45 orient following rules strictly. 675.35/183.45 675.35/183.45 DPs: 675.35/183.45 { 1: computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.45 c_1(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.45 , 9: bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.45 c_9(bftMult'^#(@queue, @acc)) } 675.35/183.45 Trs: 675.35/183.45 { +(@x, @y) -> #add(@x, @y) 675.35/183.45 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) } 675.35/183.45 675.35/183.45 Sub-proof: 675.35/183.45 ---------- 675.35/183.45 The following argument positions are usable: 675.35/183.45 Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_3) = {1}, 675.35/183.45 Uargs(c_4) = {1}, Uargs(c_5) = {1}, Uargs(c_6) = {1}, 675.35/183.45 Uargs(c_7) = {1}, Uargs(c_8) = {1}, Uargs(c_9) = {1}, 675.35/183.45 Uargs(c_10) = {1}, Uargs(c_11) = {1}, Uargs(c_12) = {1}, 675.35/183.45 Uargs(c_13) = {1} 675.35/183.45 675.35/183.45 TcT has computed the following constructor-based matrix 675.35/183.45 interpretation satisfying not(EDA). 675.35/183.45 675.35/183.45 [bftMult'#2](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [#natmult](x1, x2) = [0] 675.35/183.45 675.35/183.45 [reverse](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.45 675.35/183.45 [computeLine#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.35/183.45 675.35/183.45 [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.45 675.35/183.45 [matrixMult#1](x1, x2) = [4] x2 + [0] 675.35/183.45 675.35/183.45 [leaf] = [2] 675.35/183.45 675.35/183.45 [lineMult](x1, x2, x3) = [0] 675.35/183.45 675.35/183.45 [lineMult#2](x1, x2, x3, x4) = [2] x4 + [0] 675.35/183.45 675.35/183.45 [#pos](x1) = [0] 675.35/183.45 675.35/183.45 [#add](x1, x2) = [0] 675.35/183.45 675.35/183.45 [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [6] 675.35/183.45 675.35/183.45 [dequeue](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.45 675.35/183.45 [tuple#2](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.45 675.35/183.45 [nil] = [0] 675.35/183.45 675.35/183.45 [computeLine](x1, x2, x3) = [4] x1 + [0] 675.35/183.45 675.35/183.45 [dequeue#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.45 675.35/183.45 [::](x1, x2) = [1] x1 + [1] x2 + [2] 675.35/183.45 675.35/183.45 [#mult](x1, x2) = [0] 675.35/183.45 675.35/183.45 [+](x1, x2) = [4] x2 + [2] 675.35/183.45 675.35/183.45 [#succ](x1) = [0] 675.35/183.45 675.35/183.45 [#0] = [0] 675.35/183.45 675.35/183.45 [enqueue#1](x1, x2) = [1] x1 + [1] x2 + [2] 675.35/183.45 675.35/183.45 [#neg](x1) = [0] 675.35/183.45 675.35/183.45 [matrixMult](x1, x2) = [0] 675.35/183.45 675.35/183.45 [*](x1, x2) = [0] 675.35/183.45 675.35/183.45 [enqueue](x1, x2) = [1] x1 + [1] x2 + [4] 675.35/183.45 675.35/183.45 [dequeue#2](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [#pred](x1) = [0] 675.35/183.45 675.35/183.45 [lineMult#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.35/183.45 675.35/183.45 [#s](x1) = [0] 675.35/183.45 675.35/183.45 [computeLine#2](x1, x2, x3, x4) = [4] x2 + [4] x3 + [4] x4 + [0] 675.35/183.45 675.35/183.45 [bftMult'#5^#](x1, x2, x3) = [1] x1 + [1] x3 + [4] 675.35/183.45 675.35/183.45 [bftMult'^#](x1, x2) = [1] x1 + [4] 675.35/183.45 675.35/183.45 [matrixMult^#](x1, x2) = [1] x2 + [4] 675.35/183.45 675.35/183.45 [computeLine#1^#](x1, x2, x3) = [1] x3 + [4] 675.35/183.45 675.35/183.45 [computeLine#2^#](x1, x2, x3, x4) = [1] x1 + [2] 675.35/183.45 675.35/183.45 [bftMult'#3^#](x1, x2, x3) = [1] x1 + [1] x3 + [4] 675.35/183.45 675.35/183.45 [bftMult'#4^#](x1, x2, x3) = [1] x1 + [1] x3 + [6] 675.35/183.45 675.35/183.45 [matrixMult#1^#](x1, x2) = [1] x2 + [4] 675.35/183.45 675.35/183.45 [computeLine^#](x1, x2, x3) = [1] x2 + [4] 675.35/183.45 675.35/183.45 [lineMult^#](x1, x2, x3) = [7] x1 + [7] x2 + [7] x3 + [0] 675.35/183.45 675.35/183.45 [lineMult#1^#](x1, x2, x3) = [7] x1 + [7] x2 + [7] x3 + [0] 675.35/183.45 675.35/183.45 [lineMult#2^#](x1, x2, x3, x4) = [7] x1 + [7] x2 + [7] x3 + [7] x4 + [0] 675.35/183.45 675.35/183.45 [bftMult'#1^#](x1, x2) = [1] x1 + [4] 675.35/183.45 675.35/183.45 [c_9](x1) = [7] x1 + [0] 675.35/183.45 675.35/183.45 [c_10](x1, x2) = [7] x1 + [7] x2 + [0] 675.35/183.45 675.35/183.45 [c_15](x1) = [7] x1 + [0] 675.35/183.45 675.35/183.45 [c_17](x1) = [7] x1 + [0] 675.35/183.45 675.35/183.45 [c_18](x1) = [7] x1 + [0] 675.35/183.45 675.35/183.45 [c_19](x1) = [7] x1 + [0] 675.35/183.45 675.35/183.45 [c_20](x1) = [7] x1 + [0] 675.35/183.45 675.35/183.45 [c] = [0] 675.35/183.45 675.35/183.45 [c_1](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_2](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_3](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_4](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_5](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_6](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_7](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_8](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_9](x1) = [1] x1 + [3] 675.35/183.45 675.35/183.45 [c_10](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_11](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_12](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 [c_13](x1) = [1] x1 + [0] 675.35/183.45 675.35/183.45 The order satisfies the following ordering constraints: 675.35/183.45 675.35/183.45 [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] = [1] @dequeue@1 + [1] @dequeue@2 + [0] 675.35/183.45 >= [1] @dequeue@1 + [1] @dequeue@2 + [0] 675.35/183.45 = [dequeue(@dequeue@1, @dequeue@2)] 675.35/183.45 675.35/183.45 [#natmult(#0(), @y)] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#0()] 675.35/183.45 675.35/183.45 [#natmult(#s(@x), @y)] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#add(#pos(@y), #natmult(@x, @y))] 675.35/183.45 675.35/183.45 [reverse(@xs)] = [1] @xs + [0] 675.35/183.45 >= [1] @xs + [0] 675.35/183.45 = [appendreverse(@xs, nil())] 675.35/183.45 675.35/183.45 [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] 675.35/183.45 >= [1] @sofar + [0] 675.35/183.45 = [@sofar] 675.35/183.45 675.35/183.45 [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [2] 675.35/183.45 >= [1] @sofar + [1] @a + [1] @as + [2] 675.35/183.45 = [appendreverse(@as, ::(@a, @sofar))] 675.35/183.45 675.35/183.45 [computeLine#1(nil(), @acc, @m)] = [4] @acc + [4] @m + [0] 675.35/183.45 >= [1] @acc + [0] 675.35/183.45 = [@acc] 675.35/183.45 675.35/183.45 [computeLine#1(::(@x, @xs), @acc, @m)] = [4] @acc + [4] @m + [0] 675.35/183.45 ? [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.45 = [computeLine#2(@m, @acc, @x, @xs)] 675.35/183.45 675.35/183.45 [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] 675.35/183.45 >= [1] @toreverse + [1] @sofar + [0] 675.35/183.45 = [appendreverse#1(@toreverse, @sofar)] 675.35/183.45 675.35/183.45 [matrixMult#1(nil(), @m2)] = [4] @m2 + [0] 675.35/183.45 >= [0] 675.35/183.45 = [nil()] 675.35/183.45 675.35/183.45 [matrixMult#1(::(@l, @ls), @m2)] = [4] @m2 + [0] 675.35/183.45 ? [4] @l + [2] 675.35/183.45 = [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))] 675.35/183.45 675.35/183.45 [lineMult(@n, @l1, @l2)] = [0] 675.35/183.45 ? [4] @n + [4] @l2 + [0] 675.35/183.45 = [lineMult#1(@l1, @l2, @n)] 675.35/183.45 675.35/183.45 [lineMult#2(nil(), @n, @x, @xs)] = [2] @xs + [0] 675.35/183.45 ? [2] 675.35/183.45 = [::(*(@x, @n), lineMult(@n, @xs, nil()))] 675.35/183.45 675.35/183.45 [lineMult#2(::(@y, @ys), @n, @x, @xs)] = [2] @xs + [0] 675.35/183.45 ? [4] @y + [4] 675.35/183.45 = [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))] 675.35/183.45 675.35/183.45 [#add(#pos(#s(#0())), @y)] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#succ(@y)] 675.35/183.45 675.35/183.45 [#add(#pos(#s(#s(@x))), @y)] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#succ(#add(#pos(#s(@x)), @y))] 675.35/183.45 675.35/183.45 [#add(#0(), @y)] = [0] 675.35/183.45 ? [1] @y + [0] 675.35/183.45 = [@y] 675.35/183.45 675.35/183.45 [#add(#neg(#s(#0())), @y)] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#pred(@y)] 675.35/183.45 675.35/183.45 [#add(#neg(#s(#s(@x))), @y)] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#pred(#add(#pos(#s(@x)), @y))] 675.35/183.45 675.35/183.45 [dequeue(@outq, @inq)] = [1] @outq + [1] @inq + [0] 675.35/183.45 >= [1] @outq + [1] @inq + [0] 675.35/183.45 = [dequeue#1(@outq, @inq)] 675.35/183.45 675.35/183.45 [computeLine(@line, @m, @acc)] = [4] @line + [0] 675.35/183.45 ? [4] @acc + [4] @m + [0] 675.35/183.45 = [computeLine#1(@line, @acc, @m)] 675.35/183.45 675.35/183.45 [dequeue#1(nil(), @inq)] = [1] @inq + [0] 675.35/183.45 >= [1] @inq + [0] 675.35/183.45 = [dequeue#2(reverse(@inq))] 675.35/183.45 675.35/183.45 [dequeue#1(::(@t, @ts), @inq)] = [1] @t + [1] @inq + [1] @ts + [2] 675.35/183.45 >= [1] @t + [1] @inq + [1] @ts + [2] 675.35/183.45 = [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))] 675.35/183.45 675.35/183.45 [#mult(#pos(@x), #pos(@y))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#pos(#natmult(@x, @y))] 675.35/183.45 675.35/183.45 [#mult(#pos(@x), #0())] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#0()] 675.35/183.45 675.35/183.45 [#mult(#pos(@x), #neg(@y))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#neg(#natmult(@x, @y))] 675.35/183.45 675.35/183.45 [#mult(#0(), #pos(@y))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#0()] 675.35/183.45 675.35/183.45 [#mult(#0(), #0())] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#0()] 675.35/183.45 675.35/183.45 [#mult(#0(), #neg(@y))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#0()] 675.35/183.45 675.35/183.45 [#mult(#neg(@x), #pos(@y))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#neg(#natmult(@x, @y))] 675.35/183.45 675.35/183.45 [#mult(#neg(@x), #0())] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#0()] 675.35/183.45 675.35/183.45 [#mult(#neg(@x), #neg(@y))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#pos(#natmult(@x, @y))] 675.35/183.45 675.35/183.45 [+(@x, @y)] = [4] @y + [2] 675.35/183.45 > [0] 675.35/183.45 = [#add(@x, @y)] 675.35/183.45 675.35/183.45 [#succ(#pos(#s(@x)))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#pos(#s(#s(@x)))] 675.35/183.45 675.35/183.45 [#succ(#0())] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#pos(#s(#0()))] 675.35/183.45 675.35/183.45 [#succ(#neg(#s(#0())))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#0()] 675.35/183.45 675.35/183.45 [#succ(#neg(#s(#s(@x))))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#neg(#s(@x))] 675.35/183.45 675.35/183.45 [enqueue#1(tuple#2(@outq, @inq), @t)] = [1] @t + [1] @outq + [1] @inq + [2] 675.35/183.45 >= [1] @t + [1] @outq + [1] @inq + [2] 675.35/183.45 = [tuple#2(@outq, ::(@t, @inq))] 675.35/183.45 675.35/183.45 [matrixMult(@m1, @m2)] = [0] 675.35/183.45 ? [4] @m2 + [0] 675.35/183.45 = [matrixMult#1(@m1, @m2)] 675.35/183.45 675.35/183.45 [*(@x, @y)] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#mult(@x, @y)] 675.35/183.45 675.35/183.45 [enqueue(@t, @queue)] = [1] @t + [1] @queue + [4] 675.35/183.45 > [1] @t + [1] @queue + [2] 675.35/183.45 = [enqueue#1(@queue, @t)] 675.35/183.45 675.35/183.45 [dequeue#2(nil())] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [tuple#2(nil(), tuple#2(nil(), nil()))] 675.35/183.45 675.35/183.45 [dequeue#2(::(@t, @ts))] = [1] @t + [1] @ts + [2] 675.35/183.45 >= [1] @t + [1] @ts + [2] 675.35/183.45 = [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))] 675.35/183.45 675.35/183.45 [#pred(#pos(#s(#0())))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#0()] 675.35/183.45 675.35/183.45 [#pred(#pos(#s(#s(@x))))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#pos(#s(@x))] 675.35/183.45 675.35/183.45 [#pred(#0())] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#neg(#s(#0()))] 675.35/183.45 675.35/183.45 [#pred(#neg(#s(@x)))] = [0] 675.35/183.45 >= [0] 675.35/183.45 = [#neg(#s(#s(@x)))] 675.35/183.45 675.35/183.45 [lineMult#1(nil(), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.45 >= [0] 675.35/183.45 = [nil()] 675.35/183.45 675.35/183.45 [lineMult#1(::(@x, @xs), @l2, @n)] = [4] @n + [4] @l2 + [0] 675.35/183.45 ? [2] @xs + [0] 675.35/183.45 = [lineMult#2(@l2, @n, @x, @xs)] 675.35/183.45 675.35/183.45 [computeLine#2(nil(), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.45 >= [0] 675.35/183.45 = [nil()] 675.35/183.45 675.35/183.45 [computeLine#2(::(@l, @ls), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.45 >= [4] @xs + [0] 675.35/183.45 = [computeLine(@xs, @ls, lineMult(@x, @l, @acc))] 675.35/183.45 675.35/183.45 [bftMult'#5^#(@queue', @acc, @y)] = [1] @y + [1] @queue' + [4] 675.35/183.45 >= [1] @queue' + [4] 675.35/183.45 = [c_3(bftMult'^#(@queue', matrixMult(@acc, @y)))] 675.35/183.45 675.35/183.45 [bftMult'#5^#(@queue', @acc, @y)] = [1] @y + [1] @queue' + [4] 675.35/183.45 >= [1] @y + [4] 675.35/183.45 = [c_4(matrixMult^#(@acc, @y))] 675.35/183.45 675.35/183.45 [bftMult'^#(@queue, @acc)] = [1] @queue + [4] 675.35/183.45 >= [1] @queue + [4] 675.35/183.45 = [c_5(bftMult'#1^#(bftMult'#2(@queue), @acc))] 675.35/183.45 675.35/183.47 [matrixMult^#(@m1, @m2)] = [1] @m2 + [4] 675.35/183.47 >= [1] @m2 + [4] 675.35/183.47 = [c_6(matrixMult#1^#(@m1, @m2))] 675.35/183.47 675.35/183.47 [computeLine#1^#(::(@x, @xs), @acc, @m)] = [1] @m + [4] 675.35/183.47 > [1] @m + [2] 675.35/183.47 = [c_1(computeLine#2^#(@m, @acc, @x, @xs))] 675.35/183.47 675.35/183.47 [computeLine#2^#(::(@l, @ls), @acc, @x, @xs)] = [1] @l + [1] @ls + [4] 675.35/183.47 >= [1] @ls + [4] 675.35/183.47 = [c_7(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)))] 675.35/183.47 675.35/183.47 [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] = [1] @t + [1] @queue + [1] @_@3 + [6] 675.35/183.47 >= [1] @t + [1] @queue + [6] 675.35/183.47 = [c_8(bftMult'#4^#(@t, @acc, @queue))] 675.35/183.47 675.35/183.47 [bftMult'#4^#(leaf(), @acc, @queue)] = [1] @queue + [8] 675.35/183.47 > [1] @queue + [7] 675.35/183.47 = [c_9(bftMult'^#(@queue, @acc))] 675.35/183.47 675.35/183.47 [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] = [1] @y + [1] @queue + [1] @t1 + [1] @t2 + [12] 675.35/183.47 >= [1] @y + [1] @queue + [1] @t1 + [1] @t2 + [12] 675.35/183.47 = [c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y))] 675.35/183.47 675.35/183.47 [matrixMult#1^#(::(@l, @ls), @m2)] = [1] @m2 + [4] 675.35/183.47 >= [1] @m2 + [4] 675.35/183.47 = [c_11(matrixMult^#(@ls, @m2))] 675.35/183.47 675.35/183.47 [matrixMult#1^#(::(@l, @ls), @m2)] = [1] @m2 + [4] 675.35/183.47 >= [1] @m2 + [4] 675.35/183.47 = [c_12(computeLine^#(@l, @m2, nil()))] 675.35/183.47 675.35/183.47 [computeLine^#(@line, @m, @acc)] = [1] @m + [4] 675.35/183.47 >= [1] @m + [4] 675.35/183.47 = [c_2(computeLine#1^#(@line, @acc, @m))] 675.35/183.47 675.35/183.47 [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] = [1] @queue + [1] @elem + [4] 675.35/183.47 >= [1] @queue + [1] @elem + [4] 675.35/183.47 = [c_13(bftMult'#3^#(@elem, @acc, @queue))] 675.35/183.47 675.35/183.47 675.35/183.47 We return to the main proof. Consider the set of all dependency 675.35/183.47 pairs 675.35/183.47 675.35/183.47 : 675.35/183.47 { 1: computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.47 c_1(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.47 , 2: computeLine^#(@line, @m, @acc) -> 675.35/183.47 c_2(computeLine#1^#(@line, @acc, @m)) 675.35/183.47 , 3: bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.47 c_3(bftMult'^#(@queue', matrixMult(@acc, @y))) 675.35/183.47 , 4: bftMult'#5^#(@queue', @acc, @y) -> c_4(matrixMult^#(@acc, @y)) 675.35/183.47 , 5: bftMult'^#(@queue, @acc) -> 675.35/183.47 c_5(bftMult'#1^#(bftMult'#2(@queue), @acc)) 675.35/183.47 , 6: matrixMult^#(@m1, @m2) -> c_6(matrixMult#1^#(@m1, @m2)) 675.35/183.47 , 7: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.47 c_7(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc))) 675.35/183.47 , 8: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.47 c_8(bftMult'#4^#(@t, @acc, @queue)) 675.35/183.47 , 9: bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.47 c_9(bftMult'^#(@queue, @acc)) 675.35/183.47 , 10: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.47 c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.35/183.47 , 11: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.47 c_11(matrixMult^#(@ls, @m2)) 675.35/183.47 , 12: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.47 c_12(computeLine^#(@l, @m2, nil())) 675.35/183.47 , 13: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.47 c_13(bftMult'#3^#(@elem, @acc, @queue)) } 675.35/183.47 675.35/183.47 Processor 'matrix interpretation of dimension 1' induces the 675.35/183.47 complexity certificate YES(?,O(n^1)) on application of dependency 675.35/183.47 pairs {1,9}. These cover all (indirect) predecessors of dependency 675.35/183.47 pairs {1,7,9}, their number of application is equally bounded. The 675.35/183.47 dependency pairs are shifted into the weak component. 675.35/183.47 675.35/183.47 We are left with following problem, upon which TcT provides the 675.35/183.47 certificate YES(O(1),O(n^1)). 675.35/183.47 675.35/183.47 Strict DPs: 675.35/183.47 { computeLine^#(@line, @m, @acc) -> 675.35/183.47 c_2(computeLine#1^#(@line, @acc, @m)) } 675.35/183.47 Weak DPs: 675.35/183.47 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.47 c_3(bftMult'^#(@queue', matrixMult(@acc, @y))) 675.35/183.47 , bftMult'#5^#(@queue', @acc, @y) -> c_4(matrixMult^#(@acc, @y)) 675.35/183.47 , bftMult'^#(@queue, @acc) -> 675.35/183.47 c_5(bftMult'#1^#(bftMult'#2(@queue), @acc)) 675.35/183.47 , matrixMult^#(@m1, @m2) -> c_6(matrixMult#1^#(@m1, @m2)) 675.35/183.47 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.47 c_1(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.47 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.47 c_7(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc))) 675.35/183.47 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.47 c_8(bftMult'#4^#(@t, @acc, @queue)) 675.35/183.47 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.47 c_9(bftMult'^#(@queue, @acc)) 675.35/183.47 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.47 c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.35/183.47 , matrixMult#1^#(::(@l, @ls), @m2) -> c_11(matrixMult^#(@ls, @m2)) 675.35/183.47 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.47 c_12(computeLine^#(@l, @m2, nil())) 675.35/183.47 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.47 c_13(bftMult'#3^#(@elem, @acc, @queue)) } 675.35/183.47 Weak Trs: 675.35/183.47 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.47 dequeue(@dequeue@1, @dequeue@2) 675.35/183.47 , #natmult(#0(), @y) -> #0() 675.35/183.47 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.47 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.47 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.47 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.47 appendreverse(@as, ::(@a, @sofar)) 675.35/183.47 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.47 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.47 computeLine#2(@m, @acc, @x, @xs) 675.35/183.47 , appendreverse(@toreverse, @sofar) -> 675.35/183.47 appendreverse#1(@toreverse, @sofar) 675.35/183.47 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.47 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.47 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.47 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.47 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.47 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.47 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.47 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.47 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.47 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.47 , #add(#0(), @y) -> @y 675.35/183.47 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.47 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.47 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.47 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.47 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.47 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.47 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.47 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.47 , #mult(#pos(@x), #0()) -> #0() 675.35/183.47 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.47 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.47 , #mult(#0(), #0()) -> #0() 675.35/183.47 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.47 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.47 , #mult(#neg(@x), #0()) -> #0() 675.35/183.47 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.47 , +(@x, @y) -> #add(@x, @y) 675.35/183.47 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.47 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.47 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.47 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.47 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.47 tuple#2(@outq, ::(@t, @inq)) 675.35/183.47 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.47 , *(@x, @y) -> #mult(@x, @y) 675.35/183.47 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.47 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.47 , dequeue#2(::(@t, @ts)) -> 675.35/183.47 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.47 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.47 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.47 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.47 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.47 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.47 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.47 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.47 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.47 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.47 Obligation: 675.35/183.47 innermost runtime complexity 675.35/183.47 Answer: 675.35/183.47 YES(O(1),O(n^1)) 675.35/183.47 675.35/183.47 We use the processor 'matrix interpretation of dimension 1' to 675.35/183.47 orient following rules strictly. 675.35/183.47 675.35/183.47 DPs: 675.35/183.47 { 1: computeLine^#(@line, @m, @acc) -> 675.35/183.47 c_2(computeLine#1^#(@line, @acc, @m)) 675.35/183.47 , 9: bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.47 c_9(bftMult'^#(@queue, @acc)) 675.35/183.47 , 10: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.47 c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) } 675.35/183.47 Trs: 675.35/183.47 { enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.47 tuple#2(@outq, ::(@t, @inq)) } 675.35/183.47 675.35/183.47 Sub-proof: 675.35/183.47 ---------- 675.35/183.47 The following argument positions are usable: 675.35/183.47 Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_3) = {1}, 675.35/183.47 Uargs(c_4) = {1}, Uargs(c_5) = {1}, Uargs(c_6) = {1}, 675.35/183.47 Uargs(c_7) = {1}, Uargs(c_8) = {1}, Uargs(c_9) = {1}, 675.35/183.47 Uargs(c_10) = {1}, Uargs(c_11) = {1}, Uargs(c_12) = {1}, 675.35/183.47 Uargs(c_13) = {1} 675.35/183.47 675.35/183.47 TcT has computed the following constructor-based matrix 675.35/183.47 interpretation satisfying not(EDA). 675.35/183.47 675.35/183.47 [bftMult'#2](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [#natmult](x1, x2) = [0] 675.35/183.47 675.35/183.47 [reverse](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.47 675.35/183.47 [computeLine#1](x1, x2, x3) = [4] x2 + [4] x3 + [0] 675.35/183.47 675.35/183.47 [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.47 675.35/183.47 [matrixMult#1](x1, x2) = [4] x2 + [0] 675.35/183.47 675.35/183.47 [leaf] = [2] 675.35/183.47 675.35/183.47 [lineMult](x1, x2, x3) = [0] 675.35/183.47 675.35/183.47 [lineMult#2](x1, x2, x3, x4) = [3] x2 + [2] x4 + [0] 675.35/183.47 675.35/183.47 [#pos](x1) = [0] 675.35/183.47 675.35/183.47 [#add](x1, x2) = [0] 675.35/183.47 675.35/183.47 [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [6] 675.35/183.47 675.35/183.47 [dequeue](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.47 675.35/183.47 [tuple#2](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.47 675.35/183.47 [nil] = [0] 675.35/183.47 675.35/183.47 [computeLine](x1, x2, x3) = [4] x1 + [0] 675.35/183.47 675.35/183.47 [dequeue#1](x1, x2) = [1] x1 + [1] x2 + [0] 675.35/183.47 675.35/183.47 [::](x1, x2) = [1] x1 + [1] x2 + [1] 675.35/183.47 675.35/183.47 [#mult](x1, x2) = [0] 675.35/183.47 675.35/183.47 [+](x1, x2) = [4] x2 + [0] 675.35/183.47 675.35/183.47 [#succ](x1) = [0] 675.35/183.47 675.35/183.47 [#0] = [0] 675.35/183.47 675.35/183.47 [enqueue#1](x1, x2) = [1] x1 + [1] x2 + [2] 675.35/183.47 675.35/183.47 [#neg](x1) = [0] 675.35/183.47 675.35/183.47 [matrixMult](x1, x2) = [0] 675.35/183.47 675.35/183.47 [*](x1, x2) = [0] 675.35/183.47 675.35/183.47 [enqueue](x1, x2) = [1] x1 + [1] x2 + [2] 675.35/183.47 675.35/183.47 [dequeue#2](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [#pred](x1) = [0] 675.35/183.47 675.35/183.47 [lineMult#1](x1, x2, x3) = [4] x2 + [7] x3 + [0] 675.35/183.47 675.35/183.47 [#s](x1) = [0] 675.35/183.47 675.35/183.47 [computeLine#2](x1, x2, x3, x4) = [4] x2 + [4] x3 + [4] x4 + [0] 675.35/183.47 675.35/183.47 [bftMult'#5^#](x1, x2, x3) = [2] x1 + [1] x3 + [1] 675.35/183.47 675.35/183.47 [bftMult'^#](x1, x2) = [2] x1 + [0] 675.35/183.47 675.35/183.47 [matrixMult^#](x1, x2) = [1] x2 + [1] 675.35/183.47 675.35/183.47 [computeLine#1^#](x1, x2, x3) = [1] x3 + [0] 675.35/183.47 675.35/183.47 [computeLine#2^#](x1, x2, x3, x4) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [bftMult'#3^#](x1, x2, x3) = [2] x1 + [2] x3 + [0] 675.35/183.47 675.35/183.47 [bftMult'#4^#](x1, x2, x3) = [2] x1 + [2] x3 + [0] 675.35/183.47 675.35/183.47 [matrixMult#1^#](x1, x2) = [1] x2 + [1] 675.35/183.47 675.35/183.47 [computeLine^#](x1, x2, x3) = [1] x2 + [1] 675.35/183.47 675.35/183.47 [lineMult^#](x1, x2, x3) = [7] x1 + [7] x2 + [7] x3 + [0] 675.35/183.47 675.35/183.47 [lineMult#1^#](x1, x2, x3) = [7] x1 + [7] x2 + [7] x3 + [0] 675.35/183.47 675.35/183.47 [lineMult#2^#](x1, x2, x3, x4) = [7] x1 + [7] x2 + [7] x3 + [7] x4 + [0] 675.35/183.47 675.35/183.47 [bftMult'#1^#](x1, x2) = [2] x1 + [0] 675.35/183.47 675.35/183.47 [c_9](x1) = [7] x1 + [0] 675.35/183.47 675.35/183.47 [c_10](x1, x2) = [7] x1 + [7] x2 + [0] 675.35/183.47 675.35/183.47 [c_15](x1) = [7] x1 + [0] 675.35/183.47 675.35/183.47 [c_17](x1) = [7] x1 + [0] 675.35/183.47 675.35/183.47 [c_18](x1) = [7] x1 + [0] 675.35/183.47 675.35/183.47 [c_19](x1) = [7] x1 + [0] 675.35/183.47 675.35/183.47 [c_20](x1) = [7] x1 + [0] 675.35/183.47 675.35/183.47 [c] = [0] 675.35/183.47 675.35/183.47 [c_1](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [c_2](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [c_3](x1) = [1] x1 + [1] 675.35/183.47 675.35/183.47 [c_4](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [c_5](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [c_6](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [c_7](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [c_8](x1) = [1] x1 + [2] 675.35/183.47 675.35/183.47 [c_9](x1) = [1] x1 + [3] 675.35/183.47 675.35/183.47 [c_10](x1) = [1] x1 + [1] 675.35/183.47 675.35/183.47 [c_11](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [c_12](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 [c_13](x1) = [1] x1 + [0] 675.35/183.47 675.35/183.47 The order satisfies the following ordering constraints: 675.35/183.47 675.35/183.47 [bftMult'#2(tuple#2(@dequeue@1, @dequeue@2))] = [1] @dequeue@1 + [1] @dequeue@2 + [0] 675.35/183.47 >= [1] @dequeue@1 + [1] @dequeue@2 + [0] 675.35/183.47 = [dequeue(@dequeue@1, @dequeue@2)] 675.35/183.47 675.35/183.47 [#natmult(#0(), @y)] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#0()] 675.35/183.47 675.35/183.47 [#natmult(#s(@x), @y)] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#add(#pos(@y), #natmult(@x, @y))] 675.35/183.47 675.35/183.47 [reverse(@xs)] = [1] @xs + [0] 675.35/183.47 >= [1] @xs + [0] 675.35/183.47 = [appendreverse(@xs, nil())] 675.35/183.47 675.35/183.47 [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] 675.35/183.47 >= [1] @sofar + [0] 675.35/183.47 = [@sofar] 675.35/183.47 675.35/183.47 [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [1] 675.35/183.47 >= [1] @sofar + [1] @a + [1] @as + [1] 675.35/183.47 = [appendreverse(@as, ::(@a, @sofar))] 675.35/183.47 675.35/183.47 [computeLine#1(nil(), @acc, @m)] = [4] @acc + [4] @m + [0] 675.35/183.47 >= [1] @acc + [0] 675.35/183.47 = [@acc] 675.35/183.47 675.35/183.47 [computeLine#1(::(@x, @xs), @acc, @m)] = [4] @acc + [4] @m + [0] 675.35/183.47 ? [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.47 = [computeLine#2(@m, @acc, @x, @xs)] 675.35/183.47 675.35/183.47 [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] 675.35/183.47 >= [1] @toreverse + [1] @sofar + [0] 675.35/183.47 = [appendreverse#1(@toreverse, @sofar)] 675.35/183.47 675.35/183.47 [matrixMult#1(nil(), @m2)] = [4] @m2 + [0] 675.35/183.47 >= [0] 675.35/183.47 = [nil()] 675.35/183.47 675.35/183.47 [matrixMult#1(::(@l, @ls), @m2)] = [4] @m2 + [0] 675.35/183.47 ? [4] @l + [1] 675.35/183.47 = [::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2))] 675.35/183.47 675.35/183.47 [lineMult(@n, @l1, @l2)] = [0] 675.35/183.47 ? [7] @n + [4] @l2 + [0] 675.35/183.47 = [lineMult#1(@l1, @l2, @n)] 675.35/183.47 675.35/183.47 [lineMult#2(nil(), @n, @x, @xs)] = [2] @xs + [3] @n + [0] 675.35/183.47 ? [1] 675.35/183.47 = [::(*(@x, @n), lineMult(@n, @xs, nil()))] 675.35/183.47 675.35/183.47 [lineMult#2(::(@y, @ys), @n, @x, @xs)] = [2] @xs + [3] @n + [0] 675.35/183.47 ? [4] @y + [1] 675.35/183.47 = [::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys))] 675.35/183.47 675.35/183.47 [#add(#pos(#s(#0())), @y)] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#succ(@y)] 675.35/183.47 675.35/183.47 [#add(#pos(#s(#s(@x))), @y)] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#succ(#add(#pos(#s(@x)), @y))] 675.35/183.47 675.35/183.47 [#add(#0(), @y)] = [0] 675.35/183.47 ? [1] @y + [0] 675.35/183.47 = [@y] 675.35/183.47 675.35/183.47 [#add(#neg(#s(#0())), @y)] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#pred(@y)] 675.35/183.47 675.35/183.47 [#add(#neg(#s(#s(@x))), @y)] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#pred(#add(#pos(#s(@x)), @y))] 675.35/183.47 675.35/183.47 [dequeue(@outq, @inq)] = [1] @outq + [1] @inq + [0] 675.35/183.47 >= [1] @outq + [1] @inq + [0] 675.35/183.47 = [dequeue#1(@outq, @inq)] 675.35/183.47 675.35/183.47 [computeLine(@line, @m, @acc)] = [4] @line + [0] 675.35/183.47 ? [4] @acc + [4] @m + [0] 675.35/183.47 = [computeLine#1(@line, @acc, @m)] 675.35/183.47 675.35/183.47 [dequeue#1(nil(), @inq)] = [1] @inq + [0] 675.35/183.47 >= [1] @inq + [0] 675.35/183.47 = [dequeue#2(reverse(@inq))] 675.35/183.47 675.35/183.47 [dequeue#1(::(@t, @ts), @inq)] = [1] @t + [1] @inq + [1] @ts + [1] 675.35/183.47 >= [1] @t + [1] @inq + [1] @ts + [1] 675.35/183.47 = [tuple#2(::(@t, nil()), tuple#2(@ts, @inq))] 675.35/183.47 675.35/183.47 [#mult(#pos(@x), #pos(@y))] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#pos(#natmult(@x, @y))] 675.35/183.47 675.35/183.47 [#mult(#pos(@x), #0())] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#0()] 675.35/183.47 675.35/183.47 [#mult(#pos(@x), #neg(@y))] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#neg(#natmult(@x, @y))] 675.35/183.47 675.35/183.47 [#mult(#0(), #pos(@y))] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#0()] 675.35/183.47 675.35/183.47 [#mult(#0(), #0())] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#0()] 675.35/183.47 675.35/183.47 [#mult(#0(), #neg(@y))] = [0] 675.35/183.47 >= [0] 675.35/183.47 = [#0()] 675.35/183.47 675.35/183.48 [#mult(#neg(@x), #pos(@y))] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#neg(#natmult(@x, @y))] 675.35/183.48 675.35/183.48 [#mult(#neg(@x), #0())] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#0()] 675.35/183.48 675.35/183.48 [#mult(#neg(@x), #neg(@y))] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#pos(#natmult(@x, @y))] 675.35/183.48 675.35/183.48 [+(@x, @y)] = [4] @y + [0] 675.35/183.48 >= [0] 675.35/183.48 = [#add(@x, @y)] 675.35/183.48 675.35/183.48 [#succ(#pos(#s(@x)))] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#pos(#s(#s(@x)))] 675.35/183.48 675.35/183.48 [#succ(#0())] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#pos(#s(#0()))] 675.35/183.48 675.35/183.48 [#succ(#neg(#s(#0())))] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#0()] 675.35/183.48 675.35/183.48 [#succ(#neg(#s(#s(@x))))] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#neg(#s(@x))] 675.35/183.48 675.35/183.48 [enqueue#1(tuple#2(@outq, @inq), @t)] = [1] @t + [1] @outq + [1] @inq + [2] 675.35/183.48 > [1] @t + [1] @outq + [1] @inq + [1] 675.35/183.48 = [tuple#2(@outq, ::(@t, @inq))] 675.35/183.48 675.35/183.48 [matrixMult(@m1, @m2)] = [0] 675.35/183.48 ? [4] @m2 + [0] 675.35/183.48 = [matrixMult#1(@m1, @m2)] 675.35/183.48 675.35/183.48 [*(@x, @y)] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#mult(@x, @y)] 675.35/183.48 675.35/183.48 [enqueue(@t, @queue)] = [1] @t + [1] @queue + [2] 675.35/183.48 >= [1] @t + [1] @queue + [2] 675.35/183.48 = [enqueue#1(@queue, @t)] 675.35/183.48 675.35/183.48 [dequeue#2(nil())] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [tuple#2(nil(), tuple#2(nil(), nil()))] 675.35/183.48 675.35/183.48 [dequeue#2(::(@t, @ts))] = [1] @t + [1] @ts + [1] 675.35/183.48 >= [1] @t + [1] @ts + [1] 675.35/183.48 = [tuple#2(::(@t, nil()), tuple#2(@ts, nil()))] 675.35/183.48 675.35/183.48 [#pred(#pos(#s(#0())))] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#0()] 675.35/183.48 675.35/183.48 [#pred(#pos(#s(#s(@x))))] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#pos(#s(@x))] 675.35/183.48 675.35/183.48 [#pred(#0())] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#neg(#s(#0()))] 675.35/183.48 675.35/183.48 [#pred(#neg(#s(@x)))] = [0] 675.35/183.48 >= [0] 675.35/183.48 = [#neg(#s(#s(@x)))] 675.35/183.48 675.35/183.48 [lineMult#1(nil(), @l2, @n)] = [7] @n + [4] @l2 + [0] 675.35/183.48 >= [0] 675.35/183.48 = [nil()] 675.35/183.48 675.35/183.48 [lineMult#1(::(@x, @xs), @l2, @n)] = [7] @n + [4] @l2 + [0] 675.35/183.48 ? [2] @xs + [3] @n + [0] 675.35/183.48 = [lineMult#2(@l2, @n, @x, @xs)] 675.35/183.48 675.35/183.48 [computeLine#2(nil(), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.48 >= [0] 675.35/183.48 = [nil()] 675.35/183.48 675.35/183.48 [computeLine#2(::(@l, @ls), @acc, @x, @xs)] = [4] @x + [4] @acc + [4] @xs + [0] 675.35/183.48 >= [4] @xs + [0] 675.35/183.48 = [computeLine(@xs, @ls, lineMult(@x, @l, @acc))] 675.35/183.48 675.35/183.48 [bftMult'#5^#(@queue', @acc, @y)] = [1] @y + [2] @queue' + [1] 675.35/183.48 >= [2] @queue' + [1] 675.35/183.48 = [c_3(bftMult'^#(@queue', matrixMult(@acc, @y)))] 675.35/183.48 675.35/183.48 [bftMult'#5^#(@queue', @acc, @y)] = [1] @y + [2] @queue' + [1] 675.35/183.48 >= [1] @y + [1] 675.35/183.48 = [c_4(matrixMult^#(@acc, @y))] 675.35/183.48 675.35/183.48 [bftMult'^#(@queue, @acc)] = [2] @queue + [0] 675.35/183.48 >= [2] @queue + [0] 675.35/183.48 = [c_5(bftMult'#1^#(bftMult'#2(@queue), @acc))] 675.35/183.48 675.35/183.48 [matrixMult^#(@m1, @m2)] = [1] @m2 + [1] 675.35/183.48 >= [1] @m2 + [1] 675.35/183.48 = [c_6(matrixMult#1^#(@m1, @m2))] 675.35/183.48 675.35/183.48 [computeLine#1^#(::(@x, @xs), @acc, @m)] = [1] @m + [0] 675.35/183.48 >= [1] @m + [0] 675.35/183.48 = [c_1(computeLine#2^#(@m, @acc, @x, @xs))] 675.35/183.48 675.35/183.48 [computeLine#2^#(::(@l, @ls), @acc, @x, @xs)] = [1] @l + [1] @ls + [1] 675.35/183.48 >= [1] @ls + [1] 675.35/183.48 = [c_7(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc)))] 675.35/183.48 675.35/183.48 [bftMult'#3^#(::(@t, @_@3), @acc, @queue)] = [2] @t + [2] @queue + [2] @_@3 + [2] 675.35/183.48 >= [2] @t + [2] @queue + [2] 675.35/183.48 = [c_8(bftMult'#4^#(@t, @acc, @queue))] 675.35/183.48 675.35/183.48 [bftMult'#4^#(leaf(), @acc, @queue)] = [2] @queue + [4] 675.35/183.48 > [2] @queue + [3] 675.35/183.48 = [c_9(bftMult'^#(@queue, @acc))] 675.35/183.48 675.35/183.48 [bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue)] = [2] @y + [2] @queue + [2] @t1 + [2] @t2 + [12] 675.35/183.48 > [1] @y + [2] @queue + [2] @t1 + [2] @t2 + [10] 675.35/183.48 = [c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y))] 675.35/183.48 675.35/183.48 [matrixMult#1^#(::(@l, @ls), @m2)] = [1] @m2 + [1] 675.35/183.48 >= [1] @m2 + [1] 675.35/183.48 = [c_11(matrixMult^#(@ls, @m2))] 675.35/183.48 675.35/183.48 [matrixMult#1^#(::(@l, @ls), @m2)] = [1] @m2 + [1] 675.35/183.48 >= [1] @m2 + [1] 675.35/183.48 = [c_12(computeLine^#(@l, @m2, nil()))] 675.35/183.48 675.35/183.48 [computeLine^#(@line, @m, @acc)] = [1] @m + [1] 675.35/183.48 > [1] @m + [0] 675.35/183.48 = [c_2(computeLine#1^#(@line, @acc, @m))] 675.35/183.48 675.35/183.48 [bftMult'#1^#(tuple#2(@elem, @queue), @acc)] = [2] @queue + [2] @elem + [0] 675.35/183.48 >= [2] @queue + [2] @elem + [0] 675.35/183.48 = [c_13(bftMult'#3^#(@elem, @acc, @queue))] 675.35/183.48 675.35/183.48 675.35/183.48 We return to the main proof. Consider the set of all dependency 675.35/183.48 pairs 675.35/183.48 675.35/183.48 : 675.35/183.48 { 1: computeLine^#(@line, @m, @acc) -> 675.35/183.48 c_2(computeLine#1^#(@line, @acc, @m)) 675.35/183.48 , 2: bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.48 c_3(bftMult'^#(@queue', matrixMult(@acc, @y))) 675.35/183.48 , 3: bftMult'#5^#(@queue', @acc, @y) -> c_4(matrixMult^#(@acc, @y)) 675.35/183.48 , 4: bftMult'^#(@queue, @acc) -> 675.35/183.48 c_5(bftMult'#1^#(bftMult'#2(@queue), @acc)) 675.35/183.48 , 5: matrixMult^#(@m1, @m2) -> c_6(matrixMult#1^#(@m1, @m2)) 675.35/183.48 , 6: computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.48 c_1(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.48 , 7: computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.48 c_7(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc))) 675.35/183.48 , 8: bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.48 c_8(bftMult'#4^#(@t, @acc, @queue)) 675.35/183.48 , 9: bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.48 c_9(bftMult'^#(@queue, @acc)) 675.35/183.48 , 10: bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.48 c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.35/183.48 , 11: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.48 c_11(matrixMult^#(@ls, @m2)) 675.35/183.48 , 12: matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.48 c_12(computeLine^#(@l, @m2, nil())) 675.35/183.48 , 13: bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.48 c_13(bftMult'#3^#(@elem, @acc, @queue)) } 675.35/183.48 675.35/183.48 Processor 'matrix interpretation of dimension 1' induces the 675.35/183.48 complexity certificate YES(?,O(n^1)) on application of dependency 675.35/183.48 pairs {1,9,10}. These cover all (indirect) predecessors of 675.35/183.48 dependency pairs {1,2,3,4,6,7,8,9,10,13}, their number of 675.35/183.48 application is equally bounded. The dependency pairs are shifted 675.35/183.48 into the weak component. 675.35/183.48 675.35/183.48 We are left with following problem, upon which TcT provides the 675.35/183.48 certificate YES(O(1),O(1)). 675.35/183.48 675.35/183.48 Weak DPs: 675.35/183.48 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.48 c_3(bftMult'^#(@queue', matrixMult(@acc, @y))) 675.35/183.48 , bftMult'#5^#(@queue', @acc, @y) -> c_4(matrixMult^#(@acc, @y)) 675.35/183.48 , bftMult'^#(@queue, @acc) -> 675.35/183.48 c_5(bftMult'#1^#(bftMult'#2(@queue), @acc)) 675.35/183.48 , matrixMult^#(@m1, @m2) -> c_6(matrixMult#1^#(@m1, @m2)) 675.35/183.48 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.48 c_1(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.48 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.48 c_7(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc))) 675.35/183.48 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.48 c_8(bftMult'#4^#(@t, @acc, @queue)) 675.35/183.48 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.48 c_9(bftMult'^#(@queue, @acc)) 675.35/183.48 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.48 c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.35/183.48 , matrixMult#1^#(::(@l, @ls), @m2) -> c_11(matrixMult^#(@ls, @m2)) 675.35/183.48 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.48 c_12(computeLine^#(@l, @m2, nil())) 675.35/183.48 , computeLine^#(@line, @m, @acc) -> 675.35/183.48 c_2(computeLine#1^#(@line, @acc, @m)) 675.35/183.48 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.48 c_13(bftMult'#3^#(@elem, @acc, @queue)) } 675.35/183.48 Weak Trs: 675.35/183.48 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.48 dequeue(@dequeue@1, @dequeue@2) 675.35/183.48 , #natmult(#0(), @y) -> #0() 675.35/183.48 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.48 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.48 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.48 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.48 appendreverse(@as, ::(@a, @sofar)) 675.35/183.48 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.48 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.48 computeLine#2(@m, @acc, @x, @xs) 675.35/183.48 , appendreverse(@toreverse, @sofar) -> 675.35/183.48 appendreverse#1(@toreverse, @sofar) 675.35/183.48 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.48 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.48 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.48 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.48 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.48 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.48 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.48 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.48 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.48 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.48 , #add(#0(), @y) -> @y 675.35/183.48 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.48 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.48 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.48 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.48 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.48 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.48 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.48 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.48 , #mult(#pos(@x), #0()) -> #0() 675.35/183.48 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.48 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.48 , #mult(#0(), #0()) -> #0() 675.35/183.48 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.48 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.48 , #mult(#neg(@x), #0()) -> #0() 675.35/183.48 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.48 , +(@x, @y) -> #add(@x, @y) 675.35/183.48 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.48 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.48 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.48 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.48 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.48 tuple#2(@outq, ::(@t, @inq)) 675.35/183.48 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.48 , *(@x, @y) -> #mult(@x, @y) 675.35/183.48 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.48 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.48 , dequeue#2(::(@t, @ts)) -> 675.35/183.48 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.48 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.48 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.48 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.48 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.48 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.48 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.48 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.48 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.48 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.48 Obligation: 675.35/183.48 innermost runtime complexity 675.35/183.48 Answer: 675.35/183.48 YES(O(1),O(1)) 675.35/183.48 675.35/183.48 The following weak DPs constitute a sub-graph of the DG that is 675.35/183.48 closed under successors. The DPs are removed. 675.35/183.48 675.35/183.48 { bftMult'#5^#(@queue', @acc, @y) -> 675.35/183.48 c_3(bftMult'^#(@queue', matrixMult(@acc, @y))) 675.35/183.48 , bftMult'#5^#(@queue', @acc, @y) -> c_4(matrixMult^#(@acc, @y)) 675.35/183.48 , bftMult'^#(@queue, @acc) -> 675.35/183.48 c_5(bftMult'#1^#(bftMult'#2(@queue), @acc)) 675.35/183.48 , matrixMult^#(@m1, @m2) -> c_6(matrixMult#1^#(@m1, @m2)) 675.35/183.48 , computeLine#1^#(::(@x, @xs), @acc, @m) -> 675.35/183.48 c_1(computeLine#2^#(@m, @acc, @x, @xs)) 675.35/183.48 , computeLine#2^#(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.48 c_7(computeLine^#(@xs, @ls, lineMult(@x, @l, @acc))) 675.35/183.48 , bftMult'#3^#(::(@t, @_@3), @acc, @queue) -> 675.35/183.48 c_8(bftMult'#4^#(@t, @acc, @queue)) 675.35/183.48 , bftMult'#4^#(leaf(), @acc, @queue) -> 675.35/183.48 c_9(bftMult'^#(@queue, @acc)) 675.35/183.48 , bftMult'#4^#(node(@y, @t1, @t2), @acc, @queue) -> 675.35/183.48 c_10(bftMult'#5^#(enqueue(@t2, enqueue(@t1, @queue)), @acc, @y)) 675.35/183.48 , matrixMult#1^#(::(@l, @ls), @m2) -> c_11(matrixMult^#(@ls, @m2)) 675.35/183.48 , matrixMult#1^#(::(@l, @ls), @m2) -> 675.35/183.48 c_12(computeLine^#(@l, @m2, nil())) 675.35/183.48 , computeLine^#(@line, @m, @acc) -> 675.35/183.48 c_2(computeLine#1^#(@line, @acc, @m)) 675.35/183.48 , bftMult'#1^#(tuple#2(@elem, @queue), @acc) -> 675.35/183.48 c_13(bftMult'#3^#(@elem, @acc, @queue)) } 675.35/183.48 675.35/183.48 We are left with following problem, upon which TcT provides the 675.35/183.48 certificate YES(O(1),O(1)). 675.35/183.48 675.35/183.48 Weak Trs: 675.35/183.48 { bftMult'#2(tuple#2(@dequeue@1, @dequeue@2)) -> 675.35/183.48 dequeue(@dequeue@1, @dequeue@2) 675.35/183.48 , #natmult(#0(), @y) -> #0() 675.35/183.48 , #natmult(#s(@x), @y) -> #add(#pos(@y), #natmult(@x, @y)) 675.35/183.48 , reverse(@xs) -> appendreverse(@xs, nil()) 675.35/183.48 , appendreverse#1(nil(), @sofar) -> @sofar 675.35/183.48 , appendreverse#1(::(@a, @as), @sofar) -> 675.35/183.48 appendreverse(@as, ::(@a, @sofar)) 675.35/183.48 , computeLine#1(nil(), @acc, @m) -> @acc 675.35/183.48 , computeLine#1(::(@x, @xs), @acc, @m) -> 675.35/183.48 computeLine#2(@m, @acc, @x, @xs) 675.35/183.48 , appendreverse(@toreverse, @sofar) -> 675.35/183.48 appendreverse#1(@toreverse, @sofar) 675.35/183.48 , matrixMult#1(nil(), @m2) -> nil() 675.35/183.48 , matrixMult#1(::(@l, @ls), @m2) -> 675.35/183.48 ::(computeLine(@l, @m2, nil()), matrixMult(@ls, @m2)) 675.35/183.48 , lineMult(@n, @l1, @l2) -> lineMult#1(@l1, @l2, @n) 675.35/183.48 , lineMult#2(nil(), @n, @x, @xs) -> 675.35/183.48 ::(*(@x, @n), lineMult(@n, @xs, nil())) 675.35/183.48 , lineMult#2(::(@y, @ys), @n, @x, @xs) -> 675.35/183.48 ::(+(*(@x, @n), @y), lineMult(@n, @xs, @ys)) 675.35/183.48 , #add(#pos(#s(#0())), @y) -> #succ(@y) 675.35/183.48 , #add(#pos(#s(#s(@x))), @y) -> #succ(#add(#pos(#s(@x)), @y)) 675.35/183.48 , #add(#0(), @y) -> @y 675.35/183.48 , #add(#neg(#s(#0())), @y) -> #pred(@y) 675.35/183.48 , #add(#neg(#s(#s(@x))), @y) -> #pred(#add(#pos(#s(@x)), @y)) 675.35/183.48 , dequeue(@outq, @inq) -> dequeue#1(@outq, @inq) 675.35/183.48 , computeLine(@line, @m, @acc) -> computeLine#1(@line, @acc, @m) 675.35/183.48 , dequeue#1(nil(), @inq) -> dequeue#2(reverse(@inq)) 675.35/183.48 , dequeue#1(::(@t, @ts), @inq) -> 675.35/183.48 tuple#2(::(@t, nil()), tuple#2(@ts, @inq)) 675.35/183.48 , #mult(#pos(@x), #pos(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.48 , #mult(#pos(@x), #0()) -> #0() 675.35/183.48 , #mult(#pos(@x), #neg(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.48 , #mult(#0(), #pos(@y)) -> #0() 675.35/183.48 , #mult(#0(), #0()) -> #0() 675.35/183.48 , #mult(#0(), #neg(@y)) -> #0() 675.35/183.48 , #mult(#neg(@x), #pos(@y)) -> #neg(#natmult(@x, @y)) 675.35/183.48 , #mult(#neg(@x), #0()) -> #0() 675.35/183.48 , #mult(#neg(@x), #neg(@y)) -> #pos(#natmult(@x, @y)) 675.35/183.48 , +(@x, @y) -> #add(@x, @y) 675.35/183.48 , #succ(#pos(#s(@x))) -> #pos(#s(#s(@x))) 675.35/183.48 , #succ(#0()) -> #pos(#s(#0())) 675.35/183.48 , #succ(#neg(#s(#0()))) -> #0() 675.35/183.48 , #succ(#neg(#s(#s(@x)))) -> #neg(#s(@x)) 675.35/183.48 , enqueue#1(tuple#2(@outq, @inq), @t) -> 675.35/183.48 tuple#2(@outq, ::(@t, @inq)) 675.35/183.48 , matrixMult(@m1, @m2) -> matrixMult#1(@m1, @m2) 675.35/183.48 , *(@x, @y) -> #mult(@x, @y) 675.35/183.48 , enqueue(@t, @queue) -> enqueue#1(@queue, @t) 675.35/183.48 , dequeue#2(nil()) -> tuple#2(nil(), tuple#2(nil(), nil())) 675.35/183.48 , dequeue#2(::(@t, @ts)) -> 675.35/183.48 tuple#2(::(@t, nil()), tuple#2(@ts, nil())) 675.35/183.48 , #pred(#pos(#s(#0()))) -> #0() 675.35/183.48 , #pred(#pos(#s(#s(@x)))) -> #pos(#s(@x)) 675.35/183.48 , #pred(#0()) -> #neg(#s(#0())) 675.35/183.48 , #pred(#neg(#s(@x))) -> #neg(#s(#s(@x))) 675.35/183.48 , lineMult#1(nil(), @l2, @n) -> nil() 675.35/183.48 , lineMult#1(::(@x, @xs), @l2, @n) -> lineMult#2(@l2, @n, @x, @xs) 675.35/183.48 , computeLine#2(nil(), @acc, @x, @xs) -> nil() 675.35/183.48 , computeLine#2(::(@l, @ls), @acc, @x, @xs) -> 675.35/183.48 computeLine(@xs, @ls, lineMult(@x, @l, @acc)) } 675.35/183.48 Obligation: 675.35/183.48 innermost runtime complexity 675.35/183.48 Answer: 675.35/183.48 YES(O(1),O(1)) 675.35/183.48 675.35/183.48 No rule is usable, rules are removed from the input problem. 675.35/183.48 675.35/183.48 We are left with following problem, upon which TcT provides the 675.35/183.48 certificate YES(O(1),O(1)). 675.35/183.48 675.35/183.48 Rules: Empty 675.35/183.48 Obligation: 675.35/183.48 innermost runtime complexity 675.35/183.48 Answer: 675.35/183.48 YES(O(1),O(1)) 675.35/183.48 675.35/183.48 Empty rules are trivially bounded 675.35/183.48 675.35/183.48 Hurray, we answered YES(O(1),O(n^3)) 675.35/183.48 EOF