We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dfs#1(nil(), @x) -> leaf() , dfs#1(::(@t, @ts), @x) -> dfs#2(@t, @t, @ts, @x) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , dodfs(@t, @x) -> dfs(::(@t, nil()), @x) , bfs2#1(@t', @x) -> dobfs(@t', @x) , bfs2(@t, @x) -> bfs2#1(dobfs(@t, @x), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , dfs#2(leaf(), @t, @ts, @x) -> dfs(@ts, @x) , dfs#2(node(@a, @t1, @t2), @t, @ts, @x) -> dfs#3(#equal(@a, @x), @t, @t1, @t2, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) , dfs(@queue, @x) -> dfs#1(@queue, @x) , dfs#3(#true(), @t, @t1, @t2, @ts, @x) -> @t , dfs#3(#false(), @t, @t1, @t2, @ts, @x) -> dfs(::(@t1, ::(@t2, @ts)), @x) } Weak Trs: { #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) We add the following dependency tuples: Strict DPs: { #equal^#(@x, @y) -> c_1(#eq^#(@x, @y)) , bfs#4^#(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_2() , bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_3(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_14(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_4(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_7(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(nil(), @sofar) -> c_5() , appendreverse#1^#(::(@a, @as), @sofar) -> c_6(appendreverse^#(@as, ::(@a, @sofar))) , dfs#1^#(nil(), @x) -> c_8() , dfs#1^#(::(@t, @ts), @x) -> c_9(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_19(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_20(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x), #equal^#(@a, @x)) , dobfs^#(@t, @x) -> c_10(bfs^#(::(@t, nil()), nil(), @x)) , dodfs^#(@t, @x) -> c_11(dfs^#(::(@t, nil()), @x)) , dfs^#(@queue, @x) -> c_23(dfs#1^#(@queue, @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_17(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_18(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(nil(), @x) -> c_15() , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_21(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_22(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y), #equal^#(@x, @y)) , dfs#3^#(#true(), @t, @t1, @t2, @ts, @x) -> c_24() , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_25(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak DPs: { #eq^#(leaf(), leaf()) -> c_26() , #eq^#(leaf(), node(@y_1, @y_2, @y_3)) -> c_27() , #eq^#(leaf(), nil()) -> c_28() , #eq^#(leaf(), ::(@y_1, @y_2)) -> c_29() , #eq^#(#pos(@x), #pos(@y)) -> c_30(#eq^#(@x, @y)) , #eq^#(#pos(@x), #0()) -> c_31() , #eq^#(#pos(@x), #neg(@y)) -> c_32() , #eq^#(node(@x_1, @x_2, @x_3), leaf()) -> c_33() , #eq^#(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> c_34(#and^#(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))), #eq^#(@x_1, @y_1), #and^#(#eq(@x_2, @y_2), #eq(@x_3, @y_3)), #eq^#(@x_2, @y_2), #eq^#(@x_3, @y_3)) , #eq^#(node(@x_1, @x_2, @x_3), nil()) -> c_35() , #eq^#(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> c_36() , #eq^#(nil(), leaf()) -> c_37() , #eq^#(nil(), node(@y_1, @y_2, @y_3)) -> c_38() , #eq^#(nil(), nil()) -> c_39() , #eq^#(nil(), ::(@y_1, @y_2)) -> c_40() , #eq^#(::(@x_1, @x_2), leaf()) -> c_41() , #eq^#(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> c_42() , #eq^#(::(@x_1, @x_2), nil()) -> c_43() , #eq^#(::(@x_1, @x_2), ::(@y_1, @y_2)) -> c_44(#and^#(#eq(@x_1, @y_1), #eq(@x_2, @y_2)), #eq^#(@x_1, @y_1), #eq^#(@x_2, @y_2)) , #eq^#(#0(), #pos(@y)) -> c_45() , #eq^#(#0(), #0()) -> c_46() , #eq^#(#0(), #neg(@y)) -> c_47() , #eq^#(#0(), #s(@y)) -> c_48() , #eq^#(#neg(@x), #pos(@y)) -> c_49() , #eq^#(#neg(@x), #0()) -> c_50() , #eq^#(#neg(@x), #neg(@y)) -> c_51(#eq^#(@x, @y)) , #eq^#(#s(@x), #0()) -> c_52() , #eq^#(#s(@x), #s(@y)) -> c_53(#eq^#(@x, @y)) , #and^#(#true(), #true()) -> c_54() , #and^#(#true(), #false()) -> c_55() , #and^#(#false(), #true()) -> c_56() , #and^#(#false(), #false()) -> c_57() } and mark the set of starting terms. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict DPs: { #equal^#(@x, @y) -> c_1(#eq^#(@x, @y)) , bfs#4^#(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_2() , bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_3(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_14(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_4(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_7(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(nil(), @sofar) -> c_5() , appendreverse#1^#(::(@a, @as), @sofar) -> c_6(appendreverse^#(@as, ::(@a, @sofar))) , dfs#1^#(nil(), @x) -> c_8() , dfs#1^#(::(@t, @ts), @x) -> c_9(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_19(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_20(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x), #equal^#(@a, @x)) , dobfs^#(@t, @x) -> c_10(bfs^#(::(@t, nil()), nil(), @x)) , dodfs^#(@t, @x) -> c_11(dfs^#(::(@t, nil()), @x)) , dfs^#(@queue, @x) -> c_23(dfs#1^#(@queue, @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_17(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_18(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(nil(), @x) -> c_15() , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_21(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_22(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y), #equal^#(@x, @y)) , dfs#3^#(#true(), @t, @t1, @t2, @ts, @x) -> c_24() , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_25(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak DPs: { #eq^#(leaf(), leaf()) -> c_26() , #eq^#(leaf(), node(@y_1, @y_2, @y_3)) -> c_27() , #eq^#(leaf(), nil()) -> c_28() , #eq^#(leaf(), ::(@y_1, @y_2)) -> c_29() , #eq^#(#pos(@x), #pos(@y)) -> c_30(#eq^#(@x, @y)) , #eq^#(#pos(@x), #0()) -> c_31() , #eq^#(#pos(@x), #neg(@y)) -> c_32() , #eq^#(node(@x_1, @x_2, @x_3), leaf()) -> c_33() , #eq^#(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> c_34(#and^#(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))), #eq^#(@x_1, @y_1), #and^#(#eq(@x_2, @y_2), #eq(@x_3, @y_3)), #eq^#(@x_2, @y_2), #eq^#(@x_3, @y_3)) , #eq^#(node(@x_1, @x_2, @x_3), nil()) -> c_35() , #eq^#(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> c_36() , #eq^#(nil(), leaf()) -> c_37() , #eq^#(nil(), node(@y_1, @y_2, @y_3)) -> c_38() , #eq^#(nil(), nil()) -> c_39() , #eq^#(nil(), ::(@y_1, @y_2)) -> c_40() , #eq^#(::(@x_1, @x_2), leaf()) -> c_41() , #eq^#(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> c_42() , #eq^#(::(@x_1, @x_2), nil()) -> c_43() , #eq^#(::(@x_1, @x_2), ::(@y_1, @y_2)) -> c_44(#and^#(#eq(@x_1, @y_1), #eq(@x_2, @y_2)), #eq^#(@x_1, @y_1), #eq^#(@x_2, @y_2)) , #eq^#(#0(), #pos(@y)) -> c_45() , #eq^#(#0(), #0()) -> c_46() , #eq^#(#0(), #neg(@y)) -> c_47() , #eq^#(#0(), #s(@y)) -> c_48() , #eq^#(#neg(@x), #pos(@y)) -> c_49() , #eq^#(#neg(@x), #0()) -> c_50() , #eq^#(#neg(@x), #neg(@y)) -> c_51(#eq^#(@x, @y)) , #eq^#(#s(@x), #0()) -> c_52() , #eq^#(#s(@x), #s(@y)) -> c_53(#eq^#(@x, @y)) , #and^#(#true(), #true()) -> c_54() , #and^#(#true(), #false()) -> c_55() , #and^#(#false(), #true()) -> c_56() , #and^#(#false(), #false()) -> c_57() } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dfs#1(nil(), @x) -> leaf() , dfs#1(::(@t, @ts), @x) -> dfs#2(@t, @t, @ts, @x) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , dodfs(@t, @x) -> dfs(::(@t, nil()), @x) , bfs2#1(@t', @x) -> dobfs(@t', @x) , bfs2(@t, @x) -> bfs2#1(dobfs(@t, @x), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , dfs#2(leaf(), @t, @ts, @x) -> dfs(@ts, @x) , dfs#2(node(@a, @t1, @t2), @t, @ts, @x) -> dfs#3(#equal(@a, @x), @t, @t1, @t2, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) , dfs(@queue, @x) -> dfs#1(@queue, @x) , dfs#3(#true(), @t, @t1, @t2, @ts, @x) -> @t , dfs#3(#false(), @t, @t1, @t2, @ts, @x) -> dfs(::(@t1, ::(@t2, @ts)), @x) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) We estimate the number of application of {1,2,7,9,20,24} by applications of Pre({1,2,7,9,20,24}) = {6,12,15,18,23}. Here rules are labeled as follows: DPs: { 1: #equal^#(@x, @y) -> c_1(#eq^#(@x, @y)) , 2: bfs#4^#(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_2() , 3: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_3(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 4: bfs^#(@queue, @futurequeue, @x) -> c_14(bfs#1^#(@queue, @futurequeue, @x)) , 5: reverse^#(@xs) -> c_4(appendreverse^#(@xs, nil())) , 6: appendreverse^#(@toreverse, @sofar) -> c_7(appendreverse#1^#(@toreverse, @sofar)) , 7: appendreverse#1^#(nil(), @sofar) -> c_5() , 8: appendreverse#1^#(::(@a, @as), @sofar) -> c_6(appendreverse^#(@as, ::(@a, @sofar))) , 9: dfs#1^#(nil(), @x) -> c_8() , 10: dfs#1^#(::(@t, @ts), @x) -> c_9(dfs#2^#(@t, @t, @ts, @x)) , 11: dfs#2^#(leaf(), @t, @ts, @x) -> c_19(dfs^#(@ts, @x)) , 12: dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_20(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x), #equal^#(@a, @x)) , 13: dobfs^#(@t, @x) -> c_10(bfs^#(::(@t, nil()), nil(), @x)) , 14: dodfs^#(@t, @x) -> c_11(dfs^#(::(@t, nil()), @x)) , 15: dfs^#(@queue, @x) -> c_23(dfs#1^#(@queue, @x)) , 16: bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , 17: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , 18: bfs#1^#(nil(), @futurequeue, @x) -> c_17(bfs#2^#(@futurequeue, @x)) , 19: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_18(bfs#3^#(@t, @futurequeue, @ts, @x)) , 20: bfs#2^#(nil(), @x) -> c_15() , 21: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , 22: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_21(bfs^#(@ts, @futurequeue, @x)) , 23: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_22(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y), #equal^#(@x, @y)) , 24: dfs#3^#(#true(), @t, @t1, @t2, @ts, @x) -> c_24() , 25: dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_25(dfs^#(::(@t1, ::(@t2, @ts)), @x)) , 26: #eq^#(leaf(), leaf()) -> c_26() , 27: #eq^#(leaf(), node(@y_1, @y_2, @y_3)) -> c_27() , 28: #eq^#(leaf(), nil()) -> c_28() , 29: #eq^#(leaf(), ::(@y_1, @y_2)) -> c_29() , 30: #eq^#(#pos(@x), #pos(@y)) -> c_30(#eq^#(@x, @y)) , 31: #eq^#(#pos(@x), #0()) -> c_31() , 32: #eq^#(#pos(@x), #neg(@y)) -> c_32() , 33: #eq^#(node(@x_1, @x_2, @x_3), leaf()) -> c_33() , 34: #eq^#(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> c_34(#and^#(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))), #eq^#(@x_1, @y_1), #and^#(#eq(@x_2, @y_2), #eq(@x_3, @y_3)), #eq^#(@x_2, @y_2), #eq^#(@x_3, @y_3)) , 35: #eq^#(node(@x_1, @x_2, @x_3), nil()) -> c_35() , 36: #eq^#(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> c_36() , 37: #eq^#(nil(), leaf()) -> c_37() , 38: #eq^#(nil(), node(@y_1, @y_2, @y_3)) -> c_38() , 39: #eq^#(nil(), nil()) -> c_39() , 40: #eq^#(nil(), ::(@y_1, @y_2)) -> c_40() , 41: #eq^#(::(@x_1, @x_2), leaf()) -> c_41() , 42: #eq^#(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> c_42() , 43: #eq^#(::(@x_1, @x_2), nil()) -> c_43() , 44: #eq^#(::(@x_1, @x_2), ::(@y_1, @y_2)) -> c_44(#and^#(#eq(@x_1, @y_1), #eq(@x_2, @y_2)), #eq^#(@x_1, @y_1), #eq^#(@x_2, @y_2)) , 45: #eq^#(#0(), #pos(@y)) -> c_45() , 46: #eq^#(#0(), #0()) -> c_46() , 47: #eq^#(#0(), #neg(@y)) -> c_47() , 48: #eq^#(#0(), #s(@y)) -> c_48() , 49: #eq^#(#neg(@x), #pos(@y)) -> c_49() , 50: #eq^#(#neg(@x), #0()) -> c_50() , 51: #eq^#(#neg(@x), #neg(@y)) -> c_51(#eq^#(@x, @y)) , 52: #eq^#(#s(@x), #0()) -> c_52() , 53: #eq^#(#s(@x), #s(@y)) -> c_53(#eq^#(@x, @y)) , 54: #and^#(#true(), #true()) -> c_54() , 55: #and^#(#true(), #false()) -> c_55() , 56: #and^#(#false(), #true()) -> c_56() , 57: #and^#(#false(), #false()) -> c_57() } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_3(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_14(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_4(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_7(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_6(appendreverse^#(@as, ::(@a, @sofar))) , dfs#1^#(::(@t, @ts), @x) -> c_9(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_19(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_20(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x), #equal^#(@a, @x)) , dobfs^#(@t, @x) -> c_10(bfs^#(::(@t, nil()), nil(), @x)) , dodfs^#(@t, @x) -> c_11(dfs^#(::(@t, nil()), @x)) , dfs^#(@queue, @x) -> c_23(dfs#1^#(@queue, @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_17(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_18(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_21(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_22(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y), #equal^#(@x, @y)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_25(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak DPs: { #equal^#(@x, @y) -> c_1(#eq^#(@x, @y)) , #eq^#(leaf(), leaf()) -> c_26() , #eq^#(leaf(), node(@y_1, @y_2, @y_3)) -> c_27() , #eq^#(leaf(), nil()) -> c_28() , #eq^#(leaf(), ::(@y_1, @y_2)) -> c_29() , #eq^#(#pos(@x), #pos(@y)) -> c_30(#eq^#(@x, @y)) , #eq^#(#pos(@x), #0()) -> c_31() , #eq^#(#pos(@x), #neg(@y)) -> c_32() , #eq^#(node(@x_1, @x_2, @x_3), leaf()) -> c_33() , #eq^#(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> c_34(#and^#(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))), #eq^#(@x_1, @y_1), #and^#(#eq(@x_2, @y_2), #eq(@x_3, @y_3)), #eq^#(@x_2, @y_2), #eq^#(@x_3, @y_3)) , #eq^#(node(@x_1, @x_2, @x_3), nil()) -> c_35() , #eq^#(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> c_36() , #eq^#(nil(), leaf()) -> c_37() , #eq^#(nil(), node(@y_1, @y_2, @y_3)) -> c_38() , #eq^#(nil(), nil()) -> c_39() , #eq^#(nil(), ::(@y_1, @y_2)) -> c_40() , #eq^#(::(@x_1, @x_2), leaf()) -> c_41() , #eq^#(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> c_42() , #eq^#(::(@x_1, @x_2), nil()) -> c_43() , #eq^#(::(@x_1, @x_2), ::(@y_1, @y_2)) -> c_44(#and^#(#eq(@x_1, @y_1), #eq(@x_2, @y_2)), #eq^#(@x_1, @y_1), #eq^#(@x_2, @y_2)) , #eq^#(#0(), #pos(@y)) -> c_45() , #eq^#(#0(), #0()) -> c_46() , #eq^#(#0(), #neg(@y)) -> c_47() , #eq^#(#0(), #s(@y)) -> c_48() , #eq^#(#neg(@x), #pos(@y)) -> c_49() , #eq^#(#neg(@x), #0()) -> c_50() , #eq^#(#neg(@x), #neg(@y)) -> c_51(#eq^#(@x, @y)) , #eq^#(#s(@x), #0()) -> c_52() , #eq^#(#s(@x), #s(@y)) -> c_53(#eq^#(@x, @y)) , bfs#4^#(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_2() , appendreverse#1^#(nil(), @sofar) -> c_5() , dfs#1^#(nil(), @x) -> c_8() , bfs#2^#(nil(), @x) -> c_15() , dfs#3^#(#true(), @t, @t1, @t2, @ts, @x) -> c_24() , #and^#(#true(), #true()) -> c_54() , #and^#(#true(), #false()) -> c_55() , #and^#(#false(), #true()) -> c_56() , #and^#(#false(), #false()) -> c_57() } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dfs#1(nil(), @x) -> leaf() , dfs#1(::(@t, @ts), @x) -> dfs#2(@t, @t, @ts, @x) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , dodfs(@t, @x) -> dfs(::(@t, nil()), @x) , bfs2#1(@t', @x) -> dobfs(@t', @x) , bfs2(@t, @x) -> bfs2#1(dobfs(@t, @x), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , dfs#2(leaf(), @t, @ts, @x) -> dfs(@ts, @x) , dfs#2(node(@a, @t1, @t2), @t, @ts, @x) -> dfs#3(#equal(@a, @x), @t, @t1, @t2, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) , dfs(@queue, @x) -> dfs#1(@queue, @x) , dfs#3(#true(), @t, @t1, @t2, @ts, @x) -> @t , dfs#3(#false(), @t, @t1, @t2, @ts, @x) -> dfs(::(@t1, ::(@t2, @ts)), @x) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. { #equal^#(@x, @y) -> c_1(#eq^#(@x, @y)) , #eq^#(leaf(), leaf()) -> c_26() , #eq^#(leaf(), node(@y_1, @y_2, @y_3)) -> c_27() , #eq^#(leaf(), nil()) -> c_28() , #eq^#(leaf(), ::(@y_1, @y_2)) -> c_29() , #eq^#(#pos(@x), #pos(@y)) -> c_30(#eq^#(@x, @y)) , #eq^#(#pos(@x), #0()) -> c_31() , #eq^#(#pos(@x), #neg(@y)) -> c_32() , #eq^#(node(@x_1, @x_2, @x_3), leaf()) -> c_33() , #eq^#(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> c_34(#and^#(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))), #eq^#(@x_1, @y_1), #and^#(#eq(@x_2, @y_2), #eq(@x_3, @y_3)), #eq^#(@x_2, @y_2), #eq^#(@x_3, @y_3)) , #eq^#(node(@x_1, @x_2, @x_3), nil()) -> c_35() , #eq^#(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> c_36() , #eq^#(nil(), leaf()) -> c_37() , #eq^#(nil(), node(@y_1, @y_2, @y_3)) -> c_38() , #eq^#(nil(), nil()) -> c_39() , #eq^#(nil(), ::(@y_1, @y_2)) -> c_40() , #eq^#(::(@x_1, @x_2), leaf()) -> c_41() , #eq^#(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> c_42() , #eq^#(::(@x_1, @x_2), nil()) -> c_43() , #eq^#(::(@x_1, @x_2), ::(@y_1, @y_2)) -> c_44(#and^#(#eq(@x_1, @y_1), #eq(@x_2, @y_2)), #eq^#(@x_1, @y_1), #eq^#(@x_2, @y_2)) , #eq^#(#0(), #pos(@y)) -> c_45() , #eq^#(#0(), #0()) -> c_46() , #eq^#(#0(), #neg(@y)) -> c_47() , #eq^#(#0(), #s(@y)) -> c_48() , #eq^#(#neg(@x), #pos(@y)) -> c_49() , #eq^#(#neg(@x), #0()) -> c_50() , #eq^#(#neg(@x), #neg(@y)) -> c_51(#eq^#(@x, @y)) , #eq^#(#s(@x), #0()) -> c_52() , #eq^#(#s(@x), #s(@y)) -> c_53(#eq^#(@x, @y)) , bfs#4^#(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_2() , appendreverse#1^#(nil(), @sofar) -> c_5() , dfs#1^#(nil(), @x) -> c_8() , bfs#2^#(nil(), @x) -> c_15() , dfs#3^#(#true(), @t, @t1, @t2, @ts, @x) -> c_24() , #and^#(#true(), #true()) -> c_54() , #and^#(#true(), #false()) -> c_55() , #and^#(#false(), #true()) -> c_56() , #and^#(#false(), #false()) -> c_57() } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_3(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_14(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_4(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_7(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_6(appendreverse^#(@as, ::(@a, @sofar))) , dfs#1^#(::(@t, @ts), @x) -> c_9(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_19(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_20(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x), #equal^#(@a, @x)) , dobfs^#(@t, @x) -> c_10(bfs^#(::(@t, nil()), nil(), @x)) , dodfs^#(@t, @x) -> c_11(dfs^#(::(@t, nil()), @x)) , dfs^#(@queue, @x) -> c_23(dfs#1^#(@queue, @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_17(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_18(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_21(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_22(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y), #equal^#(@x, @y)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_25(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dfs#1(nil(), @x) -> leaf() , dfs#1(::(@t, @ts), @x) -> dfs#2(@t, @t, @ts, @x) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , dodfs(@t, @x) -> dfs(::(@t, nil()), @x) , bfs2#1(@t', @x) -> dobfs(@t', @x) , bfs2(@t, @x) -> bfs2#1(dobfs(@t, @x), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , dfs#2(leaf(), @t, @ts, @x) -> dfs(@ts, @x) , dfs#2(node(@a, @t1, @t2), @t, @ts, @x) -> dfs#3(#equal(@a, @x), @t, @t1, @t2, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) , dfs(@queue, @x) -> dfs#1(@queue, @x) , dfs#3(#true(), @t, @t1, @t2, @ts, @x) -> @t , dfs#3(#false(), @t, @t1, @t2, @ts, @x) -> dfs(::(@t1, ::(@t2, @ts)), @x) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) Due to missing edges in the dependency-graph, the right-hand sides of following rules could be simplified: { dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_20(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x), #equal^#(@a, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_22(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y), #equal^#(@x, @y)) } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , dodfs^#(@t, @x) -> c_10(dfs^#(::(@t, nil()), @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dfs#1(nil(), @x) -> leaf() , dfs#1(::(@t, @ts), @x) -> dfs#2(@t, @t, @ts, @x) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , dodfs(@t, @x) -> dfs(::(@t, nil()), @x) , bfs2#1(@t', @x) -> dobfs(@t', @x) , bfs2(@t, @x) -> bfs2#1(dobfs(@t, @x), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , dfs#2(leaf(), @t, @ts, @x) -> dfs(@ts, @x) , dfs#2(node(@a, @t1, @t2), @t, @ts, @x) -> dfs#3(#equal(@a, @x), @t, @t1, @t2, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) , dfs(@queue, @x) -> dfs#1(@queue, @x) , dfs#3(#true(), @t, @t1, @t2, @ts, @x) -> @t , dfs#3(#false(), @t, @t1, @t2, @ts, @x) -> dfs(::(@t1, ::(@t2, @ts)), @x) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) We replace rewrite rules by usable rules: Weak Usable Rules: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , dodfs^#(@t, @x) -> c_10(dfs^#(::(@t, nil()), @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) Consider the dependency graph 1: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) -->_1 bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) :2 2: bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) -->_1 bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) :15 -->_1 bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) :14 3: reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) -->_1 appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) :4 4: appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) -->_1 appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) :5 5: appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) -->_1 appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) :4 6: dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) -->_1 dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) :8 -->_1 dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) :7 7: dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) -->_1 dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) :11 8: dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) -->_1 dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) :19 9: dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) -->_1 bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) :2 10: dodfs^#(@t, @x) -> c_10(dfs^#(::(@t, nil()), @x)) -->_1 dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) :11 11: dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) -->_1 dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) :6 12: bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) -->_1 dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) :9 13: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) -->_1 bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) :12 -->_2 dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) :9 14: bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) -->_1 bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) :16 15: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) -->_1 bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) :18 -->_1 bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) :17 16: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) -->_2 reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) :3 -->_1 bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) :2 17: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) -->_1 bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) :2 18: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) -->_1 bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) :1 19: dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) -->_1 dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) :11 Following roots of the dependency graph are removed, as the considered set of starting terms is closed under reduction with respect to these rules (modulo compound contexts). { dodfs^#(@t, @x) -> c_10(dfs^#(::(@t, nil()), @x)) } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) We analyse the complexity of following sub-problems (R) and (S). Problem (S) is obtained from the input problem by shifting strict rules from (R) into the weak component: Problem (R): ------------ Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } StartTerms: basic terms Strategy: innermost Problem (S): ------------ Strict DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } StartTerms: basic terms Strategy: innermost Overall, the transformation results in the following sub-problem(s): Generated new problems: ----------------------- R) Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } StartTerms: basic terms Strategy: innermost This problem was proven YES(O(1),O(n^2)). S) Strict DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } StartTerms: basic terms Strategy: innermost This problem was proven YES(O(1),O(n^1)). Proofs for generated problems: ------------------------------ R) We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^2)). Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^2)) We decompose the input problem according to the dependency graph into the upper component { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } and lower component { reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) } Further, following extension rules are added to the lower component. { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , bfs^#(@queue, @futurequeue, @x) -> bfs#1^#(@queue, @futurequeue, @x) , dobfs^#(@t, @x) -> bfs^#(::(@t, nil()), nil(), @x) , bfs2#1^#(@t', @x) -> dobfs^#(@t', @x) , bfs2^#(@t, @x) -> dobfs^#(@t, @x) , bfs2^#(@t, @x) -> bfs2#1^#(dobfs(@t, @x), @x) , bfs#1^#(nil(), @futurequeue, @x) -> bfs#2^#(@futurequeue, @x) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> bfs#3^#(@t, @futurequeue, @ts, @x) , bfs#2^#(::(@t, @ts), @x) -> bfs^#(reverse(::(@t, @ts)), nil(), @x) , bfs#2^#(::(@t, @ts), @x) -> reverse^#(::(@t, @ts)) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> bfs^#(@ts, @futurequeue, @x) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } TcT solves the upper component with certificate YES(O(1),O(n^1)). Sub-proof: ---------- We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 1' to orient following rules strictly. DPs: { 1: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 9: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) } Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #0()) -> #true() , #and(#true(), #true()) -> #true() , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_9) = {1}, Uargs(c_12) = {1}, Uargs(c_13) = {1, 2}, Uargs(c_14) = {1}, Uargs(c_15) = {1}, Uargs(c_16) = {1}, Uargs(c_17) = {1}, Uargs(c_18) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA). [#equal](x1, x2) = [3] x2 + [3] [bfs#4](x1, x2, x3, x4, x5, x6, x7) = [1] x2 + [1] x3 + [1] x4 + [1] x5 + [5] [#eq](x1, x2) = [2] x2 + [1] [reverse](x1) = [1] x1 + [0] [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] [#true] = [0] [leaf] = [1] [dobfs](x1, x2) = [2] x1 + [3] [#pos](x1) = [1] x1 + [0] [node](x1, x2, x3) = [1] x2 + [1] x3 + [3] [bfs](x1, x2, x3) = [1] x1 + [1] x2 + [1] [#and](x1, x2) = [1] [nil] = [0] [bfs#2](x1, x2) = [1] x1 + [1] [#false] = [1] [::](x1, x2) = [1] x1 + [1] x2 + [2] [bfs#1](x1, x2, x3) = [1] x1 + [1] x2 + [1] [bfs#3](x1, x2, x3, x4) = [1] x1 + [1] x2 + [1] x3 + [2] [#0] = [0] [#neg](x1) = [1] x1 + [0] [#s](x1) = [1] x1 + [0] [bfs#4^#](x1, x2, x3, x4, x5, x6, x7) = [1] x2 + [1] x3 + [1] x4 + [1] x5 + [5] [bfs^#](x1, x2, x3) = [1] x1 + [1] x2 + [0] [reverse^#](x1) = [0] [dobfs^#](x1, x2) = [1] x1 + [2] [bfs2#1^#](x1, x2) = [1] x1 + [4] x2 + [2] [bfs2^#](x1, x2) = [7] x1 + [7] x2 + [7] [bfs#1^#](x1, x2, x3) = [1] x1 + [1] x2 + [0] [bfs#2^#](x1, x2) = [1] x1 + [0] [bfs#3^#](x1, x2, x3, x4) = [1] x1 + [1] x2 + [1] x3 + [2] [c_1](x1) = [1] x1 + [0] [c_2](x1) = [1] x1 + [0] [c_9](x1) = [1] x1 + [0] [c_12](x1) = [1] x1 + [0] [c_13](x1, x2) = [1] x1 + [1] x2 + [0] [c_14](x1) = [1] x1 + [0] [c_15](x1) = [1] x1 + [0] [c_16](x1, x2) = [1] x1 + [1] x2 + [0] [c_17](x1) = [1] x1 + [1] [c_18](x1) = [1] x1 + [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [3] @y + [3] > [2] @y + [1] = [#eq(@x, @y)] [bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] > [1] @t1 + [1] @t2 + [3] = [node(@y, @t1, @t2)] [bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] >= [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] = [bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)] [#eq(leaf(), leaf())] = [3] > [0] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [2] @y_2 + [2] @y_3 + [7] > [1] = [#false()] [#eq(leaf(), nil())] = [1] >= [1] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [2] @y_1 + [2] @y_2 + [5] > [1] = [#false()] [#eq(#pos(@x), #pos(@y))] = [2] @y + [1] >= [2] @y + [1] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [1] >= [1] = [#false()] [#eq(#pos(@x), #neg(@y))] = [2] @y + [1] >= [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [3] > [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [2] @y_2 + [2] @y_3 + [7] > [1] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [1] >= [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [2] @y_1 + [2] @y_2 + [5] > [1] = [#false()] [#eq(nil(), leaf())] = [3] > [1] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [2] @y_2 + [2] @y_3 + [7] > [1] = [#false()] [#eq(nil(), nil())] = [1] > [0] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [2] @y_1 + [2] @y_2 + [5] > [1] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [3] > [1] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [2] @y_2 + [2] @y_3 + [7] > [1] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [1] >= [1] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [2] @y_1 + [2] @y_2 + [5] > [1] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [2] @y + [1] >= [1] = [#false()] [#eq(#0(), #0())] = [1] > [0] = [#true()] [#eq(#0(), #neg(@y))] = [2] @y + [1] >= [1] = [#false()] [#eq(#0(), #s(@y))] = [2] @y + [1] >= [1] = [#false()] [#eq(#neg(@x), #pos(@y))] = [2] @y + [1] >= [1] = [#false()] [#eq(#neg(@x), #0())] = [1] >= [1] = [#false()] [#eq(#neg(@x), #neg(@y))] = [2] @y + [1] >= [2] @y + [1] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [1] >= [1] = [#false()] [#eq(#s(@x), #s(@y))] = [2] @y + [1] >= [2] @y + [1] = [#eq(@x, @y)] [reverse(@xs)] = [1] @xs + [0] >= [1] @xs + [0] = [appendreverse(@xs, nil())] [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] >= [1] @sofar + [0] = [@sofar] [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [2] >= [1] @sofar + [1] @a + [1] @as + [2] = [appendreverse(@as, ::(@a, @sofar))] [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] >= [1] @toreverse + [1] @sofar + [0] = [appendreverse#1(@toreverse, @sofar)] [dobfs(@t, @x)] = [2] @t + [3] >= [1] @t + [3] = [bfs(::(@t, nil()), nil(), @x)] [bfs(@queue, @futurequeue, @x)] = [1] @queue + [1] @futurequeue + [1] >= [1] @queue + [1] @futurequeue + [1] = [bfs#1(@queue, @futurequeue, @x)] [#and(#true(), #true())] = [1] > [0] = [#true()] [#and(#true(), #false())] = [1] >= [1] = [#false()] [#and(#false(), #true())] = [1] >= [1] = [#false()] [#and(#false(), #false())] = [1] >= [1] = [#false()] [bfs#2(nil(), @x)] = [1] >= [1] = [leaf()] [bfs#2(::(@t, @ts), @x)] = [1] @t + [1] @ts + [3] >= [1] @t + [1] @ts + [3] = [bfs(reverse(::(@t, @ts)), nil(), @x)] [bfs#1(nil(), @futurequeue, @x)] = [1] @futurequeue + [1] >= [1] @futurequeue + [1] = [bfs#2(@futurequeue, @x)] [bfs#1(::(@t, @ts), @futurequeue, @x)] = [1] @futurequeue + [1] @t + [1] @ts + [3] > [1] @futurequeue + [1] @t + [1] @ts + [2] = [bfs#3(@t, @futurequeue, @ts, @x)] [bfs#3(leaf(), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [3] > [1] @futurequeue + [1] @ts + [1] = [bfs(@ts, @futurequeue, @x)] [bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] >= [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] = [bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)] [bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] > [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [4] = [c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x))] [bfs^#(@queue, @futurequeue, @x)] = [1] @queue + [1] @futurequeue + [0] >= [1] @queue + [1] @futurequeue + [0] = [c_2(bfs#1^#(@queue, @futurequeue, @x))] [dobfs^#(@t, @x)] = [1] @t + [2] >= [1] @t + [2] = [c_9(bfs^#(::(@t, nil()), nil(), @x))] [bfs2#1^#(@t', @x)] = [4] @x + [1] @t' + [2] >= [1] @t' + [2] = [c_12(dobfs^#(@t', @x))] [bfs2^#(@t, @x)] = [7] @x + [7] @t + [7] >= [4] @x + [3] @t + [7] = [c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x))] [bfs#1^#(nil(), @futurequeue, @x)] = [1] @futurequeue + [0] >= [1] @futurequeue + [0] = [c_14(bfs#2^#(@futurequeue, @x))] [bfs#1^#(::(@t, @ts), @futurequeue, @x)] = [1] @futurequeue + [1] @t + [1] @ts + [2] >= [1] @futurequeue + [1] @t + [1] @ts + [2] = [c_15(bfs#3^#(@t, @futurequeue, @ts, @x))] [bfs#2^#(::(@t, @ts), @x)] = [1] @t + [1] @ts + [2] >= [1] @t + [1] @ts + [2] = [c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts)))] [bfs#3^#(leaf(), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [3] > [1] @futurequeue + [1] @ts + [1] = [c_17(bfs^#(@ts, @futurequeue, @x))] [bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] >= [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] = [c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y))] We return to the main proof. Consider the set of all dependency pairs : { 1: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 2: bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , 3: dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , 4: bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , 5: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , 6: bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , 7: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , 8: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , 9: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , 10: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Processor 'matrix interpretation of dimension 1' induces the complexity certificate YES(?,O(n^1)) on application of dependency pairs {1,9}. These cover all (indirect) predecessors of dependency pairs {1,3,4,5,9}, their number of application is equally bounded. The dependency pairs are shifted into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 1' to orient following rules strictly. DPs: { 5: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) , 6: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 7: dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , 9: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) } Trs: { bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_9) = {1}, Uargs(c_12) = {1}, Uargs(c_13) = {1, 2}, Uargs(c_14) = {1}, Uargs(c_15) = {1}, Uargs(c_16) = {1}, Uargs(c_17) = {1}, Uargs(c_18) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA). [#equal](x1, x2) = [6] [bfs#4](x1, x2, x3, x4, x5, x6, x7) = [1] x1 + [1] x2 + [1] x3 + [1] x4 + [1] x5 + [0] [#eq](x1, x2) = [6] [reverse](x1) = [1] x1 + [0] [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] [#true] = [6] [leaf] = [0] [dobfs](x1, x2) = [1] x1 + [0] [#pos](x1) = [1] x1 + [0] [node](x1, x2, x3) = [1] x2 + [1] x3 + [6] [bfs](x1, x2, x3) = [1] x1 + [1] x2 + [0] [#and](x1, x2) = [6] [nil] = [0] [bfs#2](x1, x2) = [1] x1 + [0] [#false] = [6] [::](x1, x2) = [1] x1 + [1] x2 + [0] [bfs#1](x1, x2, x3) = [1] x1 + [1] x2 + [0] [bfs#3](x1, x2, x3, x4) = [1] x1 + [1] x2 + [1] x3 + [0] [#0] = [0] [#neg](x1) = [1] x1 + [0] [#s](x1) = [1] x1 + [0] [bfs#4^#](x1, x2, x3, x4, x5, x6, x7) = [2] x1 + [2] x2 + [2] x3 + [2] x4 + [2] x5 + [0] [bfs^#](x1, x2, x3) = [2] x1 + [2] x2 + [1] [reverse^#](x1) = [0] [dobfs^#](x1, x2) = [2] x1 + [2] [bfs2#1^#](x1, x2) = [2] x1 + [2] x2 + [2] [bfs2^#](x1, x2) = [7] x1 + [7] x2 + [7] [bfs#1^#](x1, x2, x3) = [2] x1 + [2] x2 + [1] [bfs#2^#](x1, x2) = [2] x1 + [1] [bfs#3^#](x1, x2, x3, x4) = [2] x1 + [2] x2 + [2] x3 + [1] [c_1](x1) = [1] x1 + [3] [c_2](x1) = [1] x1 + [0] [c_9](x1) = [1] x1 + [0] [c_12](x1) = [1] x1 + [0] [c_13](x1, x2) = [2] x1 + [1] x2 + [0] [c_14](x1) = [1] x1 + [0] [c_15](x1) = [1] x1 + [0] [c_16](x1, x2) = [1] x1 + [1] x2 + [0] [c_17](x1) = [1] x1 + [0] [c_18](x1) = [1] x1 + [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [6] >= [6] = [#eq(@x, @y)] [bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [6] >= [1] @t1 + [1] @t2 + [6] = [node(@y, @t1, @t2)] [bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [6] > [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [0] = [bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)] [#eq(leaf(), leaf())] = [6] >= [6] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [6] >= [6] = [#false()] [#eq(leaf(), nil())] = [6] >= [6] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [6] >= [6] = [#false()] [#eq(#pos(@x), #pos(@y))] = [6] >= [6] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [6] >= [6] = [#false()] [#eq(#pos(@x), #neg(@y))] = [6] >= [6] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [6] >= [6] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [6] >= [6] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [6] >= [6] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [6] >= [6] = [#false()] [#eq(nil(), leaf())] = [6] >= [6] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [6] >= [6] = [#false()] [#eq(nil(), nil())] = [6] >= [6] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [6] >= [6] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [6] >= [6] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [6] >= [6] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [6] >= [6] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [6] >= [6] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [6] >= [6] = [#false()] [#eq(#0(), #0())] = [6] >= [6] = [#true()] [#eq(#0(), #neg(@y))] = [6] >= [6] = [#false()] [#eq(#0(), #s(@y))] = [6] >= [6] = [#false()] [#eq(#neg(@x), #pos(@y))] = [6] >= [6] = [#false()] [#eq(#neg(@x), #0())] = [6] >= [6] = [#false()] [#eq(#neg(@x), #neg(@y))] = [6] >= [6] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [6] >= [6] = [#false()] [#eq(#s(@x), #s(@y))] = [6] >= [6] = [#eq(@x, @y)] [reverse(@xs)] = [1] @xs + [0] >= [1] @xs + [0] = [appendreverse(@xs, nil())] [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] >= [1] @sofar + [0] = [@sofar] [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [0] >= [1] @sofar + [1] @a + [1] @as + [0] = [appendreverse(@as, ::(@a, @sofar))] [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] >= [1] @toreverse + [1] @sofar + [0] = [appendreverse#1(@toreverse, @sofar)] [dobfs(@t, @x)] = [1] @t + [0] >= [1] @t + [0] = [bfs(::(@t, nil()), nil(), @x)] [bfs(@queue, @futurequeue, @x)] = [1] @queue + [1] @futurequeue + [0] >= [1] @queue + [1] @futurequeue + [0] = [bfs#1(@queue, @futurequeue, @x)] [#and(#true(), #true())] = [6] >= [6] = [#true()] [#and(#true(), #false())] = [6] >= [6] = [#false()] [#and(#false(), #true())] = [6] >= [6] = [#false()] [#and(#false(), #false())] = [6] >= [6] = [#false()] [bfs#2(nil(), @x)] = [0] >= [0] = [leaf()] [bfs#2(::(@t, @ts), @x)] = [1] @t + [1] @ts + [0] >= [1] @t + [1] @ts + [0] = [bfs(reverse(::(@t, @ts)), nil(), @x)] [bfs#1(nil(), @futurequeue, @x)] = [1] @futurequeue + [0] >= [1] @futurequeue + [0] = [bfs#2(@futurequeue, @x)] [bfs#1(::(@t, @ts), @futurequeue, @x)] = [1] @futurequeue + [1] @t + [1] @ts + [0] >= [1] @futurequeue + [1] @t + [1] @ts + [0] = [bfs#3(@t, @futurequeue, @ts, @x)] [bfs#3(leaf(), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [0] >= [1] @futurequeue + [1] @ts + [0] = [bfs(@ts, @futurequeue, @x)] [bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [6] >= [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [6] = [bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)] [bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [2] @futurequeue + [2] @ts + [2] @t1 + [2] @t2 + [12] > [2] @futurequeue + [2] @ts + [2] @t1 + [2] @t2 + [4] = [c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x))] [bfs^#(@queue, @futurequeue, @x)] = [2] @queue + [2] @futurequeue + [1] >= [2] @queue + [2] @futurequeue + [1] = [c_2(bfs#1^#(@queue, @futurequeue, @x))] [dobfs^#(@t, @x)] = [2] @t + [2] > [2] @t + [1] = [c_9(bfs^#(::(@t, nil()), nil(), @x))] [bfs2#1^#(@t', @x)] = [2] @x + [2] @t' + [2] >= [2] @t' + [2] = [c_12(dobfs^#(@t', @x))] [bfs2^#(@t, @x)] = [7] @x + [7] @t + [7] > [4] @x + [6] @t + [6] = [c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x))] [bfs#1^#(nil(), @futurequeue, @x)] = [2] @futurequeue + [1] >= [2] @futurequeue + [1] = [c_14(bfs#2^#(@futurequeue, @x))] [bfs#1^#(::(@t, @ts), @futurequeue, @x)] = [2] @futurequeue + [2] @t + [2] @ts + [1] >= [2] @futurequeue + [2] @t + [2] @ts + [1] = [c_15(bfs#3^#(@t, @futurequeue, @ts, @x))] [bfs#2^#(::(@t, @ts), @x)] = [2] @t + [2] @ts + [1] >= [2] @t + [2] @ts + [1] = [c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts)))] [bfs#3^#(leaf(), @futurequeue, @ts, @x)] = [2] @futurequeue + [2] @ts + [1] >= [2] @futurequeue + [2] @ts + [1] = [c_17(bfs^#(@ts, @futurequeue, @x))] [bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [2] @futurequeue + [2] @ts + [2] @t1 + [2] @t2 + [13] > [2] @futurequeue + [2] @ts + [2] @t1 + [2] @t2 + [12] = [c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y))] We return to the main proof. Consider the set of all dependency pairs : { 1: bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , 2: bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , 3: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , 4: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , 5: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) , 6: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 7: dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , 8: bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , 9: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , 10: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) } Processor 'matrix interpretation of dimension 1' induces the complexity certificate YES(?,O(n^1)) on application of dependency pairs {5,6,7,9}. These cover all (indirect) predecessors of dependency pairs {5,6,7,8,9}, their number of application is equally bounded. The dependency pairs are shifted into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) } Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 1' to orient following rules strictly. DPs: { 3: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , 6: dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , 10: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Trs: { bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(nil(), nil()) -> #true() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #0()) -> #true() , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_9) = {1}, Uargs(c_12) = {1}, Uargs(c_13) = {1, 2}, Uargs(c_14) = {1}, Uargs(c_15) = {1}, Uargs(c_16) = {1}, Uargs(c_17) = {1}, Uargs(c_18) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA). [#equal](x1, x2) = [1] x1 + [1] x2 + [3] [bfs#4](x1, x2, x3, x4, x5, x6, x7) = [1] x2 + [1] x3 + [1] x4 + [1] x5 + [4] [#eq](x1, x2) = [3] [reverse](x1) = [1] x1 + [0] [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] [#true] = [0] [leaf] = [0] [dobfs](x1, x2) = [1] x1 + [1] [#pos](x1) = [1] x1 + [0] [node](x1, x2, x3) = [1] x2 + [1] x3 + [4] [bfs](x1, x2, x3) = [1] x1 + [1] x2 + [0] [#and](x1, x2) = [0] [nil] = [0] [bfs#2](x1, x2) = [1] x1 + [0] [#false] = [4] [::](x1, x2) = [1] x1 + [1] x2 + [1] [bfs#1](x1, x2, x3) = [1] x1 + [1] x2 + [0] [bfs#3](x1, x2, x3, x4) = [1] x1 + [1] x2 + [1] x3 + [0] [#0] = [0] [#neg](x1) = [1] x1 + [0] [#s](x1) = [1] x1 + [0] [bfs#4^#](x1, x2, x3, x4, x5, x6, x7) = [1] x2 + [1] x3 + [1] x4 + [1] x5 + [3] [bfs^#](x1, x2, x3) = [1] x1 + [1] x2 + [1] [reverse^#](x1) = [0] [dobfs^#](x1, x2) = [1] x1 + [3] [bfs2#1^#](x1, x2) = [1] x1 + [4] x2 + [3] [bfs2^#](x1, x2) = [7] x1 + [7] x2 + [7] [bfs#1^#](x1, x2, x3) = [1] x1 + [1] x2 + [1] [bfs#2^#](x1, x2) = [1] x1 + [1] [bfs#3^#](x1, x2, x3, x4) = [1] x1 + [1] x2 + [1] x3 + [1] [c_1](x1) = [1] x1 + [0] [c_2](x1) = [1] x1 + [0] [c_9](x1) = [1] x1 + [0] [c_12](x1) = [1] x1 + [0] [c_13](x1, x2) = [1] x1 + [1] x2 + [0] [c_14](x1) = [1] x1 + [0] [c_15](x1) = [1] x1 + [0] [c_16](x1, x2) = [1] x1 + [1] x2 + [0] [c_17](x1) = [1] x1 + [0] [c_18](x1) = [1] x1 + [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [1] @x + [1] @y + [3] >= [3] = [#eq(@x, @y)] [bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [4] >= [1] @t1 + [1] @t2 + [4] = [node(@y, @t1, @t2)] [bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [4] > [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [2] = [bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)] [#eq(leaf(), leaf())] = [3] > [0] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [3] ? [4] = [#false()] [#eq(leaf(), nil())] = [3] ? [4] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [3] ? [4] = [#false()] [#eq(#pos(@x), #pos(@y))] = [3] >= [3] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [3] ? [4] = [#false()] [#eq(#pos(@x), #neg(@y))] = [3] ? [4] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [3] ? [4] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [3] > [0] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [3] ? [4] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [3] ? [4] = [#false()] [#eq(nil(), leaf())] = [3] ? [4] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [3] ? [4] = [#false()] [#eq(nil(), nil())] = [3] > [0] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [3] ? [4] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [3] ? [4] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [3] ? [4] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [3] ? [4] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [3] > [0] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [3] ? [4] = [#false()] [#eq(#0(), #0())] = [3] > [0] = [#true()] [#eq(#0(), #neg(@y))] = [3] ? [4] = [#false()] [#eq(#0(), #s(@y))] = [3] ? [4] = [#false()] [#eq(#neg(@x), #pos(@y))] = [3] ? [4] = [#false()] [#eq(#neg(@x), #0())] = [3] ? [4] = [#false()] [#eq(#neg(@x), #neg(@y))] = [3] >= [3] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [3] ? [4] = [#false()] [#eq(#s(@x), #s(@y))] = [3] >= [3] = [#eq(@x, @y)] [reverse(@xs)] = [1] @xs + [0] >= [1] @xs + [0] = [appendreverse(@xs, nil())] [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] >= [1] @sofar + [0] = [@sofar] [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [1] >= [1] @sofar + [1] @a + [1] @as + [1] = [appendreverse(@as, ::(@a, @sofar))] [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] >= [1] @toreverse + [1] @sofar + [0] = [appendreverse#1(@toreverse, @sofar)] [dobfs(@t, @x)] = [1] @t + [1] >= [1] @t + [1] = [bfs(::(@t, nil()), nil(), @x)] [bfs(@queue, @futurequeue, @x)] = [1] @queue + [1] @futurequeue + [0] >= [1] @queue + [1] @futurequeue + [0] = [bfs#1(@queue, @futurequeue, @x)] [#and(#true(), #true())] = [0] >= [0] = [#true()] [#and(#true(), #false())] = [0] ? [4] = [#false()] [#and(#false(), #true())] = [0] ? [4] = [#false()] [#and(#false(), #false())] = [0] ? [4] = [#false()] [bfs#2(nil(), @x)] = [0] >= [0] = [leaf()] [bfs#2(::(@t, @ts), @x)] = [1] @t + [1] @ts + [1] >= [1] @t + [1] @ts + [1] = [bfs(reverse(::(@t, @ts)), nil(), @x)] [bfs#1(nil(), @futurequeue, @x)] = [1] @futurequeue + [0] >= [1] @futurequeue + [0] = [bfs#2(@futurequeue, @x)] [bfs#1(::(@t, @ts), @futurequeue, @x)] = [1] @futurequeue + [1] @t + [1] @ts + [1] > [1] @futurequeue + [1] @t + [1] @ts + [0] = [bfs#3(@t, @futurequeue, @ts, @x)] [bfs#3(leaf(), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [0] >= [1] @futurequeue + [1] @ts + [0] = [bfs(@ts, @futurequeue, @x)] [bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [4] >= [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [4] = [bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)] [bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [3] >= [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [3] = [c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x))] [bfs^#(@queue, @futurequeue, @x)] = [1] @queue + [1] @futurequeue + [1] >= [1] @queue + [1] @futurequeue + [1] = [c_2(bfs#1^#(@queue, @futurequeue, @x))] [dobfs^#(@t, @x)] = [1] @t + [3] > [1] @t + [2] = [c_9(bfs^#(::(@t, nil()), nil(), @x))] [bfs2#1^#(@t', @x)] = [4] @x + [1] @t' + [3] >= [1] @t' + [3] = [c_12(dobfs^#(@t', @x))] [bfs2^#(@t, @x)] = [7] @x + [7] @t + [7] >= [4] @x + [2] @t + [7] = [c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x))] [bfs#1^#(nil(), @futurequeue, @x)] = [1] @futurequeue + [1] >= [1] @futurequeue + [1] = [c_14(bfs#2^#(@futurequeue, @x))] [bfs#1^#(::(@t, @ts), @futurequeue, @x)] = [1] @futurequeue + [1] @t + [1] @ts + [2] > [1] @futurequeue + [1] @t + [1] @ts + [1] = [c_15(bfs#3^#(@t, @futurequeue, @ts, @x))] [bfs#2^#(::(@t, @ts), @x)] = [1] @t + [1] @ts + [2] >= [1] @t + [1] @ts + [2] = [c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts)))] [bfs#3^#(leaf(), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] >= [1] @futurequeue + [1] @ts + [1] = [c_17(bfs^#(@ts, @futurequeue, @x))] [bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [5] > [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [3] = [c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y))] We return to the main proof. Consider the set of all dependency pairs : { 1: bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , 2: bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , 3: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , 4: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , 5: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 6: dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , 7: bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , 8: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , 9: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , 10: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Processor 'matrix interpretation of dimension 1' induces the complexity certificate YES(?,O(n^1)) on application of dependency pairs {3,6,10}. These cover all (indirect) predecessors of dependency pairs {3,5,6,7,8,9,10}, their number of application is equally bounded. The dependency pairs are shifted into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) } Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 2' to orient following rules strictly. DPs: { 2: bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , 3: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , 4: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 6: bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , 10: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Trs: { bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#s(@x), #0()) -> #false() , #and(#true(), #true()) -> #true() , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_9) = {1}, Uargs(c_12) = {1}, Uargs(c_13) = {1, 2}, Uargs(c_14) = {1}, Uargs(c_15) = {1}, Uargs(c_16) = {1}, Uargs(c_17) = {1}, Uargs(c_18) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA) and not(IDA(1)). [#equal](x1, x2) = [4] [1] [bfs#4](x1, x2, x3, x4, x5, x6, x7) = [0 2] x2 + [2 2] x3 + [2 1] x4 + [0 2] x5 + [7] [0 0] [0 0] [0 0] [0 0] [0] [#eq](x1, x2) = [4] [1] [reverse](x1) = [5 1] x1 + [0] [0 1] [0] [appendreverse#1](x1, x2) = [2 1] x1 + [2 0] x2 + [0] [0 1] [0 1] [0] [appendreverse](x1, x2) = [2 1] x1 + [2 0] x2 + [0] [0 1] [0 1] [0] [#true] = [0] [1] [leaf] = [0] [0] [dobfs](x1, x2) = [2 0] x1 + [0 0] x2 + [0] [0 0] [1 0] [0] [#pos](x1) = [1 0] x1 + [0] [0 1] [0] [node](x1, x2, x3) = [1 1] x2 + [1 1] x3 + [6] [0 0] [0 0] [0] [bfs](x1, x2, x3) = [0 2] x1 + [0 2] x2 + [0] [0 0] [0 0] [0] [#and](x1, x2) = [0 1] x1 + [1] [0 0] [1] [nil] = [0] [0] [bfs#2](x1, x2) = [0 2] x1 + [0] [0 0] [0] [#false] = [2] [1] [::](x1, x2) = [0 1] x1 + [1 0] x2 + [4] [1 0] [0 1] [0] [bfs#1](x1, x2, x3) = [0 2] x1 + [0 2] x2 + [0] [0 0] [0 0] [0] [bfs#3](x1, x2, x3, x4) = [2 0] x1 + [0 2] x2 + [0 2] x3 + [0] [0 0] [0 0] [0 0] [0] [#0] = [0] [0] [#neg](x1) = [1 0] x1 + [1] [0 1] [0] [#s](x1) = [1 0] x1 + [0] [0 1] [0] [bfs#4^#](x1, x2, x3, x4, x5, x6, x7) = [1 5] x1 + [1 2] x2 + [2 1] x3 + [2 1] x4 + [0 2] x5 + [5] [0 0] [0 0] [0 0] [0 0] [0 0] [0] [bfs^#](x1, x2, x3) = [0 2] x1 + [1 2] x2 + [0 0] x3 + [3] [1 0] [1 1] [1 0] [0] [reverse^#](x1) = [1 0] x1 + [0] [1 0] [1] [dobfs^#](x1, x2) = [2 5] x1 + [3] [0 1] [0] [bfs2#1^#](x1, x2) = [2 7] x1 + [0 0] x2 + [4] [0 0] [4 4] [1] [bfs2^#](x1, x2) = [7 7] x1 + [7 7] x2 + [7] [7 7] [7 7] [7] [bfs#1^#](x1, x2, x3) = [0 2] x1 + [1 2] x2 + [3] [0 0] [0 0] [0] [bfs#2^#](x1, x2) = [1 2] x1 + [1] [0 0] [0] [bfs#3^#](x1, x2, x3, x4) = [2 0] x1 + [1 2] x2 + [0 2] x3 + [3] [0 0] [0 0] [0 0] [0] [c_1](x1) = [1 0] x1 + [0] [0 0] [0] [c_2](x1) = [1 1] x1 + [0] [0 0] [0] [c_9](x1) = [1 0] x1 + [0] [0 0] [0] [c_12](x1) = [1 2] x1 + [0] [0 0] [0] [c_13](x1, x2) = [1 0] x1 + [1 1] x2 + [0] [0 0] [0 0] [4] [c_14](x1) = [1 1] x1 + [1] [0 0] [0] [c_15](x1) = [1 1] x1 + [0] [0 0] [0] [c_16](x1, x2) = [1 0] x1 + [0] [0 0] [0] [c_17](x1) = [1 0] x1 + [0] [0 0] [0] [c_18](x1) = [1 1] x1 + [0] [0 0] [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [4] [1] >= [4] [1] = [#eq(@x, @y)] [bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [0 2] @futurequeue + [0 2] @ts + [2 2] @t1 + [2 1] @t2 + [7] [0 0] [0 0] [0 0] [0 0] [0] > [1 1] @t1 + [1 1] @t2 + [6] [0 0] [0 0] [0] = [node(@y, @t1, @t2)] [bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [0 2] @futurequeue + [0 2] @ts + [2 2] @t1 + [2 1] @t2 + [7] [0 0] [0 0] [0 0] [0 0] [0] > [0 2] @futurequeue + [0 2] @ts + [2 0] @t1 + [2 0] @t2 + [0] [0 0] [0 0] [0 0] [0 0] [0] = [bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)] [#eq(leaf(), leaf())] = [4] [1] > [0] [1] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [4] [1] > [2] [1] = [#false()] [#eq(leaf(), nil())] = [4] [1] > [2] [1] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [4] [1] > [2] [1] = [#false()] [#eq(#pos(@x), #pos(@y))] = [4] [1] >= [4] [1] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [4] [1] > [2] [1] = [#false()] [#eq(#pos(@x), #neg(@y))] = [4] [1] > [2] [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [4] [1] > [2] [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [4] [1] > [2] [1] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [4] [1] > [2] [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [4] [1] > [2] [1] = [#false()] [#eq(nil(), leaf())] = [4] [1] > [2] [1] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [4] [1] > [2] [1] = [#false()] [#eq(nil(), nil())] = [4] [1] > [0] [1] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [4] [1] > [2] [1] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [4] [1] > [2] [1] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [4] [1] > [2] [1] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [4] [1] > [2] [1] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [4] [1] > [2] [1] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [4] [1] > [2] [1] = [#false()] [#eq(#0(), #0())] = [4] [1] > [0] [1] = [#true()] [#eq(#0(), #neg(@y))] = [4] [1] > [2] [1] = [#false()] [#eq(#0(), #s(@y))] = [4] [1] > [2] [1] = [#false()] [#eq(#neg(@x), #pos(@y))] = [4] [1] > [2] [1] = [#false()] [#eq(#neg(@x), #0())] = [4] [1] > [2] [1] = [#false()] [#eq(#neg(@x), #neg(@y))] = [4] [1] >= [4] [1] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [4] [1] > [2] [1] = [#false()] [#eq(#s(@x), #s(@y))] = [4] [1] >= [4] [1] = [#eq(@x, @y)] [reverse(@xs)] = [5 1] @xs + [0] [0 1] [0] >= [2 1] @xs + [0] [0 1] [0] = [appendreverse(@xs, nil())] [appendreverse#1(nil(), @sofar)] = [2 0] @sofar + [0] [0 1] [0] >= [1 0] @sofar + [0] [0 1] [0] = [@sofar] [appendreverse#1(::(@a, @as), @sofar)] = [2 0] @sofar + [1 2] @a + [2 1] @as + [8] [0 1] [1 0] [0 1] [0] >= [2 0] @sofar + [0 2] @a + [2 1] @as + [8] [0 1] [1 0] [0 1] [0] = [appendreverse(@as, ::(@a, @sofar))] [appendreverse(@toreverse, @sofar)] = [2 1] @toreverse + [2 0] @sofar + [0] [0 1] [0 1] [0] >= [2 1] @toreverse + [2 0] @sofar + [0] [0 1] [0 1] [0] = [appendreverse#1(@toreverse, @sofar)] [dobfs(@t, @x)] = [0 0] @x + [2 0] @t + [0] [1 0] [0 0] [0] >= [2 0] @t + [0] [0 0] [0] = [bfs(::(@t, nil()), nil(), @x)] [bfs(@queue, @futurequeue, @x)] = [0 2] @queue + [0 2] @futurequeue + [0] [0 0] [0 0] [0] >= [0 2] @queue + [0 2] @futurequeue + [0] [0 0] [0 0] [0] = [bfs#1(@queue, @futurequeue, @x)] [#and(#true(), #true())] = [2] [1] > [0] [1] = [#true()] [#and(#true(), #false())] = [2] [1] >= [2] [1] = [#false()] [#and(#false(), #true())] = [2] [1] >= [2] [1] = [#false()] [#and(#false(), #false())] = [2] [1] >= [2] [1] = [#false()] [bfs#2(nil(), @x)] = [0] [0] >= [0] [0] = [leaf()] [bfs#2(::(@t, @ts), @x)] = [2 0] @t + [0 2] @ts + [0] [0 0] [0 0] [0] >= [2 0] @t + [0 2] @ts + [0] [0 0] [0 0] [0] = [bfs(reverse(::(@t, @ts)), nil(), @x)] [bfs#1(nil(), @futurequeue, @x)] = [0 2] @futurequeue + [0] [0 0] [0] >= [0 2] @futurequeue + [0] [0 0] [0] = [bfs#2(@futurequeue, @x)] [bfs#1(::(@t, @ts), @futurequeue, @x)] = [0 2] @futurequeue + [2 0] @t + [0 2] @ts + [0] [0 0] [0 0] [0 0] [0] >= [0 2] @futurequeue + [2 0] @t + [0 2] @ts + [0] [0 0] [0 0] [0 0] [0] = [bfs#3(@t, @futurequeue, @ts, @x)] [bfs#3(leaf(), @futurequeue, @ts, @x)] = [0 2] @futurequeue + [0 2] @ts + [0] [0 0] [0 0] [0] >= [0 2] @futurequeue + [0 2] @ts + [0] [0 0] [0 0] [0] = [bfs(@ts, @futurequeue, @x)] [bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [0 2] @futurequeue + [0 2] @ts + [2 2] @t1 + [2 2] @t2 + [12] [0 0] [0 0] [0 0] [0 0] [0] > [0 2] @futurequeue + [0 2] @ts + [2 2] @t1 + [2 1] @t2 + [7] [0 0] [0 0] [0 0] [0 0] [0] = [bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)] [bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1 2] @futurequeue + [0 2] @ts + [2 1] @t1 + [2 1] @t2 + [12] [0 0] [0 0] [0 0] [0 0] [0] > [1 2] @futurequeue + [0 2] @ts + [2 1] @t1 + [2 1] @t2 + [11] [0 0] [0 0] [0 0] [0 0] [0] = [c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x))] [bfs^#(@queue, @futurequeue, @x)] = [0 0] @x + [0 2] @queue + [1 2] @futurequeue + [3] [1 0] [1 0] [1 1] [0] >= [0 2] @queue + [1 2] @futurequeue + [3] [0 0] [0 0] [0] = [c_2(bfs#1^#(@queue, @futurequeue, @x))] [dobfs^#(@t, @x)] = [2 5] @t + [3] [0 1] [0] >= [2 0] @t + [3] [0 0] [0] = [c_9(bfs^#(::(@t, nil()), nil(), @x))] [bfs2#1^#(@t', @x)] = [0 0] @x + [2 7] @t' + [4] [4 4] [0 0] [1] > [2 7] @t' + [3] [0 0] [0] = [c_12(dobfs^#(@t', @x))] [bfs2^#(@t, @x)] = [7 7] @x + [7 7] @t + [7] [7 7] [7 7] [7] >= [7 0] @x + [6 6] @t + [7] [0 0] [0 0] [4] = [c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x))] [bfs#1^#(nil(), @futurequeue, @x)] = [1 2] @futurequeue + [3] [0 0] [0] > [1 2] @futurequeue + [2] [0 0] [0] = [c_14(bfs#2^#(@futurequeue, @x))] [bfs#1^#(::(@t, @ts), @futurequeue, @x)] = [1 2] @futurequeue + [2 0] @t + [0 2] @ts + [3] [0 0] [0 0] [0 0] [0] >= [1 2] @futurequeue + [2 0] @t + [0 2] @ts + [3] [0 0] [0 0] [0 0] [0] = [c_15(bfs#3^#(@t, @futurequeue, @ts, @x))] [bfs#2^#(::(@t, @ts), @x)] = [2 1] @t + [1 2] @ts + [5] [0 0] [0 0] [0] > [2 0] @t + [0 2] @ts + [3] [0 0] [0 0] [0] = [c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts)))] [bfs#3^#(leaf(), @futurequeue, @ts, @x)] = [1 2] @futurequeue + [0 2] @ts + [3] [0 0] [0 0] [0] >= [1 2] @futurequeue + [0 2] @ts + [3] [0 0] [0 0] [0] = [c_17(bfs^#(@ts, @futurequeue, @x))] [bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1 2] @futurequeue + [0 2] @ts + [2 2] @t1 + [2 2] @t2 + [15] [0 0] [0 0] [0 0] [0 0] [0] > [1 2] @futurequeue + [0 2] @ts + [2 1] @t1 + [2 1] @t2 + [14] [0 0] [0 0] [0 0] [0 0] [0] = [c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y))] We return to the main proof. Consider the set of all dependency pairs : { 1: bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , 2: bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , 3: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , 4: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 5: dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , 6: bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , 7: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , 8: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , 9: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , 10: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Processor 'matrix interpretation of dimension 2' induces the complexity certificate YES(?,O(n^1)) on application of dependency pairs {2,3,4,6,10}. These cover all (indirect) predecessors of dependency pairs {2,3,4,5,6,7,10}, their number of application is equally bounded. The dependency pairs are shifted into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) } Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 2' to orient following rules strictly. DPs: { 2: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 5: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , 7: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , 8: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , 9: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , 10: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(nil(), nil()) -> #true() , #eq(#0(), #0()) -> #true() , #and(#true(), #true()) -> #true() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_1) = {1}, Uargs(c_2) = {1}, Uargs(c_9) = {1}, Uargs(c_12) = {1}, Uargs(c_13) = {1, 2}, Uargs(c_14) = {1}, Uargs(c_15) = {1}, Uargs(c_16) = {1}, Uargs(c_17) = {1}, Uargs(c_18) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA) and not(IDA(1)). [#equal](x1, x2) = [6] [4] [bfs#4](x1, x2, x3, x4, x5, x6, x7) = [0 0] x1 + [1 1] x2 + [1 1] x3 + [1 1] x4 + [0 1] x5 + [6] [1 0] [0 1] [1 1] [1 1] [0 1] [1] [#eq](x1, x2) = [4] [4] [reverse](x1) = [1 0] x1 + [0] [0 1] [0] [appendreverse#1](x1, x2) = [1 0] x1 + [1 0] x2 + [0] [0 1] [0 1] [0] [appendreverse](x1, x2) = [1 0] x1 + [1 0] x2 + [0] [0 1] [0 1] [0] [#true] = [0] [0] [leaf] = [0] [0] [dobfs](x1, x2) = [1 1] x1 + [0] [1 1] [0] [#pos](x1) = [1 0] x1 + [0] [0 1] [0] [node](x1, x2, x3) = [1 1] x2 + [1 1] x3 + [6] [0 0] [0 0] [1] [bfs](x1, x2, x3) = [0 1] x1 + [1 1] x2 + [0] [0 1] [0 1] [0] [#and](x1, x2) = [4] [3] [nil] = [0] [0] [bfs#2](x1, x2) = [1 1] x1 + [0] [0 1] [0] [#false] = [4] [3] [::](x1, x2) = [0 0] x1 + [1 0] x2 + [1] [1 1] [0 1] [0] [bfs#1](x1, x2, x3) = [0 1] x1 + [1 1] x2 + [0] [0 1] [0 1] [0] [bfs#3](x1, x2, x3, x4) = [1 0] x1 + [1 1] x2 + [0 1] x3 + [0] [1 1] [0 1] [0 1] [0] [#0] = [0] [0] [#neg](x1) = [1 0] x1 + [0] [0 1] [0] [#s](x1) = [1 0] x1 + [0] [0 1] [0] [bfs#4^#](x1, x2, x3, x4, x5, x6, x7) = [1 1] x1 + [4 2] x2 + [2 2] x3 + [2 2] x4 + [3 2] x5 + [2] [0 0] [0 0] [4 4] [4 5] [0 4] [0] [bfs^#](x1, x2, x3) = [3 2] x1 + [4 2] x2 + [0] [0 0] [0 0] [0] [reverse^#](x1) = [1 0] x1 + [2] [1 0] [0] [dobfs^#](x1, x2) = [2 2] x1 + [2 0] x2 + [3] [1 0] [4 4] [0] [bfs2#1^#](x1, x2) = [2 3] x1 + [2 0] x2 + [3] [1 0] [4 0] [0] [bfs2^#](x1, x2) = [7 7] x1 + [7 7] x2 + [7] [7 7] [7 7] [7] [bfs#1^#](x1, x2, x3) = [3 2] x1 + [4 2] x2 + [0] [0 0] [0 0] [1] [bfs#2^#](x1, x2) = [4 2] x1 + [0] [0 0] [1] [bfs#3^#](x1, x2, x3, x4) = [2 1] x1 + [4 2] x2 + [3 2] x3 + [0 0] x4 + [1] [1 2] [0 0] [0 0] [1 0] [0] [c_1](x1) = [1 0] x1 + [0] [0 0] [0] [c_2](x1) = [1 0] x1 + [0] [0 0] [0] [c_9](x1) = [1 0] x1 + [0] [0 0] [0] [c_12](x1) = [1 0] x1 + [0] [0 0] [0] [c_13](x1, x2) = [1 0] x1 + [1 0] x2 + [0] [0 0] [0 0] [4] [c_14](x1) = [1 0] x1 + [0] [0 0] [0] [c_15](x1) = [1 0] x1 + [1] [0 0] [0] [c_16](x1, x2) = [1 1] x1 + [0] [0 0] [0] [c_17](x1) = [1 0] x1 + [0] [0 0] [0] [c_18](x1) = [1 0] x1 + [0] [0 0] [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [6] [4] > [4] [4] = [#eq(@x, @y)] [bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1 1] @futurequeue + [0 1] @ts + [1 1] @t1 + [1 1] @t2 + [6] [0 1] [0 1] [1 1] [1 1] [1] >= [1 1] @t1 + [1 1] @t2 + [6] [0 0] [0 0] [1] = [node(@y, @t1, @t2)] [bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1 1] @futurequeue + [0 1] @ts + [1 1] @t1 + [1 1] @t2 + [6] [0 1] [0 1] [1 1] [1 1] [5] > [1 1] @futurequeue + [0 1] @ts + [1 1] @t1 + [1 1] @t2 + [2] [0 1] [0 1] [1 1] [1 1] [0] = [bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)] [#eq(leaf(), leaf())] = [4] [4] > [0] [0] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [4] [4] >= [4] [3] = [#false()] [#eq(leaf(), nil())] = [4] [4] >= [4] [3] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [4] [4] >= [4] [3] = [#false()] [#eq(#pos(@x), #pos(@y))] = [4] [4] >= [4] [4] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [4] [4] >= [4] [3] = [#false()] [#eq(#pos(@x), #neg(@y))] = [4] [4] >= [4] [3] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [4] [4] >= [4] [3] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [4] [4] >= [4] [3] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [4] [4] >= [4] [3] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [4] [4] >= [4] [3] = [#false()] [#eq(nil(), leaf())] = [4] [4] >= [4] [3] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [4] [4] >= [4] [3] = [#false()] [#eq(nil(), nil())] = [4] [4] > [0] [0] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [4] [4] >= [4] [3] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [4] [4] >= [4] [3] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [4] [4] >= [4] [3] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [4] [4] >= [4] [3] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [4] [4] >= [4] [3] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [4] [4] >= [4] [3] = [#false()] [#eq(#0(), #0())] = [4] [4] > [0] [0] = [#true()] [#eq(#0(), #neg(@y))] = [4] [4] >= [4] [3] = [#false()] [#eq(#0(), #s(@y))] = [4] [4] >= [4] [3] = [#false()] [#eq(#neg(@x), #pos(@y))] = [4] [4] >= [4] [3] = [#false()] [#eq(#neg(@x), #0())] = [4] [4] >= [4] [3] = [#false()] [#eq(#neg(@x), #neg(@y))] = [4] [4] >= [4] [4] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [4] [4] >= [4] [3] = [#false()] [#eq(#s(@x), #s(@y))] = [4] [4] >= [4] [4] = [#eq(@x, @y)] [reverse(@xs)] = [1 0] @xs + [0] [0 1] [0] >= [1 0] @xs + [0] [0 1] [0] = [appendreverse(@xs, nil())] [appendreverse#1(nil(), @sofar)] = [1 0] @sofar + [0] [0 1] [0] >= [1 0] @sofar + [0] [0 1] [0] = [@sofar] [appendreverse#1(::(@a, @as), @sofar)] = [1 0] @sofar + [0 0] @a + [1 0] @as + [1] [0 1] [1 1] [0 1] [0] >= [1 0] @sofar + [0 0] @a + [1 0] @as + [1] [0 1] [1 1] [0 1] [0] = [appendreverse(@as, ::(@a, @sofar))] [appendreverse(@toreverse, @sofar)] = [1 0] @toreverse + [1 0] @sofar + [0] [0 1] [0 1] [0] >= [1 0] @toreverse + [1 0] @sofar + [0] [0 1] [0 1] [0] = [appendreverse#1(@toreverse, @sofar)] [dobfs(@t, @x)] = [1 1] @t + [0] [1 1] [0] >= [1 1] @t + [0] [1 1] [0] = [bfs(::(@t, nil()), nil(), @x)] [bfs(@queue, @futurequeue, @x)] = [0 1] @queue + [1 1] @futurequeue + [0] [0 1] [0 1] [0] >= [0 1] @queue + [1 1] @futurequeue + [0] [0 1] [0 1] [0] = [bfs#1(@queue, @futurequeue, @x)] [#and(#true(), #true())] = [4] [3] > [0] [0] = [#true()] [#and(#true(), #false())] = [4] [3] >= [4] [3] = [#false()] [#and(#false(), #true())] = [4] [3] >= [4] [3] = [#false()] [#and(#false(), #false())] = [4] [3] >= [4] [3] = [#false()] [bfs#2(nil(), @x)] = [0] [0] >= [0] [0] = [leaf()] [bfs#2(::(@t, @ts), @x)] = [1 1] @t + [1 1] @ts + [1] [1 1] [0 1] [0] > [1 1] @t + [0 1] @ts + [0] [1 1] [0 1] [0] = [bfs(reverse(::(@t, @ts)), nil(), @x)] [bfs#1(nil(), @futurequeue, @x)] = [1 1] @futurequeue + [0] [0 1] [0] >= [1 1] @futurequeue + [0] [0 1] [0] = [bfs#2(@futurequeue, @x)] [bfs#1(::(@t, @ts), @futurequeue, @x)] = [1 1] @futurequeue + [1 1] @t + [0 1] @ts + [0] [0 1] [1 1] [0 1] [0] >= [1 1] @futurequeue + [1 0] @t + [0 1] @ts + [0] [0 1] [1 1] [0 1] [0] = [bfs#3(@t, @futurequeue, @ts, @x)] [bfs#3(leaf(), @futurequeue, @ts, @x)] = [1 1] @futurequeue + [0 1] @ts + [0] [0 1] [0 1] [0] >= [1 1] @futurequeue + [0 1] @ts + [0] [0 1] [0 1] [0] = [bfs(@ts, @futurequeue, @x)] [bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1 1] @futurequeue + [0 1] @ts + [1 1] @t1 + [1 1] @t2 + [6] [0 1] [0 1] [1 1] [1 1] [7] >= [1 1] @futurequeue + [0 1] @ts + [1 1] @t1 + [1 1] @t2 + [6] [0 1] [0 1] [1 1] [1 1] [7] = [bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)] [bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [4 2] @futurequeue + [3 2] @ts + [2 2] @t1 + [2 2] @t2 + [9] [0 0] [0 4] [4 4] [4 5] [0] > [4 2] @futurequeue + [3 2] @ts + [2 2] @t1 + [2 2] @t2 + [8] [0 0] [0 0] [0 0] [0 0] [0] = [c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x))] [bfs^#(@queue, @futurequeue, @x)] = [3 2] @queue + [4 2] @futurequeue + [0] [0 0] [0 0] [0] >= [3 2] @queue + [4 2] @futurequeue + [0] [0 0] [0 0] [0] = [c_2(bfs#1^#(@queue, @futurequeue, @x))] [dobfs^#(@t, @x)] = [2 0] @x + [2 2] @t + [3] [4 4] [1 0] [0] >= [2 2] @t + [3] [0 0] [0] = [c_9(bfs^#(::(@t, nil()), nil(), @x))] [bfs2#1^#(@t', @x)] = [2 0] @x + [2 3] @t' + [3] [4 0] [1 0] [0] >= [2 0] @x + [2 2] @t' + [3] [0 0] [0 0] [0] = [c_12(dobfs^#(@t', @x))] [bfs2^#(@t, @x)] = [7 7] @x + [7 7] @t + [7] [7 7] [7 7] [7] > [4 0] @x + [7 7] @t + [6] [0 0] [0 0] [4] = [c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x))] [bfs#1^#(nil(), @futurequeue, @x)] = [4 2] @futurequeue + [0] [0 0] [1] >= [4 2] @futurequeue + [0] [0 0] [0] = [c_14(bfs#2^#(@futurequeue, @x))] [bfs#1^#(::(@t, @ts), @futurequeue, @x)] = [4 2] @futurequeue + [2 2] @t + [3 2] @ts + [3] [0 0] [0 0] [0 0] [1] > [4 2] @futurequeue + [2 1] @t + [3 2] @ts + [2] [0 0] [0 0] [0 0] [0] = [c_15(bfs#3^#(@t, @futurequeue, @ts, @x))] [bfs#2^#(::(@t, @ts), @x)] = [2 2] @t + [4 2] @ts + [4] [0 0] [0 0] [1] > [2 2] @t + [3 2] @ts + [3] [0 0] [0 0] [0] = [c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts)))] [bfs#3^#(leaf(), @futurequeue, @ts, @x)] = [0 0] @x + [4 2] @futurequeue + [3 2] @ts + [1] [1 0] [0 0] [0 0] [0] > [4 2] @futurequeue + [3 2] @ts + [0] [0 0] [0 0] [0] = [c_17(bfs^#(@ts, @futurequeue, @x))] [bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [0 0] @x + [4 2] @futurequeue + [3 2] @ts + [2 2] @t1 + [2 2] @t2 + [14] [1 0] [0 0] [0 0] [1 1] [1 1] [8] > [4 2] @futurequeue + [3 2] @ts + [2 2] @t1 + [2 2] @t2 + [12] [0 0] [0 0] [0 0] [0 0] [0] = [c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y))] We return to the main proof. Consider the set of all dependency pairs : { 1: bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , 2: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , 3: dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , 4: bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , 5: bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , 6: bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , 7: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , 8: bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , 9: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , 10: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Processor 'matrix interpretation of dimension 2' induces the complexity certificate YES(?,O(n^1)) on application of dependency pairs {2,5,7,8,9,10}. These cover all (indirect) predecessors of dependency pairs {1,2,3,4,5,6,7,8,9,10}, their number of application is equally bounded. The dependency pairs are shifted into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) No rule is usable, rules are removed from the input problem. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Rules: Empty Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) Empty rules are trivially bounded We return to the main proof. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) } Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , bfs^#(@queue, @futurequeue, @x) -> bfs#1^#(@queue, @futurequeue, @x) , dobfs^#(@t, @x) -> bfs^#(::(@t, nil()), nil(), @x) , bfs2#1^#(@t', @x) -> dobfs^#(@t', @x) , bfs2^#(@t, @x) -> dobfs^#(@t, @x) , bfs2^#(@t, @x) -> bfs2#1^#(dobfs(@t, @x), @x) , bfs#1^#(nil(), @futurequeue, @x) -> bfs#2^#(@futurequeue, @x) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> bfs#3^#(@t, @futurequeue, @ts, @x) , bfs#2^#(::(@t, @ts), @x) -> bfs^#(reverse(::(@t, @ts)), nil(), @x) , bfs#2^#(::(@t, @ts), @x) -> reverse^#(::(@t, @ts)) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> bfs^#(@ts, @futurequeue, @x) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 1' to orient following rules strictly. DPs: { 2: appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , 4: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , 6: dobfs^#(@t, @x) -> bfs^#(::(@t, nil()), nil(), @x) , 8: bfs2^#(@t, @x) -> dobfs^#(@t, @x) , 13: bfs#2^#(::(@t, @ts), @x) -> reverse^#(::(@t, @ts)) , 14: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> bfs^#(@ts, @futurequeue, @x) } Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_3) = {1}, Uargs(c_4) = {1}, Uargs(c_5) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA). [#equal](x1, x2) = [4] [bfs#4](x1, x2, x3, x4, x5, x6, x7) = [1] x1 + [1] x2 + [1] x3 + [1] x4 + [1] x5 + [4] [#eq](x1, x2) = [3] [reverse](x1) = [1] x1 + [0] [appendreverse#1](x1, x2) = [1] x1 + [1] x2 + [0] [appendreverse](x1, x2) = [1] x1 + [1] x2 + [0] [#true] = [3] [leaf] = [0] [dobfs](x1, x2) = [1] x1 + [1] [#pos](x1) = [1] x1 + [0] [node](x1, x2, x3) = [1] x2 + [1] x3 + [7] [bfs](x1, x2, x3) = [1] x1 + [1] x2 + [0] [#and](x1, x2) = [1] x2 + [0] [nil] = [0] [bfs#2](x1, x2) = [1] x1 + [0] [#false] = [3] [::](x1, x2) = [1] x1 + [1] x2 + [1] [bfs#1](x1, x2, x3) = [1] x1 + [1] x2 + [0] [bfs#3](x1, x2, x3, x4) = [1] x1 + [1] x2 + [1] x3 + [1] [#0] = [2] [#neg](x1) = [1] x1 + [0] [#s](x1) = [1] x1 + [2] [bfs#4^#](x1, x2, x3, x4, x5, x6, x7) = [2] x1 + [1] x2 + [1] x3 + [1] x4 + [1] x5 + [2] [bfs^#](x1, x2, x3) = [1] x1 + [1] x2 + [2] [reverse^#](x1) = [1] x1 + [1] [appendreverse^#](x1, x2) = [1] x1 + [1] [appendreverse#1^#](x1, x2) = [1] x1 + [0] [dobfs^#](x1, x2) = [1] x1 + [6] [bfs2#1^#](x1, x2) = [1] x1 + [7] x2 + [6] [bfs2^#](x1, x2) = [7] x1 + [7] x2 + [7] [bfs#1^#](x1, x2, x3) = [1] x1 + [1] x2 + [2] [bfs#2^#](x1, x2) = [1] x1 + [2] [bfs#3^#](x1, x2, x3, x4) = [1] x1 + [1] x2 + [1] x3 + [3] [c_3](x1) = [1] x1 + [0] [c_4](x1) = [1] x1 + [0] [c_5](x1) = [1] x1 + [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [4] > [3] = [#eq(@x, @y)] [bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [7] >= [1] @t1 + [1] @t2 + [7] = [node(@y, @t1, @t2)] [bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [7] > [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [2] = [bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)] [#eq(leaf(), leaf())] = [3] >= [3] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [3] >= [3] = [#false()] [#eq(leaf(), nil())] = [3] >= [3] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [3] >= [3] = [#false()] [#eq(#pos(@x), #pos(@y))] = [3] >= [3] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [3] >= [3] = [#false()] [#eq(#pos(@x), #neg(@y))] = [3] >= [3] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [3] >= [3] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [3] >= [3] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [3] >= [3] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [3] >= [3] = [#false()] [#eq(nil(), leaf())] = [3] >= [3] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [3] >= [3] = [#false()] [#eq(nil(), nil())] = [3] >= [3] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [3] >= [3] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [3] >= [3] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [3] >= [3] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [3] >= [3] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [3] >= [3] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [3] >= [3] = [#false()] [#eq(#0(), #0())] = [3] >= [3] = [#true()] [#eq(#0(), #neg(@y))] = [3] >= [3] = [#false()] [#eq(#0(), #s(@y))] = [3] >= [3] = [#false()] [#eq(#neg(@x), #pos(@y))] = [3] >= [3] = [#false()] [#eq(#neg(@x), #0())] = [3] >= [3] = [#false()] [#eq(#neg(@x), #neg(@y))] = [3] >= [3] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [3] >= [3] = [#false()] [#eq(#s(@x), #s(@y))] = [3] >= [3] = [#eq(@x, @y)] [reverse(@xs)] = [1] @xs + [0] >= [1] @xs + [0] = [appendreverse(@xs, nil())] [appendreverse#1(nil(), @sofar)] = [1] @sofar + [0] >= [1] @sofar + [0] = [@sofar] [appendreverse#1(::(@a, @as), @sofar)] = [1] @sofar + [1] @a + [1] @as + [1] >= [1] @sofar + [1] @a + [1] @as + [1] = [appendreverse(@as, ::(@a, @sofar))] [appendreverse(@toreverse, @sofar)] = [1] @toreverse + [1] @sofar + [0] >= [1] @toreverse + [1] @sofar + [0] = [appendreverse#1(@toreverse, @sofar)] [dobfs(@t, @x)] = [1] @t + [1] >= [1] @t + [1] = [bfs(::(@t, nil()), nil(), @x)] [bfs(@queue, @futurequeue, @x)] = [1] @queue + [1] @futurequeue + [0] >= [1] @queue + [1] @futurequeue + [0] = [bfs#1(@queue, @futurequeue, @x)] [#and(#true(), #true())] = [3] >= [3] = [#true()] [#and(#true(), #false())] = [3] >= [3] = [#false()] [#and(#false(), #true())] = [3] >= [3] = [#false()] [#and(#false(), #false())] = [3] >= [3] = [#false()] [bfs#2(nil(), @x)] = [0] >= [0] = [leaf()] [bfs#2(::(@t, @ts), @x)] = [1] @t + [1] @ts + [1] >= [1] @t + [1] @ts + [1] = [bfs(reverse(::(@t, @ts)), nil(), @x)] [bfs#1(nil(), @futurequeue, @x)] = [1] @futurequeue + [0] >= [1] @futurequeue + [0] = [bfs#2(@futurequeue, @x)] [bfs#1(::(@t, @ts), @futurequeue, @x)] = [1] @futurequeue + [1] @t + [1] @ts + [1] >= [1] @futurequeue + [1] @t + [1] @ts + [1] = [bfs#3(@t, @futurequeue, @ts, @x)] [bfs#3(leaf(), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] > [1] @futurequeue + [1] @ts + [0] = [bfs(@ts, @futurequeue, @x)] [bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [8] >= [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [8] = [bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)] [bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [8] > [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [4] = [bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)] [bfs^#(@queue, @futurequeue, @x)] = [1] @queue + [1] @futurequeue + [2] >= [1] @queue + [1] @futurequeue + [2] = [bfs#1^#(@queue, @futurequeue, @x)] [reverse^#(@xs)] = [1] @xs + [1] >= [1] @xs + [1] = [c_3(appendreverse^#(@xs, nil()))] [appendreverse^#(@toreverse, @sofar)] = [1] @toreverse + [1] > [1] @toreverse + [0] = [c_4(appendreverse#1^#(@toreverse, @sofar))] [appendreverse#1^#(::(@a, @as), @sofar)] = [1] @a + [1] @as + [1] >= [1] @as + [1] = [c_5(appendreverse^#(@as, ::(@a, @sofar)))] [dobfs^#(@t, @x)] = [1] @t + [6] > [1] @t + [3] = [bfs^#(::(@t, nil()), nil(), @x)] [bfs2#1^#(@t', @x)] = [7] @x + [1] @t' + [6] >= [1] @t' + [6] = [dobfs^#(@t', @x)] [bfs2^#(@t, @x)] = [7] @x + [7] @t + [7] > [1] @t + [6] = [dobfs^#(@t, @x)] [bfs2^#(@t, @x)] = [7] @x + [7] @t + [7] >= [7] @x + [1] @t + [7] = [bfs2#1^#(dobfs(@t, @x), @x)] [bfs#1^#(nil(), @futurequeue, @x)] = [1] @futurequeue + [2] >= [1] @futurequeue + [2] = [bfs#2^#(@futurequeue, @x)] [bfs#1^#(::(@t, @ts), @futurequeue, @x)] = [1] @futurequeue + [1] @t + [1] @ts + [3] >= [1] @futurequeue + [1] @t + [1] @ts + [3] = [bfs#3^#(@t, @futurequeue, @ts, @x)] [bfs#2^#(::(@t, @ts), @x)] = [1] @t + [1] @ts + [3] >= [1] @t + [1] @ts + [3] = [bfs^#(reverse(::(@t, @ts)), nil(), @x)] [bfs#2^#(::(@t, @ts), @x)] = [1] @t + [1] @ts + [3] > [1] @t + [1] @ts + [2] = [reverse^#(::(@t, @ts))] [bfs#3^#(leaf(), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [3] > [1] @futurequeue + [1] @ts + [2] = [bfs^#(@ts, @futurequeue, @x)] [bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x)] = [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [10] >= [1] @futurequeue + [1] @ts + [1] @t1 + [1] @t2 + [10] = [bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)] We return to the main proof. Consider the set of all dependency pairs : { 1: reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , 2: appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , 3: appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , 4: bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , 5: bfs^#(@queue, @futurequeue, @x) -> bfs#1^#(@queue, @futurequeue, @x) , 6: dobfs^#(@t, @x) -> bfs^#(::(@t, nil()), nil(), @x) , 7: bfs2#1^#(@t', @x) -> dobfs^#(@t', @x) , 8: bfs2^#(@t, @x) -> dobfs^#(@t, @x) , 9: bfs2^#(@t, @x) -> bfs2#1^#(dobfs(@t, @x), @x) , 10: bfs#1^#(nil(), @futurequeue, @x) -> bfs#2^#(@futurequeue, @x) , 11: bfs#1^#(::(@t, @ts), @futurequeue, @x) -> bfs#3^#(@t, @futurequeue, @ts, @x) , 12: bfs#2^#(::(@t, @ts), @x) -> bfs^#(reverse(::(@t, @ts)), nil(), @x) , 13: bfs#2^#(::(@t, @ts), @x) -> reverse^#(::(@t, @ts)) , 14: bfs#3^#(leaf(), @futurequeue, @ts, @x) -> bfs^#(@ts, @futurequeue, @x) , 15: bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Processor 'matrix interpretation of dimension 1' induces the complexity certificate YES(?,O(n^1)) on application of dependency pairs {2,4,6,8,13,14}. These cover all (indirect) predecessors of dependency pairs {1,2,3,4,6,7,8,9,13,14}, their number of application is equally bounded. The dependency pairs are shifted into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , bfs^#(@queue, @futurequeue, @x) -> bfs#1^#(@queue, @futurequeue, @x) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> bfs^#(::(@t, nil()), nil(), @x) , bfs2#1^#(@t', @x) -> dobfs^#(@t', @x) , bfs2^#(@t, @x) -> dobfs^#(@t, @x) , bfs2^#(@t, @x) -> bfs2#1^#(dobfs(@t, @x), @x) , bfs#1^#(nil(), @futurequeue, @x) -> bfs#2^#(@futurequeue, @x) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> bfs#3^#(@t, @futurequeue, @ts, @x) , bfs#2^#(::(@t, @ts), @x) -> bfs^#(reverse(::(@t, @ts)), nil(), @x) , bfs#2^#(::(@t, @ts), @x) -> reverse^#(::(@t, @ts)) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> bfs^#(@ts, @futurequeue, @x) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , bfs^#(@queue, @futurequeue, @x) -> bfs#1^#(@queue, @futurequeue, @x) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> bfs^#(::(@t, nil()), nil(), @x) , bfs2#1^#(@t', @x) -> dobfs^#(@t', @x) , bfs2^#(@t, @x) -> dobfs^#(@t, @x) , bfs2^#(@t, @x) -> bfs2#1^#(dobfs(@t, @x), @x) , bfs#1^#(nil(), @futurequeue, @x) -> bfs#2^#(@futurequeue, @x) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> bfs#3^#(@t, @futurequeue, @ts, @x) , bfs#2^#(::(@t, @ts), @x) -> bfs^#(reverse(::(@t, @ts)), nil(), @x) , bfs#2^#(::(@t, @ts), @x) -> reverse^#(::(@t, @ts)) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> bfs^#(@ts, @futurequeue, @x) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) No rule is usable, rules are removed from the input problem. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Rules: Empty Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) Empty rules are trivially bounded S) We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak DPs: { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. { bfs#4^#(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> c_1(bfs^#(@ts, ::(@t2, ::(@t1, @futurequeue)), @x)) , bfs^#(@queue, @futurequeue, @x) -> c_2(bfs#1^#(@queue, @futurequeue, @x)) , reverse^#(@xs) -> c_3(appendreverse^#(@xs, nil())) , appendreverse^#(@toreverse, @sofar) -> c_4(appendreverse#1^#(@toreverse, @sofar)) , appendreverse#1^#(::(@a, @as), @sofar) -> c_5(appendreverse^#(@as, ::(@a, @sofar))) , dobfs^#(@t, @x) -> c_9(bfs^#(::(@t, nil()), nil(), @x)) , bfs2#1^#(@t', @x) -> c_12(dobfs^#(@t', @x)) , bfs2^#(@t, @x) -> c_13(bfs2#1^#(dobfs(@t, @x), @x), dobfs^#(@t, @x)) , bfs#1^#(nil(), @futurequeue, @x) -> c_14(bfs#2^#(@futurequeue, @x)) , bfs#1^#(::(@t, @ts), @futurequeue, @x) -> c_15(bfs#3^#(@t, @futurequeue, @ts, @x)) , bfs#2^#(::(@t, @ts), @x) -> c_16(bfs^#(reverse(::(@t, @ts)), nil(), @x), reverse^#(::(@t, @ts))) , bfs#3^#(leaf(), @futurequeue, @ts, @x) -> c_17(bfs^#(@ts, @futurequeue, @x)) , bfs#3^#(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> c_18(bfs#4^#(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y)) } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , bfs#4(#true(), @futurequeue, @t1, @t2, @ts, @x, @y) -> node(@y, @t1, @t2) , bfs#4(#false(), @futurequeue, @t1, @t2, @ts, @x, @y) -> bfs(@ts, ::(@t2, ::(@t1, @futurequeue)), @x) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , reverse(@xs) -> appendreverse(@xs, nil()) , appendreverse#1(nil(), @sofar) -> @sofar , appendreverse#1(::(@a, @as), @sofar) -> appendreverse(@as, ::(@a, @sofar)) , appendreverse(@toreverse, @sofar) -> appendreverse#1(@toreverse, @sofar) , dobfs(@t, @x) -> bfs(::(@t, nil()), nil(), @x) , bfs(@queue, @futurequeue, @x) -> bfs#1(@queue, @futurequeue, @x) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() , bfs#2(nil(), @x) -> leaf() , bfs#2(::(@t, @ts), @x) -> bfs(reverse(::(@t, @ts)), nil(), @x) , bfs#1(nil(), @futurequeue, @x) -> bfs#2(@futurequeue, @x) , bfs#1(::(@t, @ts), @futurequeue, @x) -> bfs#3(@t, @futurequeue, @ts, @x) , bfs#3(leaf(), @futurequeue, @ts, @x) -> bfs(@ts, @futurequeue, @x) , bfs#3(node(@y, @t1, @t2), @futurequeue, @ts, @x) -> bfs#4(#equal(@x, @y), @futurequeue, @t1, @t2, @ts, @x, @y) } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We replace rewrite rules by usable rules: Weak Usable Rules: { #equal(@x, @y) -> #eq(@x, @y) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 1' to orient following rules strictly. DPs: { 2: dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_6) = {1}, Uargs(c_7) = {1}, Uargs(c_8) = {1}, Uargs(c_11) = {1}, Uargs(c_19) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA). [#equal](x1, x2) = [0] [#eq](x1, x2) = [0] [#true] = [0] [leaf] = [2] [#pos](x1) = [1] x1 + [0] [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [0] [#and](x1, x2) = [0] [nil] = [0] [#false] = [0] [::](x1, x2) = [1] x1 + [1] x2 + [0] [#0] = [1] [#neg](x1) = [1] x1 + [5] [#s](x1) = [1] x1 + [0] [dfs#1^#](x1, x2) = [4] x1 + [5] [dfs#2^#](x1, x2, x3, x4) = [4] x1 + [4] x3 + [5] [dfs^#](x1, x2) = [4] x1 + [5] [dfs#3^#](x1, x2, x3, x4, x5, x6) = [4] x3 + [4] x4 + [4] x5 + [5] [c_6](x1) = [1] x1 + [0] [c_7](x1) = [1] x1 + [0] [c_8](x1) = [1] x1 + [0] [c_11](x1) = [1] x1 + [0] [c_19](x1) = [1] x1 + [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [0] >= [0] = [#eq(@x, @y)] [#eq(leaf(), leaf())] = [0] >= [0] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [0] >= [0] = [#false()] [#eq(leaf(), nil())] = [0] >= [0] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [0] >= [0] = [#false()] [#eq(#pos(@x), #pos(@y))] = [0] >= [0] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [0] >= [0] = [#false()] [#eq(#pos(@x), #neg(@y))] = [0] >= [0] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [0] >= [0] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [0] >= [0] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [0] >= [0] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [0] >= [0] = [#false()] [#eq(nil(), leaf())] = [0] >= [0] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [0] >= [0] = [#false()] [#eq(nil(), nil())] = [0] >= [0] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [0] >= [0] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [0] >= [0] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [0] >= [0] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [0] >= [0] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [0] >= [0] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [0] >= [0] = [#false()] [#eq(#0(), #0())] = [0] >= [0] = [#true()] [#eq(#0(), #neg(@y))] = [0] >= [0] = [#false()] [#eq(#0(), #s(@y))] = [0] >= [0] = [#false()] [#eq(#neg(@x), #pos(@y))] = [0] >= [0] = [#false()] [#eq(#neg(@x), #0())] = [0] >= [0] = [#false()] [#eq(#neg(@x), #neg(@y))] = [0] >= [0] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [0] >= [0] = [#false()] [#eq(#s(@x), #s(@y))] = [0] >= [0] = [#eq(@x, @y)] [#and(#true(), #true())] = [0] >= [0] = [#true()] [#and(#true(), #false())] = [0] >= [0] = [#false()] [#and(#false(), #true())] = [0] >= [0] = [#false()] [#and(#false(), #false())] = [0] >= [0] = [#false()] [dfs#1^#(::(@t, @ts), @x)] = [4] @t + [4] @ts + [5] >= [4] @t + [4] @ts + [5] = [c_6(dfs#2^#(@t, @t, @ts, @x))] [dfs#2^#(leaf(), @t, @ts, @x)] = [4] @ts + [13] > [4] @ts + [5] = [c_7(dfs^#(@ts, @x))] [dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x)] = [4] @a + [4] @ts + [4] @t1 + [4] @t2 + [5] >= [4] @ts + [4] @t1 + [4] @t2 + [5] = [c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x))] [dfs^#(@queue, @x)] = [4] @queue + [5] >= [4] @queue + [5] = [c_11(dfs#1^#(@queue, @x))] [dfs#3^#(#false(), @t, @t1, @t2, @ts, @x)] = [4] @ts + [4] @t1 + [4] @t2 + [5] >= [4] @ts + [4] @t1 + [4] @t2 + [5] = [c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x))] The strictly oriented rules are moved into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak DPs: { dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 1' to orient following rules strictly. DPs: { 2: dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , 4: dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Trs: { #equal(@x, @y) -> #eq(@x, @y) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_6) = {1}, Uargs(c_7) = {1}, Uargs(c_8) = {1}, Uargs(c_11) = {1}, Uargs(c_19) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA). [#equal](x1, x2) = [2] [#eq](x1, x2) = [1] [#true] = [1] [leaf] = [0] [#pos](x1) = [1] x1 + [0] [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [4] [#and](x1, x2) = [1] x2 + [0] [nil] = [0] [#false] = [1] [::](x1, x2) = [1] x1 + [1] x2 + [0] [#0] = [0] [#neg](x1) = [1] x1 + [0] [#s](x1) = [1] x1 + [2] [dfs#1^#](x1, x2) = [1] x1 + [4] x2 + [3] [dfs#2^#](x1, x2, x3, x4) = [1] x1 + [1] x3 + [4] x4 + [3] [dfs^#](x1, x2) = [1] x1 + [4] x2 + [3] [dfs#3^#](x1, x2, x3, x4, x5, x6) = [1] x1 + [1] x3 + [1] x4 + [1] x5 + [4] x6 + [3] [c_6](x1) = [1] x1 + [0] [c_7](x1) = [1] x1 + [0] [c_8](x1) = [1] x1 + [1] [c_11](x1) = [1] x1 + [0] [c_19](x1) = [1] x1 + [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [2] > [1] = [#eq(@x, @y)] [#eq(leaf(), leaf())] = [1] >= [1] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [1] >= [1] = [#false()] [#eq(leaf(), nil())] = [1] >= [1] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [1] >= [1] = [#false()] [#eq(#pos(@x), #pos(@y))] = [1] >= [1] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [1] >= [1] = [#false()] [#eq(#pos(@x), #neg(@y))] = [1] >= [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [1] >= [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [1] >= [1] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [1] >= [1] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [1] >= [1] = [#false()] [#eq(nil(), leaf())] = [1] >= [1] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [1] >= [1] = [#false()] [#eq(nil(), nil())] = [1] >= [1] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [1] >= [1] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [1] >= [1] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [1] >= [1] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [1] >= [1] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [1] >= [1] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [1] >= [1] = [#false()] [#eq(#0(), #0())] = [1] >= [1] = [#true()] [#eq(#0(), #neg(@y))] = [1] >= [1] = [#false()] [#eq(#0(), #s(@y))] = [1] >= [1] = [#false()] [#eq(#neg(@x), #pos(@y))] = [1] >= [1] = [#false()] [#eq(#neg(@x), #0())] = [1] >= [1] = [#false()] [#eq(#neg(@x), #neg(@y))] = [1] >= [1] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [1] >= [1] = [#false()] [#eq(#s(@x), #s(@y))] = [1] >= [1] = [#eq(@x, @y)] [#and(#true(), #true())] = [1] >= [1] = [#true()] [#and(#true(), #false())] = [1] >= [1] = [#false()] [#and(#false(), #true())] = [1] >= [1] = [#false()] [#and(#false(), #false())] = [1] >= [1] = [#false()] [dfs#1^#(::(@t, @ts), @x)] = [4] @x + [1] @t + [1] @ts + [3] >= [4] @x + [1] @t + [1] @ts + [3] = [c_6(dfs#2^#(@t, @t, @ts, @x))] [dfs#2^#(leaf(), @t, @ts, @x)] = [4] @x + [1] @ts + [3] >= [4] @x + [1] @ts + [3] = [c_7(dfs^#(@ts, @x))] [dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x)] = [4] @x + [1] @a + [1] @ts + [1] @t1 + [1] @t2 + [7] > [4] @x + [1] @ts + [1] @t1 + [1] @t2 + [6] = [c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x))] [dfs^#(@queue, @x)] = [4] @x + [1] @queue + [3] >= [4] @x + [1] @queue + [3] = [c_11(dfs#1^#(@queue, @x))] [dfs#3^#(#false(), @t, @t1, @t2, @ts, @x)] = [4] @x + [1] @ts + [1] @t1 + [1] @t2 + [4] > [4] @x + [1] @ts + [1] @t1 + [1] @t2 + [3] = [c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x))] The strictly oriented rules are moved into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(n^1)). Strict DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) } Weak DPs: { dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() } Obligation: innermost runtime complexity Answer: YES(O(1),O(n^1)) We use the processor 'matrix interpretation of dimension 1' to orient following rules strictly. DPs: { 2: dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , 3: dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) } Sub-proof: ---------- The following argument positions are usable: Uargs(c_6) = {1}, Uargs(c_7) = {1}, Uargs(c_8) = {1}, Uargs(c_11) = {1}, Uargs(c_19) = {1} TcT has computed the following constructor-based matrix interpretation satisfying not(EDA). [#equal](x1, x2) = [0] [#eq](x1, x2) = [0] [#true] = [0] [leaf] = [5] [#pos](x1) = [1] x1 + [0] [node](x1, x2, x3) = [1] x1 + [1] x2 + [1] x3 + [4] [#and](x1, x2) = [0] [nil] = [0] [#false] = [0] [::](x1, x2) = [1] x1 + [1] x2 + [0] [#0] = [0] [#neg](x1) = [1] x1 + [0] [#s](x1) = [1] x1 + [0] [dfs#1^#](x1, x2) = [1] x1 + [0] [dfs#2^#](x1, x2, x3, x4) = [1] x1 + [1] x3 + [0] [dfs^#](x1, x2) = [1] x1 + [4] [dfs#3^#](x1, x2, x3, x4, x5, x6) = [1] x3 + [1] x4 + [1] x5 + [4] [c_6](x1) = [1] x1 + [0] [c_7](x1) = [1] x1 + [0] [c_8](x1) = [1] x1 + [0] [c_11](x1) = [1] x1 + [1] [c_19](x1) = [1] x1 + [0] The order satisfies the following ordering constraints: [#equal(@x, @y)] = [0] >= [0] = [#eq(@x, @y)] [#eq(leaf(), leaf())] = [0] >= [0] = [#true()] [#eq(leaf(), node(@y_1, @y_2, @y_3))] = [0] >= [0] = [#false()] [#eq(leaf(), nil())] = [0] >= [0] = [#false()] [#eq(leaf(), ::(@y_1, @y_2))] = [0] >= [0] = [#false()] [#eq(#pos(@x), #pos(@y))] = [0] >= [0] = [#eq(@x, @y)] [#eq(#pos(@x), #0())] = [0] >= [0] = [#false()] [#eq(#pos(@x), #neg(@y))] = [0] >= [0] = [#false()] [#eq(node(@x_1, @x_2, @x_3), leaf())] = [0] >= [0] = [#false()] [#eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3))] = [0] >= [0] = [#and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3)))] [#eq(node(@x_1, @x_2, @x_3), nil())] = [0] >= [0] = [#false()] [#eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2))] = [0] >= [0] = [#false()] [#eq(nil(), leaf())] = [0] >= [0] = [#false()] [#eq(nil(), node(@y_1, @y_2, @y_3))] = [0] >= [0] = [#false()] [#eq(nil(), nil())] = [0] >= [0] = [#true()] [#eq(nil(), ::(@y_1, @y_2))] = [0] >= [0] = [#false()] [#eq(::(@x_1, @x_2), leaf())] = [0] >= [0] = [#false()] [#eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3))] = [0] >= [0] = [#false()] [#eq(::(@x_1, @x_2), nil())] = [0] >= [0] = [#false()] [#eq(::(@x_1, @x_2), ::(@y_1, @y_2))] = [0] >= [0] = [#and(#eq(@x_1, @y_1), #eq(@x_2, @y_2))] [#eq(#0(), #pos(@y))] = [0] >= [0] = [#false()] [#eq(#0(), #0())] = [0] >= [0] = [#true()] [#eq(#0(), #neg(@y))] = [0] >= [0] = [#false()] [#eq(#0(), #s(@y))] = [0] >= [0] = [#false()] [#eq(#neg(@x), #pos(@y))] = [0] >= [0] = [#false()] [#eq(#neg(@x), #0())] = [0] >= [0] = [#false()] [#eq(#neg(@x), #neg(@y))] = [0] >= [0] = [#eq(@x, @y)] [#eq(#s(@x), #0())] = [0] >= [0] = [#false()] [#eq(#s(@x), #s(@y))] = [0] >= [0] = [#eq(@x, @y)] [#and(#true(), #true())] = [0] >= [0] = [#true()] [#and(#true(), #false())] = [0] >= [0] = [#false()] [#and(#false(), #true())] = [0] >= [0] = [#false()] [#and(#false(), #false())] = [0] >= [0] = [#false()] [dfs#1^#(::(@t, @ts), @x)] = [1] @t + [1] @ts + [0] >= [1] @t + [1] @ts + [0] = [c_6(dfs#2^#(@t, @t, @ts, @x))] [dfs#2^#(leaf(), @t, @ts, @x)] = [1] @ts + [5] > [1] @ts + [4] = [c_7(dfs^#(@ts, @x))] [dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x)] = [1] @a + [1] @ts + [1] @t1 + [1] @t2 + [4] >= [1] @ts + [1] @t1 + [1] @t2 + [4] = [c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x))] [dfs^#(@queue, @x)] = [1] @queue + [4] > [1] @queue + [1] = [c_11(dfs#1^#(@queue, @x))] [dfs#3^#(#false(), @t, @t1, @t2, @ts, @x)] = [1] @ts + [1] @t1 + [1] @t2 + [4] >= [1] @ts + [1] @t1 + [1] @t2 + [4] = [c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x))] We return to the main proof. Consider the set of all dependency pairs : { 1: dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , 2: dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , 3: dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , 4: dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , 5: dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Processor 'matrix interpretation of dimension 1' induces the complexity certificate YES(?,O(n^1)) on application of dependency pairs {2,3}. These cover all (indirect) predecessors of dependency pairs {1,2,3,4,5}, their number of application is equally bounded. The dependency pairs are shifted into the weak component. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Weak DPs: { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() } Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) The following weak DPs constitute a sub-graph of the DG that is closed under successors. The DPs are removed. { dfs#1^#(::(@t, @ts), @x) -> c_6(dfs#2^#(@t, @t, @ts, @x)) , dfs#2^#(leaf(), @t, @ts, @x) -> c_7(dfs^#(@ts, @x)) , dfs#2^#(node(@a, @t1, @t2), @t, @ts, @x) -> c_8(dfs#3^#(#equal(@a, @x), @t, @t1, @t2, @ts, @x)) , dfs^#(@queue, @x) -> c_11(dfs#1^#(@queue, @x)) , dfs#3^#(#false(), @t, @t1, @t2, @ts, @x) -> c_19(dfs^#(::(@t1, ::(@t2, @ts)), @x)) } We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Weak Trs: { #equal(@x, @y) -> #eq(@x, @y) , #eq(leaf(), leaf()) -> #true() , #eq(leaf(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(leaf(), nil()) -> #false() , #eq(leaf(), ::(@y_1, @y_2)) -> #false() , #eq(#pos(@x), #pos(@y)) -> #eq(@x, @y) , #eq(#pos(@x), #0()) -> #false() , #eq(#pos(@x), #neg(@y)) -> #false() , #eq(node(@x_1, @x_2, @x_3), leaf()) -> #false() , #eq(node(@x_1, @x_2, @x_3), node(@y_1, @y_2, @y_3)) -> #and(#eq(@x_1, @y_1), #and(#eq(@x_2, @y_2), #eq(@x_3, @y_3))) , #eq(node(@x_1, @x_2, @x_3), nil()) -> #false() , #eq(node(@x_1, @x_2, @x_3), ::(@y_1, @y_2)) -> #false() , #eq(nil(), leaf()) -> #false() , #eq(nil(), node(@y_1, @y_2, @y_3)) -> #false() , #eq(nil(), nil()) -> #true() , #eq(nil(), ::(@y_1, @y_2)) -> #false() , #eq(::(@x_1, @x_2), leaf()) -> #false() , #eq(::(@x_1, @x_2), node(@y_1, @y_2, @y_3)) -> #false() , #eq(::(@x_1, @x_2), nil()) -> #false() , #eq(::(@x_1, @x_2), ::(@y_1, @y_2)) -> #and(#eq(@x_1, @y_1), #eq(@x_2, @y_2)) , #eq(#0(), #pos(@y)) -> #false() , #eq(#0(), #0()) -> #true() , #eq(#0(), #neg(@y)) -> #false() , #eq(#0(), #s(@y)) -> #false() , #eq(#neg(@x), #pos(@y)) -> #false() , #eq(#neg(@x), #0()) -> #false() , #eq(#neg(@x), #neg(@y)) -> #eq(@x, @y) , #eq(#s(@x), #0()) -> #false() , #eq(#s(@x), #s(@y)) -> #eq(@x, @y) , #and(#true(), #true()) -> #true() , #and(#true(), #false()) -> #false() , #and(#false(), #true()) -> #false() , #and(#false(), #false()) -> #false() } Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) No rule is usable, rules are removed from the input problem. We are left with following problem, upon which TcT provides the certificate YES(O(1),O(1)). Rules: Empty Obligation: innermost runtime complexity Answer: YES(O(1),O(1)) Empty rules are trivially bounded Hurray, we answered YES(O(1),O(n^2))